软件逆向之IDA Pro
IDA Pro作为一款强大的逆向分析工具,对于软件开发和安全领域的专业人士来说是必不可少的。
1. 什么是逆向分析
逆向分析是指通过分析已有的软件或程序,推测出其内部运行机制、算法和逻辑等信息。通过逆向分析,您可以了解软件的运行逻辑,发现潜在的漏洞并进行修复,提升软件的安全性。
2. 为什么选择IDA Pro
IDA Pro是业界公认的最强大的逆向分析工具之一。它具有丰富的功能和灵活的使用方式,适用于各种软件和程序的逆向分析工作。无论您是软件开发人员、安全专家还是研究人员,IDA Pro都能满足您的需求。
3. IDA Pro的主要功能
IDA Pro提供了一系列强大的功能,帮助您进行逆向分析工作:
反汇编和调试:IDA Pro可以将二进制文件反汇编为可读的汇编代码,并提供强大的调试功能,帮助您理解程序的执行过程。
静态分析:通过IDA Pro的静态分析功能,您可以查看程序的结构、函数、变量等信息,深入理解程序的内部逻辑。
动态分析:IDA Pro还支持动态分析,您可以通过动态调试和插件来跟踪程序的运行过程,发现和修复潜在的问题。
插件支持:IDA Pro具有丰富的插件生态系统,您可以根据自己的需求选择并安装各种插件,扩展和定制IDA Pro的功能。
4. 如何使用IDA Pro进行逆向分析
使用IDA Pro进行逆向分析需要一定的技术和经验,下面是一些基本的步骤和技巧:
导入二进制文件:在IDA Pro中,您可以通过导入二进制文件的方式开始逆向分析。IDA Pro支持各种二进制文件格式,包括可执行文件、动态链接库等。
进行反汇编:一旦导入二进制文件,IDA Pro会将其反汇编为可读的汇编代码。您可以通过浏览代码、查看函数和跳转指令等方式理解程序的结构和逻辑。
符号命名和注释:在IDA Pro中,您可以对函数、变量等进行符号命名和注释,帮助理解和管理代码。合理的符号命名可以提高代码的可读性。
动态调试:如果您需要进一步了解程序的执行过程,可以使用IDA Pro的动态调试功能。通过设置断点、跟踪变量和内存,您可以逐步跟踪程序运行的过程。
插件使用:IDA Pro的插件功能是其强大之处之一。根据您的需求,选择合适的插件可以提升您的逆向分析效率和准确性。
[下载]
[使用]
快捷键:
#1. 转成字符串: 方便使用字符串Ctrl+f进行搜索 Shift + F12 #2. 汇编代码转C代码(需要双击进去这个函数, 然后使用F5, 反编译成伪代码) F5
#3. 空格
在代码与视图中进行快速切换, 代码中可以方便看到对应的地址
1) 这种就是函数的具体调用, 后面sub_xxxx就是对这个函数的引用调用
sub_1810CFE60 proc near ; CODE XREF: sub_1810E7B40+1F8↓p
示例:
1.微信中防撤回消息
1)根据使用ida pro打开WeChatWin.dll文件
2)猜测可能使用到的词汇revoke, 使用Shift+F12切换字符串展示, crtl+f5进行字符串搜索
3)hook关键函数:使用frida
import sys import frida def main(wx_process): # 链接本地设备 session = frida.attach(wx_process) # 创建需要执行的js脚本 script = session.create_script(""" // 获取WechatWin.dll映射的根地址 const baseAddr = Module.findBaseAddress('WechatWin.dll'); console.log('WechatWin.dll baseAddr: ' + baseAddr); // 撤回消息的函数地址 // const revokeMsgFuncAddr = resolveAddress('0x1810CFE60'); const revokeMsgFuncAddr = resolveAddress('0x1810E7D2A'); console.log('revokeMsgFuncAddr: ' + revokeMsgFuncAddr); // 注入 Interceptor.attach(revokeMsgFuncAddr, { // 一旦进入地址的回调函数 onEnter(args) { // 0x4 console.log('rdi: ' + this.context.rdi); // 修改地址的值 this.context.rdi = 0x0; console.log('ttttt'); } }); // 从虚拟地址转化到实际内存地址 function resolveAddress(addr) {
// 这里将加载的文件最上面的地址拿到 const idaBase = ptr('0x180000000'); const offset = ptr(addr).sub(idaBase); const result = baseAddr.add(offset); return result; } """) # 加载并持续读取内容 script.load() print("Process attached successfully.") sys.stdin.read() # 基址: 0x7ff837cc0000 if __name__ == '__main__': wx_process = 'WeChat.exe' main(wx_process)
4)找到对应的撤回的call函数进行调用修改,即可
参考:
- https://www.bilibili.com/video/BV1di421U7qD/?share_source=copy_web&vd_source=c593b03003bbf8ce00280ed8379a79a4
- http://www.yxfzedu.com/article/10778