wx小程序寻找偏移值学习

Posted

序言

由于微信小程序经常更新,每次偏移都不知道怎么寻找,想要调试小程序有很难受,没有对应版本的偏移,导致不能hook。因此特意学习了一下怎么寻找不同版本的偏移。

在这里还得非常感谢各位大佬的开源工具,以及寻找偏移值方法

https://github.com/evi0s/WMPFDebugger/blob/main/ADAPTATION.md

https://blog.csdn.net/m0_75268677/article/details/154535218

由于我一点都不懂逆向,这里还要非常感谢我的逆向大哥 霍雅师傅

下面是他的博客地址,实力超强

https://huoya.work/bk/

接下来,我们就开始寻找偏移了,这里以小程序版本19481为例

寻找CDPFilterHookOffset的偏移值方法

先随机打开一个小程序,然后再windows资源管理器中寻找加载这个小程序的进程

image-20260416233154946

打开WeChatAppEx文件所在路径

image-20260416233820799

然后,使用IDA加载flue.dll,这里需要加载很久很久,慢慢等待

我们看下面的操作

内存最大的,即为打开小程序的进程,定位到详细信息,找到pid

image-20260416233257579

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

image-20260416233526683

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

image-20260416233609769

image-20260416234419955

找到flue.dll,然后右键复制基址

flue.dll的基址为0x00007FFB58E70000

双击flue.dll进入

image-20260416233956575

右键—>搜索—>当前模块—>字符串

等待加载完

搜索SendToClientFilter

image-20260416234544697

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

image-20260416234715987

复制该指令的地址

image-20260416234907497

得到该指令的地址为0x00007FFB5BB5B3EF

计算该指令的偏移地址

偏移地址 = 地址 - 基地址 = 0x00007FFB5BB5B3EF - 0x00007FFB58E70000

image-20260416235159575

得到偏移地址为0x2CEB3EF

IDA加载完flue.dll文件之后,拿到默认基址

image-20260417003949437

image-20260417004012176

得到默认的基地址0x180000000

在IDA中寻找指令的地址

指令的地址 = IDA默认的基址 + 指令的偏移地址 = 0x180000000 + 0x2CEB3EF

在IDA的汇编窗口中,输入g,得到一个跳转地址的窗口,里面输入0x180000000 + 0x2CEB3EF

image-20260417004405569

image-20260417004428025

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

image-20260417004552820

然后第一个函数就是CDPFilterHookOffset,我们就是要hook这个目标函数

接着计算出该函数的偏移值,该函数的地址就是函数体名称后半部分,0x183023420

偏移值 = 地址 - 基址 = 0x183023420 - 0x180000000

image-20260417004957087

得到CDPFilterHookOffset的偏移地址为0x3023420

LoadStartHookOffset偏移值寻找方法

一样的,在flue.dll模块下搜索OnLoadStart

image-20260416235520558

这里一个一个点击进入查看,直接观察到发现下面这一行指令,并且后面有着这个路径特征

lea rdx,qword ptr ds:[7FFB63FA54A3]     | 00007FFB63FA54A3:"..\\..\\flue\\browser\\applet\\applet_index_container.cc"

image-20260416235712857

image-20260417000005039

复制该地址

得到该地址为0x00007FFB5B42BABE

然后计算该偏移地址

偏移地址 = 地址 - 基地址 = 0x00007FFB5B42BABE - 0x00007FFB58E70000

image-20260417000130119

得到该偏移地址为0x25BBABE

同样的,IDA加载完flue.dll文件之后,拿到默认基址0x180000000

在IDA中寻找指令的地址

指令的地址 = IDA默认的基址 + 指令的偏移地址 = 0x180000000 + 0x25BBABE

在IDA的汇编窗口中,输入g,得到一个跳转地址的窗口,里面输入0x180000000 + 0x25BBABE

image-20260417005429496

image-20260417005444199

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

image-20260417005841007

该函数即为LoadStartHookOffset的函数,地址为0x1825BBA80

最后计算出LoadStartHookOffset的偏移地址

偏移地址 = 地址 - 基址 = 0x1825BBA80 - 0x180000000

image-20260417010035235

得到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;

image-20260417010848956

你会找到神奇的数字,这是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;

image-20260417011229986

这个数字和就是我们需要的场景偏移剩余部分1312,456

"SceneOffsets": [1376, 1312, 456]

到此,结构体的SceneOffsets就寻找完毕了!