反向工程您自己的代码c++
Reverse engineering your own code c++
我有一个编译过的程序,我想知道其中是否存在某一行。有没有办法,使用我的源代码,我可以确定这一点?
Tony评论了我的消息,所以我会添加一些信息:
- 我正在使用g++编译器
- 我正在Linux(科学(/Unix机器上编译代码
- 我只使用标准库(没有从网上下载(
- 所需的行要么是与数字相乘(在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";它们的参数,这样您就可以记录和执行某些内容,而无需键入两次所有代码。还有很多其他选择。
希望这些能有所帮助。。。。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值