我有一个可执行文件。当我在调试器(x32dbg)中启动它时,在每种情况下都设置了断点(DLL条目,DLL加载,线程启动等),以限制文件运行后立即执行的操作的数量,

在转储中,我看到一些字节与exe文件中相同位置的字节不同。

为什么会发生这种情况以及如何防止这种情况?


我的想法是与某种动态链接有关。在以下情况下,这些值会更改:保存exe文件(即使之前的内容完全相同)并运行。因此,将重新放置代码所在的偏移量和特定字节。但是,唯一加载的是ntdll.dll,然后命中第一个断点。因此,我想将exe的内容复制到ram上,那时候一切都好了,然后发生了魔术部分,其中子例程或什么知道要更改的字节并将其更改,然后调试器获得了控件。 br />

#1 楼

魔术可能是在到达入口点之前运行的TLS回调。此行为已得到充分证明,请参阅以下文章:

https://isc.sans.edu/diary/How+Malware+Defends+Itself+Using+TLS+Callback+Functions/6655

评论


我环顾了TLS,但是在ollydbg中,我设置了所有可能的中断选项,甚至将系统条目设置为初始条目。然后,我要做的第一件事是转到内存中的偏移量以查看何时发生覆盖,但是它已经完成了。它仍然是正确的行为吗?我应该使用IDA进行检查还是基于PE标头中的某些表进行其他类型的系统偏移量计算?

–Patrik Staron
19 Mar 4 '19 at 20:23