逆向工程自己的代码c ++

时间:2011-06-30 07:41:20

标签: c++ reverse-engineering

我有一个已编译的程序,我想知道它是否存在某条线。有没有办法,使用我的源代码,我可以确定吗?

Tony评论了我的消息,所以我将添加一些信息:

  1. 我正在使用g ++编译器。
  2. 我正在Linux(Scientific)/ Unix机器上编译代码
  3. 我只使用标准库(没有从网上下载)
  4. 所需的行是乘以数字(在while组的子函数中)或在特定情况下打印行(if语句)
  5. 我需要这个因为我正在运行几个MD模拟,有时我发现自己处于一种我不确定条件的情况。

2 个答案:

答案 0 :(得分:3)

objdump 是一个实用程序,可用作disassembler以程序集形式查看可执行文件。
使用此命令反汇编二进制文件

objdump -Dslx file

重要的是要注意,尽管反汇编程序使用了目标文件(ELF)中存在的符号调试信息,因此信息应该存在于目标文件中。另外,常数&源代码中的注释不会是反汇编输出的一部分。

答案 1 :(得分:1)

<强>摘要

使用源代码控制并跟踪可执行文件构建的源代码修订版...它应该将其写入输出中,这样您就可以始终交叉引用两者,签出相同的源并重建给您的可执行文件那些结果等。

<强>讨论

  

所需的行是乘以数字(在while组的子函数中)或在特定情况下打印行(if语句)

     

我需要这个因为我正在运行几个MD模拟,有时我发现自己处于一种我不确定条件的情况。

对于您希望所有MD模拟运行最新源的最简单情况,您可以将源文件的时间戳与可执行文件进行比较,以查看是否忘记重新编译,比较过程开始时间(例如,如列出的那样)通过ps)与可执行文件创建时间。

如果您故意部署多个版本的程序并且只拥有最新的源代码,那么它会非常棘手。乘法通常只生成一个机器代码指令...除非你有一些上下文的洞察力,否则你不太可能知道哪个乘法是重要的(或者它是否缺失)。编译器可以为例如它自己产生乘法。数组索引,并且有时可能会将乘法优化为位移(或者没有任何内容,如Ira注释),所以它并不像说'好吧,它是我在函数“X”中唯一的乘法。如果您打印的特定行可能更容易区分...如果有唯一的字符串文字,您可以在可执行文件中搜索它(例如puts("Hello") - &gt; strings program | grep Hello,尽管如此得到其他匹配,并且编译器允许重用字符串文字序列,因此“Well Hello”可能通过指向“H”的指针满足您的需要。如果涉及新的外部符号,您可能会在nm输出等中看到它。

所有这些(哇)......你应该做一些完全不同的事情。最好是使用源控制系统(例如svn,cvs ...),并对其进行配置,以便您可以做一些事情来找出用于创建可执行文件的代码库的哪个版本 - 它应该是任何修订版的FAQ控制系统。

如果做不到这一点,你可以做一些事情来打印出progarm在开始运行时使用的乘数或条件,并在日志中捕获它。虽然hackish,宏允许你“字符串化”他们的参数,所以你可以记录和执行一些东西,而无需输入所有代码两次。还有很多其他选择。

希望其中一些有帮助......