wx小程序寻找偏移值学习
序言
由于微信小程序经常更新,每次偏移都不知道怎么寻找,想要调试小程序有很难受,没有对应版本的偏移,导致不能hook。因此特意学习了一下怎么寻找不同版本的偏移。
在这里还得非常感谢各位大佬的开源工具,以及寻找偏移值方法
https://github.com/evi0s/WMPFDebugger/blob/main/ADAPTATION.md
https://blog.csdn.net/m0_75268677/article/details/154535218
由于我一点都不懂逆向,这里还要非常感谢我的逆向大哥 霍雅师傅
下面是他的博客地址,实力超强
接下来,我们就开始寻找偏移了,这里以小程序版本19481为例
寻找CDPFilterHookOffset的偏移值方法
先随机打开一个小程序,然后再windows资源管理器中寻找加载这个小程序的进程

打开WeChatAppEx文件所在路径

然后,使用IDA加载flue.dll,这里需要加载很久很久,慢慢等待
我们看下面的操作
内存最大的,即为打开小程序的进程,定位到详细信息,找到pid

发现pid为16108,接下来使用x64dbg附加该pid的进程

双击点击进入,选择最上面的符号


找到flue.dll,然后右键复制基址
flue.dll的基址为0x00007FFB58E70000
双击flue.dll进入

右键—>搜索—>当前模块—>字符串
等待加载完
搜索SendToClientFilter

然后双击该字符串,定位到了lea rdx,qword ptr ds:[7FFB644F680C]

复制该指令的地址

得到该指令的地址为0x00007FFB5BB5B3EF
计算该指令的偏移地址
偏移地址 = 地址 - 基地址 = 0x00007FFB5BB5B3EF - 0x00007FFB58E70000

得到偏移地址为0x2CEB3EF
IDA加载完flue.dll文件之后,拿到默认基址


得到默认的基地址0x180000000
在IDA中寻找指令的地址
指令的地址 = IDA默认的基址 + 指令的偏移地址 = 0x180000000 + 0x2CEB3EF
在IDA的汇编窗口中,输入g,得到一个跳转地址的窗口,里面输入0x180000000 + 0x2CEB3EF


跳转过去之后,直接F5键,进入伪代码

然后第一个函数就是CDPFilterHookOffset,我们就是要hook这个目标函数
接着计算出该函数的偏移值,该函数的地址就是函数体名称后半部分,0x183023420
偏移值 = 地址 - 基址 = 0x183023420 - 0x180000000

得到CDPFilterHookOffset的偏移地址为0x3023420
LoadStartHookOffset偏移值寻找方法
一样的,在flue.dll模块下搜索OnLoadStart

这里一个一个点击进入查看,直接观察到发现下面这一行指令,并且后面有着这个路径特征
lea rdx,qword ptr ds:[7FFB63FA54A3] | 00007FFB63FA54A3:"..\\..\\flue\\browser\\applet\\applet_index_container.cc"


复制该地址
得到该地址为0x00007FFB5B42BABE
然后计算该偏移地址
偏移地址 = 地址 - 基地址 = 0x00007FFB5B42BABE - 0x00007FFB58E70000

得到该偏移地址为0x25BBABE
同样的,IDA加载完flue.dll文件之后,拿到默认基址0x180000000
在IDA中寻找指令的地址
指令的地址 = IDA默认的基址 + 指令的偏移地址 = 0x180000000 + 0x25BBABE
在IDA的汇编窗口中,输入g,得到一个跳转地址的窗口,里面输入0x180000000 + 0x25BBABE


F5进入查看伪代码,找到函数的首地址,即为第一个函数的地址

该函数即为LoadStartHookOffset的函数,地址为0x1825BBA80
最后计算出LoadStartHookOffset的偏移地址
偏移地址 = 地址 - 基址 = 0x1825BBA80 - 0x180000000

得到LoadStartHookOffset的偏移地址为0x25BBA80
结构体SceneOffsets寻找
回到LoadStartHookOffset寻找的这一步方法
F5进入查看伪代码,找到函数的首地址,即为第一个函数的地址
翻到这个函数的伪代码底部,你会看到类似这样的内容
if ( (_BYTE)a2 )
result = sub_182B09D80(*(_QWORD *)(*(_QWORD *)(a1 + 56) + 1376LL), *(_QWORD *)(*(_QWORD *)(a1 + 80) + 56LL));
if ( ((unsigned __int64)v19 ^ v27) != _security_cookie )
{
sub_184ADF540();
__debugbreak();
}
return result;

你会找到神奇的数字,这是SceneOffsets的第一个参数1376LL
"SceneOffsets": [1376, ?, ?]
双击并导航到包含该数字的函数sub_182B09D80
你会发现类似这样的情况
result = *(_QWORD *)(a1 + 8);
if ( *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(result + 1312) + 16LL) + 456LL) != 1101 && *(_BYTE *)(a1 + 41) != 1 )
goto LABEL_32;
v34 = 0xAAAAAAAAAAAAAAAAuLL;
v29 = 0;
v30 = 0;
v31 = 0;
memset(v33, 0, sizeof(v33));
v32 = v33;

这个数字和就是我们需要的场景偏移剩余部分1312,456
"SceneOffsets": [1376, 1312, 456]
到此,结构体的SceneOffsets就寻找完毕了!