最开始接触这壳,ESP方法,二次内存中断法,模拟跟踪法,最后一次异常法,都试过了,都失效,并且有些方法在同一个地方失效,于是我就失效的地方开始研究
天草兄的方法是,F8走二步,看堆栈
004144F0 004001E8 FSG_2_0.004001E8
004144F4 004001DC FSG_2_0.004001DC
004144F8 004001DE FSG_2_0.004001DE
004144FC 004010CC FSG_2_0.004010CC
看到最下面的10CC呵呵,不过这种方法我有点不是很理解,因为那里是10CC我们很快知道是入口地址,如果不是10CC呢?我们还能判断栈底的地址就是入口地址吗?
如果可以麻烦告诉我,并请讲下原理。我是初学者,呵呵 !
另外,天草兄说的SFX方法对此壳有效
下面所下我自己的方法
自己改进的ESP方法:
00400154 > 8725 EC444100 xchg dword ptr ds:[4144EC],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:[esi]
0040015E B6 80 mov dh,80
00400160 FF13 call dword ptr ds:[ebx]
F8走两步,在数据窗口跟踪ESP,对其下WORD硬件断点
F9运行,取消硬件断点
然后用最原始的单步跟踪法,来到
004001CA 8B07 mov eax,dword ptr ds:[edi]
004001CC 40 inc eax
004001CD ^ 78 F3 js short FSG_2_0.004001C2
004001CF 75 03 jnz short FSG_2_0.004001D4
004001D1 FF63 0C jmp dword ptr ds:[ebx+C]
004001D4 50 push eax
004001D5 55 push ebp
004001D6 FF53 14 call dword ptr ds:[ebx+14]
004001D9 AB stos dword ptr es:[edi]
004001DA ^ EB EE jmp short FSG_2_0.004001CA
004001DC 33C9 xor ecx,ecx
004001DE 41 inc ecx
在4001DA地方,跳转实现了
如果我们在它后面一句按F4,程序马上跑飞了,这里就是关键了
我们让它往上跳一次,发现它是一个循环结构
004001D6 FF53 14 call dword ptr ds:[ebx+14] ; kernel32.GetProcAddress
循环调用GetProcAddress
并且每次1CF都跳到1D4,中间就没执行过
004001CF /75 03 jnz short FSG_2_0.004001D4
004001D1 |FF63 0C jmp dword ptr ds:[ebx+C]
004001D4 \50 push eax
那么这个循环的出口,一定就在中间一句,在中间一句F2下断,SHIFT+F9运行,呵呵 ,我们得到
004001D1 - FF63 0C jmp dword ptr ds:[ebx+C] ; FSG_2_0.004010CC
呵呵 熟悉的10CC又出现了
另外,通过二次内存中断法(天草兄所说的内存镜像法)后,按F8继续单步,最终到达的情况跟上面的一样
呵呵 ,本人新手,正在看教程,如果有志同道合者,一起学习交流,本人QQ:296969121
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!