常见脱壳入口点
常见脱壳入口点
Visual Studio 2013(常见程序有 x64dbg 32位):
特征很明显,一个call后面有一条跳转到下一条指令的jmp,jmp过去的是一条 push 14 指令。下面是x32dbg.exe的DIE查壳信息与入口点汇编截图:
跳转到下一条指令的jmp编译器: EP:Microsoft Visual C/C++(2013-2017)[EXE32]
编译器: Microsoft Visual C/C++(2013)[-]
链接程序: Microsoft Linker(12.0*)[GUI32,signed]
Visual Studio 2017及之后(常见程序有 WPS、微信):
VS2017 特征没有 VS2013 看起来那么明显,其实也差不多,一个call后面有一条向上跳转指令的jmp,jmp过去的也是一条 push 0x14 指令。下面是wps.exe的DIE查壳信息与入口点汇编截图:
也有 push 0x14 指令编译器: EP:Microsoft Visual C/C++(2017 v.15.5-6)[EXE32]
编译器: Microsoft Visual C/C++(-)[-]
链接程序: Microsoft Linker(14.24**)[GUI32,signed]
Visual Studio 2008 64bit 及之后(使用程序有 x64dbg 64位、python 64位):
一条sub rsp,0x28
指令之后接一个call,然后来一条sub rsp,0x28
。两条指令的 0x28 都是固定的。下面是x64dbg.exe的DIE查壳信息(DIE查不出来编译器,DIE只有x64dbg查不出来,可以查出其他64位程序的)与入口点汇编截图:
x64dbg 64位入口点链接程序: Microsoft Linker(12.0*)[GUI64,signed]
覆盖: Binary
Delphi(使用程序有 Resource Hacker):
经过对各种 Delphi 版本的对比,发现只有前面3条指令是固定的。如果在 x64dbg 使用无符号来显示数据,第三条对应显示为 add esp, -0x10
。下面是ResourceHacker.exe的DIE查壳信息与入口点汇编截图:
关键是前面三条指令编译器: Embarcadero Delphi(10.3 Rio)[-]
链接程序: Turbo Linker(2.25*,Delphi)[GUI32]
资源[005482ac]: Binary
Borland C++(使用程序有 OllyDBG):
一条jmp指令跳过了不常见的bound指令,还有4个dec指令和一个nop指令。下面是OllyDBG.exe的DIE查壳信息与入口点汇编截图:
jmp跳过了bound指令编译器: Borland C++(Builder)[-]
链接程序: Turbo Linker(5.0)[GUI32]
MinGW GCC(使用程序有 MinGW-w64 ):
自从Visual Studio 越来越好用并且有免费版之后,使用MinGW GCC 在Windows平台开发已经不常见了,所以一般是古老软件用MinGW GCC编译。下面是gcc.exe的DIE查壳信息:
编译器: MinGW(GCC: (i686-win32-dwarf-rev3, Built by MinGW-W64 project) 12.1.0)[-]
链接程序: GNU linker ld (GNU Binutils)(2.30)[控制台32,console]
覆盖: BitRock installer data(-)[-]
覆盖: Binary
经过测试,MinGW GCC有两种入口:
image.png image.pngGo(使用程序有 Go 1.18 ):
一条被 int3
上下包围的jmp指令向上跳,而且跳的跨度还不小。下面是64位的go.exe的DIE查壳信息与入口点汇编截图:
一个奇怪的jmp编译器: Go(1.15.0-X.XX.X)
附录:在x64dbg中下跟踪断点
根据push 0x14
这条特殊的指令,我们可以在x64dbg中下跟踪断点dword:[esp]==0x14
,如图所示: