本帖最后由 lufei 于 2017-3-16 18:28 编辑
FSG2.0压缩壳遇到的一个trick。首先一路f7,遇到往回跳的跳转就f4到下一条指令。来到下图的40B26A的位置。trick开始位置。
1.1
可以看到调用了两个call,一个是调用GetProcAddress,获取函数地址。另外一个是调用CreateThread,创建一个线程。 这两个call都f8步过。 然后f7步入40B272,如下图所示。
1.2
又调用了两个call,一个是调用GetProcAddress,获取函数地址。另外一个是调用CloaseHandle,关闭线程句柄。 继续f8步过这两个call。 然后f7步入40B272,如下图所示。
1.3
又调用了两个call,一个是调用GetProcAddress,获取函数地址。另外一个是调用ExitThread,结束当前线程。 这时候第二个call不能步过了。你f8步过40B29D就会跑飞了。 这时候应该在0040B2A4这个位置f2下断点。然后f9。然后一路单步,来到下图。
1.4
这时候可以看到一个比较大的跳转。 004001D1 - FF63 0C jmpdword ptr ds:[ebx+0xC] ; UnPackMe.00401700在这里下f2下断点,然后f9,单步就到了OEP
1.5
这里的trick就是结束当前线程,然后执行CreateThread创建那个线程的函数去了。代码如下。
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <windows.h>
DWORD WINAPI ThreadProc(LPVOID pM)
{
printf("1111111111");
return 0;
}
void main()
{
HANDLE handle1=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
ExitThread(0);
getchar();
}
http://www.52pojie.cn/thread-10607-1-1.html
|