基于IDA Pro和Frida的微信消息撤回无效实验
前言
刚好在晚上刷视频的时候看到了老师的一个分析视频,于是想着来复现一波学习,也学到了很多东西,非常感谢老师。
首先,本次的分析对象是wechat.dll也就是动态链接库。
可以看到ida打开来有很多的函数。
那么首先的任务就是要找到与撤回相关的函数,那么这么多函数我们要怎么去找呢?可以想到,我们撤回消息的话肯定和字符串有关系的。
所以我们这里shift+12
可以看到String就被集合到一起了,然后和撤回有关的英文单词就是revoke
我们就搜索到这么多的字符,可以看到最上面那个有个叫做
这个的东西,我们就可以用frida来动态调试是否是这个地方对撤回做了操作,这里写一个脚本来找一下Wechat的根地址在哪里,也就是VAM,虚拟内存地址了
import frida
def main(target_process):
session = frida.attach(target_process) #获取进程
# javascript注入逻辑
script = session.create_script("""
//WeChat的虚拟根地址
const baseAddr = Module.findBaseAddress('WeChatWin.dll'); console.log('根地址:'+baseAddr);
""")
script.load()
print("ok")
if __name__ == '__main__':
target_process = 'WeChat.exe'
main(target_process)
所以我们知道了虚拟内存的地址,当然我们现在就是需要去转化一下去获得他的实际地址.
这里我们先获取一下ida中他的起始地址
然后我们可以根据这个来找到他的真实地址,然后这里就需要写个脚本来确定他是否是这个地址
import sys
import frida
def main(target_process):
session = frida.attach(target_process) #获取进程
# javascript注入逻辑
script = session.create_script("""
const baseAddr = Module.findBaseAddress('WeChatWin.dll');
console.log('根地址:'+baseAddr);
// 虚拟地址转化为实际地址
const revokeMsgFunAddr = resolveAddress('0x1823CD710'); console.log('转化后的地址为:'+revokeMsgFunAddr);
Interceptor.attach(revokeMsgFunAddr,{
//进入地址回调函数
onEnter(args){ console.log("test!"); } }); function resolveAddress(addr) {
const idaBase = ptr('0x180000000'); //这里是ida的起始地址
const offset = ptr(addr).sub(idaBase); const result = baseAddr.add(offset); return result; } """)
script.load()
print("ok")
sys.stdin.read()
if __name__ == '__main__':
target_process = 8112
main(target_process)
如果是的话那么就会返回test,所以我们就可以一个个往下面找
最后找到了一个叫做
这个的地址,也就是说明我们的撤回和这个函数有关,于是我们跟进
主要看到这个函数
这里有个叫做的东西,我们这里就可以看到
"Update rv msg : %d",
这个,里面包含了msg,所以我们就可以跟进去看
我们可以尝试在这个call的地方进行注入,因为call的话就是做了一个执行的操作对吧。
const revokeMsgFunAddr = resolveAddress('0x1826D9B90');
然后正常也是可以test的
但是因为判断太多了所以就不选择改掉这里的代码
所以我们往上面找是哪里调用了这个函数
这里可以看到判断
可以看到这里是只要v9不是4就不会调用那个函数了
最终exp
import sys
import frida
def main(target_process):
session = frida.attach(target_process) #获取进程
# javascript注入逻辑
script = session.create_script("""
const baseAddr = Module.findBaseAddress('WeChatWin.dll');
console.log('根地址:'+baseAddr);
// 虚拟地址转化为实际地址
const revokeMsgFunAddr = resolveAddress('0x1823E5B8A'); console.log('转化后的地址为:'+revokeMsgFunAddr);
Interceptor.attach(revokeMsgFunAddr,{
//进入地址回调函数
onEnter(args){ this.context.rdi = 0; console.log("test!"); } }); function resolveAddress(addr) {
const idaBase = ptr('0x180000000'); //这里是ida的起始地址
const offset = ptr(addr).sub(idaBase); const result = baseAddr.add(offset); return result; } """)
script.load()
print("ok")
sys.stdin.read()
if __name__ == '__main__':
target_process = 8112
main(target_process)
发送
撤回
还是存在,说明成功!
0 条评论
可输入 255 字