代码执行前的 IDA 奇怪异常

逆向工程 艾达 聚乙烯
2021-06-27 01:27:04

我正在尝试反转 PE 可执行文件(挑战教程)。我在程序的第一条指令的入口点处放置了一个断点。之前没有执行任何操作。

运行程序时出现软件断点异常。我认为这是一个调试器检测系统。但是我不知道抛出这个异常的代码在哪里,因为我还没有到达我的程序入口点。

异常抛出ntdll.dll我想了解如何ntdll.dll在二进制文件的入口点之前执行代码

谢谢

2个回答

在入口点之前运行的一件事是TLS 回调,所以检查你的二进制文件是否有它们。

无意冒犯,但这个问题表明对 windows 如何加载用户模式进程、如何构建用户模式代码和可执行文件的一些基本缺乏了解。

我将列出一些缺失的部分:

  1. 正如 Igor 所提到的,TLS 回调通常在执行入口点之前被调用,并用于在执行任何代码之前设置任务(全局对象构造函数就是一个例子)。TLS 回调偶尔被编译器用于某些任务以及一组反调试技术。
  2. 当用户模式进程启动时,它的第一条执行指令不是可执行文件的入口点。在创建的进程的上下文中执行了大量的加载程序代码(初始化默认堆,设置部分 TEB 和 PEB 等)。
  3. 通常,可执行文件的入口点不是您的int main(int argc, char* argv[]). 编译器有一个包装函数,它是 PE 的入口点指向的地方,而 main 仅由它调用。

我建议您阅读Peering Inside the PE,因为它非常深入地描述了这些过程。