来看雪很久了,一直没有发过什么有技术含量的文章,前段时间看了一位大侠的域天狗脱壳文章,也来一个简单的脱壳教程,希望对菜鸟有所帮助,高手请指教。
系统环境:windows xp sp3
工具:PEID 0.94 OD
目标程序:一个商业软件(偷个懒,就用那位大侠提供的例子程序吧,呵呵)
下面开始:
一、首先PEID查壳
普通扫描显示“什么都没找到 *”
深度扫描或核心扫描,提示Anti007 V1.0-V2.X -> NsPacK Private * Sign.By.fly *壳,应该是域天的狗壳。
二、OD载入
005B3D5A > 9C pushfd ///看过几个域天狗壳,都一样
005B3D5B 60 pushad
005B3D5C E8 33000000 call 005B3D94
005B3D61 5D pop ebp
005B3D62 B8 73060150 mov eax, 50010673
005B3D67 2D 6C060150 sub eax, 5001066C
005B3D6C 2BE8 sub ebp, eax
005B3D6E 8DB5 EEFEFFFF lea esi, dword ptr [ebp-112]
005B3D74 8B06 mov eax, dword ptr [esi]
005B3D76 83F8 00 cmp eax, 0
005B3D79 74 1D je short 005B3D98
005B3D7B 8DB5 FAFEFFFF lea esi, dword ptr [ebp-106]
005B3D81 8B06 mov eax, dword ptr [esi]
005B3D83 83F8 01 cmp eax, 1
005B3D86 C706 01000000 mov dword ptr [esi], 1
这个狗壳不能用ESP定律,我们就来简单的。 alt+M
在mian1区段下内存写入断点,F9运行,程序断在
005B3E24 8995 AEFEFFFF mov dword ptr [ebp-152], edx //断在这里
005B3E2A 0195 E2FEFFFF add dword ptr [ebp-11E], edx
005B3E30 8DB5 FEFEFFFF lea esi, dword ptr [ebp-102]
005B3E36 0116 add dword ptr [esi], edx
005B3E38 8B36 mov esi, dword ptr [esi]
005B3E3A 8BFD mov edi, ebp
删除内存断点,ctrl+B,查找二进制字串“61 9D”
005B40B0 61 popad //就是这里
005B40B1 9D popfd
005B40B2 - E9 05EEE4FF jmp 00402EBC //这里跳往OEP,先下个断
ctrl+S查找命令序列
call eax
add esp,4
来到这里
005B3EBB FFD0 call eax //这里下断
005B3EBD 83C4 04 add esp, 4
005B3EC0 58 pop eax
005B3EC1 5F pop edi
005B3EC2 50 push eax
005B3EC3 68 00000000 push 0
005B3EC8 68 1C000000 push 1C
005B3ECD 05 A7160000 add eax, 16A7
005B3ED2 57 push edi
005B3ED3 FFD0 call eax //这里下断
005B3ED5 83C4 10 add esp, 10
005B3ED8 61 popad
005B3ED9 60 pushad
重新载入程序,F9运行,出现异常时shift+F9,断在005B3EBB,F7进入,F8单步运行
010E2017 55 push ebp ; fuke.<模块入口点>
010E2018 8BEC mov ebp, esp
010E201A 83EC 48 sub esp, 48
......
010E20B6 85C0 test eax, eax
010E20B8 75 4F jnz short 010E2109 //此跳转默认实现,不能让它跳nop
010E20BA 8B4E 20 mov ecx, dword ptr [esi+20]
010E20BD 8B7E 24 mov edi, dword ptr [esi+24]
010E20C0 B8 57FAA37C mov eax, 7CA3FA57
......
010E2102 85C0 test eax, eax
010E2104 EB 3E jmp short 010E2144 //让它实现,改为jmp
010E2106 8B7D F8 mov edi, dword ptr [ebp-8]
010E2109 FF45 08 inc dword ptr [ebp+8]
010E210C 817D 08 FF00000>cmp dword ptr [ebp+8], 0FF
010E2113 ^ 7C 94 jl short 010E20A9
继续F8,来到第二个断点call,F7进入,F8单步运行到这里
010E223C 74 19 je short 010E2257 //让它实现,改为JMP
010E223E 8D45 F4 lea eax, dword ptr [ebp-C]
010E2241 83C7 40 add edi, 40
010E2244 50 push eax
010E2245 53 push ebx
010E2246 57 push edi
010E2247 68 801F0E01 push 10E1F80
010E224C 53 push ebx
010E224D 53 push ebx
010E224E FF15 F98A0E01 call dword ptr [10E8AF9] ; kernel32.CreateThread
010E2254 50 push eax
010E2255 FFD6 call esi
010E2257 53 push ebx
010E2258 6A 01 push 1
继续一路F8单步,下面机子有些卡,慢慢跑,向上的跳转要打断不要让它实现。
来到了这里,就是我们下断的地方
005B40B2 - E9 05EEE4FF jmp 00402EBC //在这里跳往OEP
胜利完成,DUMP,OK,收工。
后记:用此法脱了两个域天的狗壳,但在脱第三个域天狗时出现问题,就是在第二个call,请高手指教。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)