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 eax
call 函数
add esp,0x4 // 平衡堆栈
我修改 call 直接 jmp 到下一个命令,发现消息并没有撤回,但是点击继续运行,消息撤回了!
这说明:这个函数是必经之路,但是不是最重要的,撤回的函数应该在其后面。
然后我傻乎乎的跟进函数,发现进入的一个循环。姑且认为是个消息循环,总之没跟随到。
再换一个思路…
之前断下的函数传入了一个参数 [arg.1],保存再eax,eax呢又压入了堆栈让即将调用的函数使用,那么问题来了,[arg.1]就是我们看到的堆栈esp中的一些参数
wxid_0h3n1axxxxxxxx 佛系打码
1701xxxxx 佛系打码
79069xxxxxxxxx 佛系打码
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的版本,有兴趣的小伙伴可以跟我一起研究。
“本文只用于技术交流,法律边界不可触碰”