aardio封装库) sunny抓包工具的使用

前言

之前写了个视频号下载的工具,原理其实就是开启代理监听视频的链接。

但是使用的监听工具是fidllecore,这个是2016年的产物,一直没有更新,会出现使用的内存一直暴涨,所以打算使用sunny来替换它。

这篇文章发一下我封装sunny的aardio库,你可以下载下来照着使用例子直接用,就不用自己封装了。

sunny

这类似于Python的mitmproxy,可以自定义脚本修改监听到的数据。相比于mitmproxy优点更多,比如:

  • 支持更多的数据类型,比如tcp、udp和websockets等,
  • 可以不使用代理使用驱动来监听某个进程的数据
  • 封装成了dll,任何语言都可以很方便的调用它

官方地址: https://esunny.vip/

github开源地址: https://github.com/qtgolang/SunnyNet

aardio封装

官网给了很多语言的使用例子,其中就有Python和C++的,根据这两个例子,我把它封装到aardio里使用。

其实有人已经写了sunny的aardio封装库: https://blog.csdn.net/sdlgq/article/details/123139621,能使用但没有给出具体的代码。所以还是自己来封装一下

定义导出函数

在Python中定义函数正常是这样写的:

from ctypes import *
dll = CDLL("./Sunny.dll")
导出函数 = dll.导出函数
导出函数.argtypes = (参数1类型,参数2类型)
导出函数.restype = 返回值类型

然后在aardio中定义dll导出函数

DLL = raw.loadDll("Sunny.dll", ,"cdecl");
导出函数 = Dll.api("导出函数","返回值类型(参数1类型,参数2类型)");

定义回调函数

Python:

TcpCallback = CFUNCTYPE(None, c_int64, c_char_p, c_char_p, c_int64, c_int64, c_int64, c_int64, c_int64, c_int64)
回调函数 = TcpCallback(函数)

aardio:

回调函数 = thread.tostdcall(函数,"void(int,int,int,int,str,str,str,int)")

注意事项

  • sunny的回调函数是线程函数,需要使用thread.tostdcall(),而不是raw.tostdcall()
  • sunny.dll不支持内存加载,也就是无法使用$内嵌到exe
  • 想在回调函数里操作界面,可以在tostdcall的第三个参数指定mainForm,然后回调函数里的owner就是mainForm对象
  • 驱动加载不支持win7,可以判断下系统版本,win7使用全局代理来监听

使用案例

先定义回调函数:

// 线程函数
defaultHttpCallback = function(SunnyContext, requestId, messageId, messageType, method, url, err, pid){
    // 注意需先导入sunny初始化dll对象
 import sunny;
 import sunny.request;
 import sunny.response;
 
 var req = sunny.request(messageId);
 var resp = sunny.response(messageId);
 
 io.print(SunnyContext, requestId, messageId, messageType, method, url, err, pid)
 select(messageType) {
  
  case 1 {// 发起请求
      // 如果链接包含.js,就删除压缩头
   if(string.find(url, "@.js")){
       // 删除压缩标记,不删除的话处理比较麻烦
       req.DelRequestHeader("Accept-Encoding");
      }
      var bodyLen = req.GetRequestBodyLen();
      if(bodyLen){
          var body = req.GetRequestBody();
          if(body) io.print(body);
      }
      // 如果调用了SetResponseHeader,则请求不会发送并立即返回给客户端
   // req.SetResponseHeader("Connection", "Close");
   // req.SetResponseHeader("Access-Control-Allow-Origin", "*");
   // req.SetResponseHeader("Access-Control-Allow-Headers", "*");
   // req.SetResponseHeader("Access-Control-Allow-Methods", "OPTIONS,POST,GET");
  }
  case 2 {// 请求完成
   var bodyLen = resp.GetResponseBodyLen();
   if(bodyLen){
       var body = resp.GetResponseBody();
       var regex = "(s+)";
       var replaceStr = " "
       var newBody = string.replace(body, regex, replaceStr);
       resp.SetResponseData(newBody, #newBody);
   }
   
  }
  case 3 {// 请求失败
  }
 }
}

启动sunny服务:

var port = 48721;
var sunnyObj = sunny(port);
// 指定http的线程回调函数
sunnyObj.HttpCallback = defaultHttpCallback;
// 指定回调函数的owner对象,可以在回调函数里通过owner使用该对象
sunnyObj.callbackOwner = mainForm;
// 启动sunny监听服务并加载驱动监听processName的数据
var processName = "WeChatAppEx.exe"
if(!sunnyObj.start(processName)){
 win.msgbox("sunny启动失败");
}else{
 io.print("启动成功");
}

dll路径

我加载的时候写的路径是:

::SunnyDLL = ..raw.loadDll("Sunny.dll", ,"cdecl");

所以得把dll放到和exe同级目录下,如果是开发环境则放到main.aardio同级目录,你也可以按你的喜好修改这个路径,然后把dll放到相应的位置

其他

注释和自动补全我还没研究明白,后面在加上

代码地址

https://github.com/kanadeblisst00/aardio-sunny


原文始发于微信公众号(Python成长路):aardio封装库) sunny抓包工具的使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/283098.html

(0)
python学霸的头像python学霸bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!