前言
之前写了个视频号下载的工具,原理其实就是开启代理监听视频的链接。
但是使用的监听工具是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