反向工程您自己的代码c++

Reverse engineering your own code c++

本文关键字:代码 c++ 自己的 程您      更新时间:2023-10-16

我有一个编译过的程序,我想知道其中是否存在某一行。有没有办法,使用我的源代码,我可以确定这一点?

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

  1. 我正在使用g++编译器
  2. 我正在Linux(科学(/Unix机器上编译代码
  3. 我只使用标准库(没有从网上下载(
  4. 所需的行要么是与数字相乘(在while组的子函数中(,要么是在特定情况下打印一行(if语句(

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

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

objdump -Dslx file

重要的是要注意,反汇编程序使用对象文件(ELF(中存在的符号调试信息,因此这些信息应该存在于对象文件中。此外,常量&源代码中的注释不会成为反汇编输出的一部分。

摘要

使用源代码控制并跟踪可执行文件是从哪个源代码修订版构建的。。。它应该把它写进输出中,这样你就可以随时交叉引用这两者,签出相同的源,并重建给你这些结果的可执行文件等等

讨论

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

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

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

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

所有这些(哇(。。。你真的应该做一些完全不同的事情。最好是使用源代码管理系统(例如svn、cvs…(,并对其进行配置,这样您就可以找到代码库的哪个版本用于创建可执行文件-这应该是任何版本控制系统的常见问题解答。

如果做不到这一点,你可以做一些事情,例如,打印出程序开始运行时使用的乘数或条件,并在日志中记录下来。虽然很粗糙,但宏允许您";stringify";它们的参数,这样您就可以记录和执行某些内容,而无需键入两次所有代码。还有很多其他选择。

希望这些能有所帮助。。。。