软件逆向之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的插件功能是其强大之处之一。根据您的需求,选择合适的插件可以提升您的逆向分析效率和准确性。

 

[下载]

https://hex-rays.com/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

 

posted @ 2024-08-15 09:40  X-Wolf  阅读(74)  评论(0编辑  收藏  举报