如果我购买了 x86 32 位或 64 位软件,但没有收到源代码,并且需要修改该软件,我需要将机器代码转换回高级语言或最少的汇编代码。
有没有一个好的实用程序可以将机器代码转换为 C 语言?
我假设它会尝试识别该程序是否是使用 C 编译器编译的,而不是使用 C++ 或 Objective C 或其他编译器编译的。
谢谢。
答案1
从机器代码返回到源语言称为反编译。反汇编(从机器代码到汇编语言)可以用objdump -d
;完成。objdump
是标准 binutils 开发工具套件的一部分。虽然反编译器在这个过程中可能是一个有用的工具,但为了修改代码并重新编译代码而进行反编译很少是修改程序行为的有效方法。您将花费大量时间来获取可用的源代码,并且该源代码不会采用任何可维护的形式。
了解程序如何工作的第一步是调试工具。使用诸如strace
和 之类的工具ltrace
来查看程序进行了哪些系统调用和库调用。使用 Gdb 等调试器单步执行程序指令。
如果您非常幸运,您所寻求的行为可以通过配置文件或环境变量来实现。下一步是连接到程序并使用您自己的版本替换一些函数LD_PRELOAD
链接定义您自己的这些函数版本的库。
反编译通常有助于理解程序使用的算法,例如编写具有兼容网络协议或文件格式的另一个程序。当您的目标是修改程序的行为时,它通常不是一个非常有用的工具。
答案2
哇,一些项目!不过好吧,有一些玩具可以玩:
(使用 all 和二进制文件作为第一个参数。)
位:
xxd -b # xxd for hexdump (?): `-b` is `-bits`
八进制:
od # octal dump
十六进制:
hexdump # these two share the hexdump(1) man page
hd # symbolic link to hexdump
od -t x1 # `-t` for type, `x1` for hexadecimal with 1 byte per integer
xxd
字符串:
strings
机器代码:
objdump -D # object dump: `-D` is `--disassemble-all`
最后但并非最不重要,file
一定要检查一下这问题。