原理就是HOOK,拦截注入,获取内部数据,执行内部代码。
工具准备,OD,CE ,微信最新版本。
目标: 找到二维码的HOOK点,也就是二维码的写入点。找到写入点后,找到内存的偏移点。
具体步骤:
打开微信登录:
二维码就是一张图片,要么是JPG,要么是PNG一般是这两种。但是这两种图片都有相应的特征码字符,打开一张任意的PNG都会有“IHDR“的字符串,那就很简单的搜索这个就可以。
搜索结果如下:
这个地址是启动每次都变动的,所以都会有区别,而且有可能扫描的结果个数也有可能有差别。把这些地址加入列表。做个地址偏移。
发现有些地址的数据发生了变化,但是有看到PNG的数据,因为这本身就是PNG图片不,不奇怪。这个还是二维码的地址,我们还要接着找,一般情况下,这个二维码图片是一个变量,这个变量是动态分配的内存指针,一定会有一个指针的指针,那么接着用其中一个地址接着找。
然后再打开OD,dd 内存地址寻找到,下断。
下断后,扫描二维码,然后再取消扫描。
发现断下来了,那么就是说在写入二维码的时候,触发了断点。很明显这个内存地址就是二维码的指针地址了。现在就需要看下,这个二维码是在什么时候写完的,就是我们要HOOK的点,然后确定偏移。
注意查看右边寄存器的ESI,就是指针的指针地址 的偏移变化。
刚断下的值 是不变的03D7D50C
在OD里面单步执行,一边看寄存器ESI值的变化
6A986772 E8 05ECC400 CALL WeChatWi.6B5D537C
6A603E72 E8 C997FB00 CALL WeChatWi.6B5BD640
发现这两个内存地址是极有可能发生写入的,因为ESI的值 有变化,
还有有RETURN,也就是说这个时候应该已经对图片内存已经写入过了。
ESI值的偏移值肯定为:654
发现变化的值 是在这一句,看反汇编的代码,应该是执行了一个CALL的函数后,这个地址的的值便完成了写入。
注:内存的偏移量对同一版本的软件 ,是不会变化的,这个道理非常简单,程序最终是机器码,内存与CPU的控制结果,而这个偏移的规律决定了一个软件的形态。内存的偏移就是一个软件的变量的运行变化,所以只要软件版本不变,这个规律是永远不会发生改变的。
另外由于读取内存的时候需要图片大小,一般都是变量地址+4为变量的大小地址。
这是我的二维码大小的地址。后面的VALUE值 就是图片的大小了。
另外我们需要确定一下模块的基址, 这个非常简单。
按OD的C,便可以看到模块wechatwi的模块的基址为55AA0000
我们以后面一个函数为HOOK点吧,这样更保守一点。
注:基址对于软件的同一版本是不变的。只有在版本发生改变的时候才会改变。
那么也就是说,全局变量地址是不会变的,全局函数也不会变。call函数等都不会发生地址的改变。试过关闭几次微信,发现以上的call地址一直没有变化,一直是同样的内存地址。只有微信图片地址发生了改变。现在还有一个问题,为什么偏移量是-C?
hook 地址偏移: 14B6 3E72 = 6A603E72 - 55AA0000
call地址偏移:15B1 D640 = 6B5BD640 - 55AA0000
总结:CE寻址的时候,由于我们目标是找ESI的寄存器,所以地址不可能有静态地址。
看到有静态地址的变量就可以排除