Hook技术 可能已经没啥稀奇的了,但我是最近才了解,兴趣浓厚嗷,很多人说做这个是为了赚钱
在文章开头用老师的话说 “只用于技术交流,法律边界不得触碰”
我在最近通过看视频等等也学到了很多。但从视频中学习有个缺点,就是别人已经告诉你怎么解决这个问题。比如去CE里搜索某些特征码之类的。比如下面我要讲的 “防撤回” 淡淡的宝马的教学一开始就让你搜索 revoke 这个关键字 (这是我找完CALL以后再看一些教程文章了),感觉多半还是有点运气成分在,所以我尝试通过之前学习的知识,自己解决一下这个问题。
最终效果
我们能在接收消息CALL中获取以下参数
1. 谁发给你的?
2. 发了什么?
3. 什么类型?
4. 还有一串加密的类似hash的字符串(可能是标识作用)
如果我们是程序员,我们在做撤回功能的时候肯定得给函数传入参数应该就是消息的ID吧?
那我们现在对程序内部是一无所知的,所以我想通过我们看的到的去追寻我们看不到的。
查看看得见的变化我们在wx中撤回一条消息,原信息消息,输出了一条 “某某某 撤回了一条消息”
所以在CheatEngine中搜索 “撤回”
返回了20多条结果
可以把 “Type” String Unicode 长度的大一些,这样我们就可以看到在这条记录后面跟着的很多数据。
20多条数据,测试起来很方便了,直接将他们拉下来进行进一步测试
第二步选定变量地址我们重复撤回,寻找跟随变化的变量地址,乱码的变量就可以直接删掉了,因为是个临时变量。
这样就能更加精确的缩小范围。
第三步内存断点函数在撤回消息的时候,肯定需要访问内存获取数据。
可以通过内存断点,查询堆栈中函数调用的情况
在这里我们看到了即将撤回的 消息内容,和即将输出的内容,这说明附近可能有我们要的函数地址。继续往栈底看。
有我们要撤回的消息,和消息中的那串加密字符串。找到需要的参数数据!!
我就在此函数地址下断
这说明这是撤回操作需要的函数【很可能是我们要的】
mov eax,[arg.1] // 传入参数test eax,eax...push eaxcall 函数add esp,0x4 // 平衡堆栈我修改 call 直接 jmp 到下一个命令,发现消息并没有撤回,但是点击继续运行,消息撤回了!
这说明:这个函数是必经之路,但是不是最重要的,撤回的函数应该在其后面。
然后我傻乎乎的跟进函数,发现进入的一个循环。姑且认为是个消息循环,总之没跟随到。
再换一个思路…
之前断下的函数传入了一个参数 [arg.1],保存再eax,eax呢又压入了堆栈让即将调用的函数使用,那么问题来了,[arg.1]就是我们看到的堆栈esp中的一些参数
<?xml version="1.0" encoding="utf-8"?><sysmsg type="revokemsg"> <revokemsg> <session>wxid_0h3n1axxxxxxxx</session> 佛系打码 <msgid>1701xxxxx</msgid> 佛系打码 <newmsgid>79069xxxxxxxxx</newmsgid> 佛系打码 <replacemsg><![CDATA[":)" 撤回了一条消息]]></replacemsg> </revokemsg></sysmsg> 场景模拟 VOID func1(msg,param){// win 的消息循环switch(msg){case "撤回":revokeMsg(param);break;default:break;}}// 我们当前的函数VOID revokeMsg(param){func3(param); //我们要的call}VOID func3(arg_1){// 做了一些函数}所以说调用这个函数的函数,即外层函数,所以我们要继续外层找,看堆栈里。
看到这里,这儿已经是比较外层,再往下就没有消息的参数了,而且看到了
LASS SycnMgr 我也不知道这是啥
一种猜测
Mgr:MySQLGroupReplication
Sycn:同步
MySQL Group Replication 是MySQL官方推出的一个全新的高可用与高扩展的解决方案,提供高可用、高扩展、高可靠(强一致性)。
不管Wx的意思是不是这个,这个 可能 是一个消息循环【现在只是猜测,我没有告诉大家这就是一个消息循环的特征码】
我们跟进这个CALL下断点,发现这个CALL的调用是在我们之前断点之前的(这当然是理所当然的了,因为我们是通过堆栈的栈底找到的这里)
我直接使用F8尝试步过这个函数,发现界面上的消息还是没有撤回,说明这里还不是真正我们要的入口。那么在汇编代码窗口网上寻找,找到主函数入口,并且下断点。
撤回的时候,鲤鱼自行车能够被断下。
直接修改汇编,push ebp 为 ret
暂时步去管会返回到哪里去,我们就先做个尝试,果然消息就不撤回了,并且程序也没有崩溃。
这样我们就轻松定位到了防止撤回的CALL的位置。
在回到那个 LASS SycnMgr,我是如何判断他是一个消息循环的特征字符呢?
在我们找到应该说是最外层调用的撤回函数,再外层就应该是消息循环了把???
不如动动手,追踪一下
这里大概才可以看出是个消息循环吧??
判断消息类型是啥???等等等等。。。
我使用的是最新版的 2.8的版本,有兴趣的小伙伴可以跟我一起研究。
“本文只用于技术交流,法律边界不可触碰”