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

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

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

谢谢

#1 楼

入口点之前运行的一件事是TLS回调,因此请检查您的二进制文件是否包含它们。

评论


如果您的二进制文件加载了自定义DLL,则要添加到Igor的答案中,则在到达二进制文件的入口点之前,将运行其初始化代码

– blabb
16年12月29日在7:04

#2 楼

无意冒犯,但这个问题表明对Windows如何加载用户模式进程,如何构建用户模式代码和可执行文件有些基本的了解。如Igor所述,TLS回调通常在执行入口点之前调用,并用于在执行任何代码之前设置任务(全局对象构造函数是一个示例)。 TLS回调有时会被编译器用于某些任务以及一系列反调试技术。
当用户模式进程启动时,其第一个执行的指令不是可执行文件的入口。在创建的过程的上下文中有大量的加载器代码(初始化默认堆,设置TEB和PEB的一部分等)执行。
通常,可执行文件的入口点不是您的int main(int argc, char* argv[])。编译器具有包装器函数,PE的入口点指向该包装器函数,并且main仅由它调用。深度。