前言
圣诞节到了,祝大家圣诞节快乐。为了防止有些朋友,相信圣诞老人会送一个女朋友给自己,跑去给喜欢的人发一大堆消息,女神发了一句消息又撤回,再发了一句:我们不合适。为了防止你发的一堆消息不能撤回,不能查看女神撤回的消息,请试试撤回和防撤回功能
往期推荐
微信防撤回功能
原文地址:https://blog.csdn.net/m0_74786138/article/details/144430253
查看微信版本选择插件
插件
https://pan.quark.cn/s/d25033d81608
先查看一下微信的版本:微信左下角-->三个杠-->设置-->关于微信
比如我这里是3.9.12.15版本
进行WeChatWin.dll替换
下载对应版本之后,将插件名字改为WeChatWin.dll,删掉前面的版本号
在微信所在的文件夹下,找到这个同名插件,用下载的插件替换它即可
效果演示
替换之后需要重启微信才可以,效果如下
可以看到即使撤回了也能看见撤回的内容
hook 微信信息撤回功能
原文地址:https://bbs.kanxue.com/thread-282005.htm
PC端
PC端的话,那位老师已经演示的很清楚了,我这里就简单的复述一遍,感兴趣的可以看一下视频
在windows中,微信的核心功能都是在WeChatwin.dll里实现的,消息撤回功能也不例外
首先我们使用ida分析,通过字符串进行定位,试试相关的字符,如:撤回、revoke、withdrawn等等关键字进行定位
逐一hook这些使用到字符串的函数,然后点击微信的撤回,如果有log输出,就表示是关键函数,从而进行定位
测试脚本如下,首先我们获取了dll的加载地址,然后通过ida查看到函数的偏移地址,将dll地址加上该偏移地址,即可得到内存中该函数的地址。
那么如何确定哪一个才是撤回相关函数?
就是靠尝试,使用到msg相关字符串的函数我们全部都hook一遍,然后触发撤回功能,如果打印出来revokeMsg,则表示hook成功
import frida,sys# 创建脚本jsCode="""//写入js脚本 就和之前一样//下面的代码获取dll的加载地址const baseAddr=Module.findBaseAddress('WeChatWin.dll');console.log("baseAddr:"+baseAddr);//每次需要修改的只有这里const revokeMsgFunAddr=getRealAddr('0x1823CD710');console.log("function addr:",revokeMsgFunAddr);//根据地址进行frida注入Interceptor.attach(revokeMsgFunAddr,{//一旦进入hook的函数,该回调函数就会被调用 onEnter(args){ console.log("-----revokeMsg------") }});//dll地址加上偏移地址,定位到这个函数function getRealAddr(addr){ //基地址 const idaBase=ptr('0x180000000'); const offset=ptr(addr).sub(idaBase); const result=ptr(baseAddr).add(offset); return result;}"""#使用任务管理器查看微信的PID然后填入session = frida.attach(7876)# 运行脚本script = session.create_script(jsCode)script.load()print("Successfully attached!!!!")# 防止运行完进程直接退出sys.stdin.read()
运行测设脚本
当我们测试到字符串SyncMgr::ProcessRevokeMsg所在的函数时,有了revokeMsg的回显
函数逻辑比较复杂,hook点也是比较难找
但是我们知道每次撤回信息,这个函数都要被调用,我们直接查看他的交叉引用,发现这个函数在一个switch语句里被调用
我们只需要让这个不为4,这里就不会被执行
edi为4的时候就会执行撤回相关的函数,修改思路就是当程序运行到这里时修改edi寄存器的值
Interceptor.attach(revokeMsgFunAddr,{//一旦进入hook的函数,该回调函数就会被调用 onEnter(args){ console.log("-----revokeMsg------") console.log(this.context.rdi); this.context.rdi=0; }});
最终实现的效果:
PC端显示
移动端 消息1 已经被撤回
Android端
大致思路也是向PC端演示的那样,但是因为没有参考的教程,所以走了不少弯路
还是直接搜索字符串进行定位,考虑到PC端那里是revoke关键字,所以也是直接搜索revoke
其实也不用逐个尝试,因为有几个特别明显的,hook这几个特别明显的方法测试就行
直接右键方法名选择复制为frida片段即可,最终是定位到了这个RevokeMsgEvent方法,每当我们撤回信息,都会打印 RevokeMsgEvent.$init is called
Java.perform(function(){ console.log("==========begain==========")let RevokeMsgEvent = Java.use("com.tencent.mm.autogen.events.RevokeMsgEvent"); RevokeMsgEvent["$init"].implementation = function () { console.log(`RevokeMsgEvent.$init is called`); this["$init"](); };});
这个方法其实没啥有价值的东西,尝试了直接置空这个方法,也就是将上面的 this["$init"]();
直接删除,并没有起到什么效果
然后就是查看了这个方法的交叉引用
整个程序只有这一出引用,微信应该做了一些混淆,名字都奇奇怪怪的,可读性很差,一时见不知从何下手。首先尝试了修改RevokeMsgEvent的赋值,它将 变量赋值为falsethis.f153351e = false;
,我尝试了一下将该变量赋值为true,注意没有f153351e,这是jadx帮它命名的,实际的变量名是e
Java.choose("com.tencent.mm.autogen.events.RevokeMsgEvent",{//遍历内存中的所有对象 onMatch:function(obj){ obj.e.value=true; console.log("value : ",obj.e.value); },onComplete:function(){ console.log("内存对象搜索完毕") } })
修改成功,但是信息还是被撤回。
这条路行不通就考虑另外的方案,hook掉调用这个方法的方法,和pc端相同的操作
该方法是被s类下的h方法所调用的,复制h方法的frida片段进行hook
let s = Java.use("tj0.s");s["h"].implementation = function (str, j15, n0Var, str2, str3, str4) { console.log(`s.h is called: str=${str}, j15=${j15}, n0Var=${n0Var}, str2=${str2}, str3=${str3}, str4=${str4}`); this["h"](str, j15, n0Var, str2, str3, str4);};
报错,提示没有找到tj0.s这个类,于是我想这个类可能不是被默认的类加载器所加载的,遍历一下所有的类加载器然后再hook
functionmain() { Java.perform(function () { Java.enumerateClassLoaders({ onMatch: function (loader) { try { var factory = Java.ClassFactory.get(loader); var s = factory.use("tj0.s"); s["h"].implementation = function (str, j15, n0Var, str2, str3, str4) { console.log(`s.h is called: str=${str}, j15=${j15}, n0Var=${n0Var}, str2=${str2}, str3=${str3}, str4=${str4}`); this["h"](str, j15, n0Var, str2, str3, str4); }; } catch (e) { console.log("Error accessing class or method: " + e); } }, onComplete: function () {} }); });}
结果遍历了所有的类加载器也没有这个类
而且我使用objection打印加载的类也没有这个tj0.s
最后想到了打印方法的调用堆栈
Java.perform(function(){ console.log("==========begain==========")let RevokeMsgEvent = Java.use("com.tencent.mm.autogen.events.RevokeMsgEvent"); //hook构造方法 RevokeMsgEvent["$init"].implementation = function () { console.log(`RevokeMsgEvent.$init is called`); showStacks(); this["$init"](); };functionshowStacks(){ console.log( Java.use("android.util.Log") //首先找到log类 .getStackTraceString( //调用log类的该方法 Java.use("java.lang.Throwable").$new() //new一个对象 ) ) }});
通过函数的调用堆栈,发现RevokeMsgEvent是被ij0.s.i方法调用的,我们直接将这个方法置空
var sClass=Java.use("ij0.s"); sClass.i.implementation=function(){ console.log("======================"); };
最终实现的效果,左边是pc显示的,右边是手机显示的
Xposed实现hook的持久化
使用xposed将上面的代码重写一下即可,frida逻辑如下
Java.perform(function(){ var sClass=Java.use("ij0.s"); sClass.i.implementation=function(){ console.log("======================"); };});
xposed代码
import frida,sys# 创建脚本jsCode="""//写入js脚本 就和之前一样//下面的代码获取dll的加载地址const baseAddr=Module.findBaseAddress('WeChatWin.dll');console.log("baseAddr:"+baseAddr);//每次需要修改的只有这里const revokeMsgFunAddr=getRealAddr('0x1823CD710');console.log("function addr:",revokeMsgFunAddr);//根据地址进行frida注入Interceptor.attach(revokeMsgFunAddr,{//一旦进入hook的函数,该回调函数就会被调用 onEnter(args){ console.log("-----revokeMsg------") }});//dll地址加上偏移地址,定位到这个函数function getRealAddr(addr){ //基地址 const idaBase=ptr('0x180000000'); const offset=ptr(addr).sub(idaBase); const result=ptr(baseAddr).add(offset); return result;}"""#使用任务管理器查看微信的PID然后填入session = frida.attach(7876)# 运行脚本script = session.create_script(jsCode)script.load()print("Successfully attached!!!!")# 防止运行完进程直接退出sys.stdin.read()
0
这个xposed等价的应该是没什么问题的,但是就是hook不上这个i方法,也尝试了使用算法助手,都是以失败告终
后续如果找到解决方案我会进行更新。。。。。。。大哥们如果知道什么问题的话麻烦在评论区指点指点 >_<
小结:
写hook代码很简单,难的是分析的过程,如果定位到了关键代码,只需要短短几行代码就能成功hook。
适合想走红队和渗透方向的师傅,国际最知名的网络安全证书之一,含金量比国内的高了不少。如果和我一样学历不太好的师傅,凭借这个可以抹平211的学历差距,感兴趣的师傅可以扫描加我微信,保证全网最低价oscp+的培训,而且是7年红队经验,红队队长带领培训目前费用全网最低,只需4000,提供学生证明可再减500。目前可以分期付款,一三五oscp教学,二四指导靶机复现,周六周天休息,培训时间6个月左右,最终会打200个靶机左右,只要完全掌握课程知识+靶场,可以有%80的通过率,感兴趣的师傅可以加我好友咨询
可以关注一下关注公众号,里面有大量的工具和课程免费提供
可以加入一下我们的帮会,是真正的红队大佬创建的,里面会定时丢些网上没有的工具(比如安卓远控7.4,不过现在已经删除了,有时限,加入的记得看好时间),除了这个:还有大量的poc、渗透工具、渗透课程、实战案例等等。现在只要99就可以终身,后面人多了就会涨价了
帮会最近上传大量了资料,已经加入帮会的,可以留意保存。没有加入帮会的,如果里面有自己喜欢的资料,可以通过我的公众号扫码加入
我们红队全栈公益课链接:https://space.bilibili.com/350329294
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...