【问题标题】:x86 or x64 disassembler libx86 或 x64 反汇编程序库
【发布时间】:2011-01-22 16:06:04
【问题描述】:

我知道一些反汇编库,但我正在寻找的是具有类似以下 API 的库:

void * findAddrOfFirstInstructionStartingFrom( void * startAddress , InstructionType instruction);

void* addr = findAddrOfFirstInstructionStartingFrom(startAddress , JMP);

和其他 apis 微笑的人喜欢搜索特定的东西,而不是反汇编从地址中说明的所有指令并获取各种信息,因为如果你只想找到特定的东西而不是所有东西,它会很慢。

如果您知道任何请告诉我,如果没有请告诉我一个开源且易于修改的。

【问题讨论】:

    标签: c++ c assembly disassembly


    【解决方案1】:

    您没有标记或告知处理器架构,因此您不太可能得到真正的答案。

    通常本机代码指令的长度取决于它们所采用的操作数,因此您必须在搜索之前反汇编它。否则,您只会找到与您搜索的指令模式匹配的第一个字节序列。它很可能不是一条真正的指令,而是前一条指令的操作数的一部分。

    编辑:由于您更新了标题,我可以想到选择 BorgPEDasm 是开源的。如果你放弃那个开源的东西,那么绝对是 IDA pro。

    【讨论】:

    • 当我说 void * findAddrOfFirstInstructionStartingFrom( void * startAddress , InstructionType 指令); void* addr = findAddrOfFirstInstructionStartingFrom(startAddress , JMP);我的意思不是搜索与指令匹配的第一个字节序列,我的意思是反汇编从该地址开始的所有指令,但不要为每条指令生成复杂的信息结构,只需继续查找每条指令,直到找到搜索到的指令,并且可能会为该指令生成像 jmp addr 这样的信息。
    • 拆解也有其他困难。考虑一下我添加的两个链接。
    【解决方案2】:

    我不知道有任何 API 可以做到这一点,但可以使用一些命令行脚本来完成:

    objdump -d --start-address address file | grep -m 1 instruction | cut -d : -f 1
    

    因此,例如,要在文件 a.out 中查找从地址 0x08048664 开始的第一条 JMP 指令,您可以这样做:

    $ objdump -d --start-address 0x08048664 a.out | grep -m 1 jmp | cut -d : -f 1
     8048675
    

    【讨论】:

    • 有beaEnginebeaengine.org/…,但只支持反汇编起始地址的所有指令,支持傻瓜信息。
    【解决方案3】:

    您可能想要的不仅仅是一个库,而是一些反汇编框架。看看 IDA-Pro,它还提供了一个通用的脚本接口(和一个反汇编 API)

    【讨论】:

    • 我正在寻找免费或开源的东西,但我找不到任何关于 IDA 反汇编 API 的信息
    • @neo_x3m:我知道没有 IDA 的 OSS 对应物——是的,拥有这样的 OSS 会很棒。无论如何,这里是关于编写脚本和扩展 IDA 的:hex-rays.com/idapro/idaclike.htmhex-rays.com/idapro/idaplugin.htm——现在最好的可能是 @Job 所说的。顺便说一句:任何这样的 API 都不能使用 C 指针来处理反汇编二进制文件中的地址部分。它将使用 off_t 和其他非指针类型,因为显而易见的事实是,C 指针是非常抽象的对象,如果转换为整数,它们的值可以是任何值,只要指针算术是守恒的。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2011-02-19
    相关资源
    最近更新 更多