我可以访问指向 SEH 链的 FS:[0h] 但不能对其他段寄存器执行相同的操作。这是什么原因?
另外,我正在调试一个 exe,它的 PTRD 为 0x600,AEP 为 0x1000(与 PTRD 相同),但在偏移量 0x400 处我看到了一些我在其他一些文件中也看到过的指令。在我的示例中,它是无法访问的代码,但在我使用 WINASM/MASM 编写的一个测试 exe 中,它是相同的指令序列,只是有更多的指令。如果我将 AEP 更改为 400,则程序集如下:
00400400 6A 00 PUSH 0
00400402 68 05304000 PUSH 00403005
00400407 68 00304000 PUSH 00403000
0040040C 6A 00 PUSH 0
0040040E E8 17040000 CALL 0040082A
00400413 6A 00 PUSH 0
00400415 E8 16040000 CALL 00400830
0040041A E8 17040000 CALL 00400836
0040041F E8 1E040000 CALL 00400842
00400424 E8 13040000 CALL 0040083C
00400429 C3 RETN
我在 MASM 中编写了一个 Hello world 程序,它的 AEP 为 0x1000,代码看起来很相似,但我可以调试它,即它不像以前的那样无法访问/死代码。它如下:
00401000 6A 00 PUSH 0
00401002 68 00304000 PUSH OFFSET 00403000
00401007 68 06304000 PUSH OFFSET 00403006
0040100C 6A 00 PUSH 0
0040100E E8 0D000000 CALL <JMP.&user32.MessageBoxA>
00401013 A3 14304000 MOV DWORD PTR DS:[403014],EAX
00401018 33C0 XOR EAX,EAX
0040101A 50 PUSH EAX
0040101B E8 06000000 CALL <JMP.&kernel32.ExitProcess>
00401020 FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>]
00401026 FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess
所以我的问题是代码怎么会在我的示例中以 0x400 的偏移量出现,这段代码有什么用处,是否有一些编译器将它放在那里?
注意:它是病毒样本,我是初学者。感谢您提前回答...
