一直对逆向很有兴趣,但没能实操过,这次在爱破上看到了一个小白教程,就跟着实操了一遍,并在实操的过程中弄明白了一些教程中并未提到的点,受益匪浅,在此记录。
准备工具
x64dbg
微信3.9.10.27 (不同版本的具体操作存在一定区别,但大致思路相同)
参考
https://www.52pojie.cn/thread-1951224-1-1.html
具体过程
1. 找到一个切入点
参考博客中,博主先调查出Windows下微信实现多开限制的方式——调用Windows的CreateMutex api来构建一个互斥体,之后便是通过追踪CreateMutex函数来打下第一个断点。
2.在x64dbg中打开微信
-
打开微信,不用登陆
-
打开xdbg64, 附加微信
3.先搜索wechat 选择 “附加”
附加后,x64dbg就可以对微信进行调试
4.重新打开微信,无需登陆。这一步是为了使得之后x64dbg所操作的微信会进入多开限制相关的代码段中
5.选择断点页面, 删除所有默认断点
6.选择cpu页面 CTRL + G 跳转搜索函数CreateMutex,有四个结果
7.一个一个选择,并跳转到对应位置后,发现来源于同一处,都打一个断点
8.先点击循环箭头重启调试微信
9.多次点击运行或者按快捷键F9,直到到达我们设定断点处。(之所以按多次,是因为在运行过程中,会自动创建一些断点)
到达设定的断点处
可以看到,是直接停在第四个红点处,这意味着微信调用的是CreateMutexW接口,而没有用另外三个。
10.接下来开始按F8, 一步一步执行程序,直到出现多开限制导致的现象——即第4步中打开的微信窗口被唤起
执行到图中标记的这一句时(该行右侧的“打开窗口”为我自己注释所得,并非原来就有),右边的微信窗口自动唤起,此时我们就能确定多开限制相关的代码段的大致范围,从 CreateMutexW 所在的代码行,到窗口被唤起时,所执行到的代码行。
11.接下来要收缩代码范围,根据模块进行收缩
窗口的左上角会显示模块的名称,如微信窗口被唤起时,所在的模块为wechatwin.dll
而根据之前的图,CreateMutex断点所在模块为kernel32.dll, 在执行过程中,还加载过名为ntdll.dll等的其他模块,kernel32.dll与ntdll.dll模块等是系统模块(判断的方式请见第15步),不应该进行修改,否则可能会影响到其他软件甚至系统的使用,而wechatwin.dll是只有微信用的模块(判断的方式请见第15步),修改时无需担心影响到其他软件。因此我们需要重新执行一次8、9、10步,实时观察所在模块,找到第一次进入到wechatwin.dll是在哪一行,给该行加入注释,如下图
可以看到,我们将范围缩短到了32行。
12.接下来就按F8逐步执行这个范围里的语句,并打注释记录条件跳转语句(je与jne)是否进行了跳转,如图,其中,“有不跳”意味着:在已经有一个微信窗口的情况下,该语句不会进行跳转
13.关闭第4步中打开的微信窗口,则之后x64dbg所启动的微信就不会进入导致多开限制相关的代码段,重新测试第9步范围内的条件跳转语句,并进行标注。其中,“无不跳”意为:“在无其他微信窗口的情况下,该语句不会进行跳转”,“无跳”意为:“在无其他微信窗口的情况下,该语句会进行跳转”
在第二个条件跳转语句,“已有微信窗口”与“无其他微信窗口”的行为就有了区分;但无法排除剩下两个跳转语句会产生影响的可能性,因此对剩下的两个跳转语句打上断点,不断按“F9”,观察在微信窗口出现之前,这两个断点是否会激活。
在该过程中,断点并未激活,因此可以排除剩下两个条件跳转语句对结果会起影响的可能性。
14.修改跳转条件,将jne修改为jmp
15.构建补丁
点击修补文件后,弹出的文件管理器所在的路径即为当前模块所在的路径,可以根据该路径判断模块是系统模块还是单个应用的模块。将文件名设置为 模块名+New.dll,进行保存。
16.备份源文件,启用补丁
打开文件管理器,进入文件保存路径,将原来的模块(即WeChatWin.dll)命名为WeChatWin.dll.bak, 用于出问题时软件恢复,再将我们保存的文件(即WeChatWinNew.dll)命名为WeChatWin.dll。
17.重启微信,可以进行多开,预期目标完成