菜鸟脱Obsidium 1.2.0.0
本帖最后由 kir 于 2010-9-30 18:14 编辑]感谢XIMO的动画教程指导,不过第一部脱Ob1.2的下载不到,只看了第2部脱1.3的,之后自己尝试脱吾爱练习的0b1.2,记录了一下过程。。。
语言组织得不怎么好,各位看官体谅体谅。。。废话不多说了,直接上过程。。
【文章标题】: 脱Obsidium 1.2.0.0
【软件名称】: 吾爱脱壳练习某期
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一:到达Foep
程序入口点:
00419000 > /EB 02 jmp short Obsidium.00419004
00419002 |45 inc ebp
00419003 |08E8 or al,ch
00419005 3F aas
00419006 1E push ds
00419007 0000 add byte ptr ds:,al
00419009 27 daa
下BP ExitProcess,忽略所有异常,shift+F9运行,弹出对话框,点关闭,程序停下来了
7C81CAFA >8BFF mov edi,edi
7C81CAFC 55 push ebp
7C81CAFD 8BEC mov ebp,esp
7C81CAFF 6A FF push -1
7C81CB01 68 B0F3E877 push 77E8F3B0
7C81CB06 FF75 08 push dword ptr ss:
7C81CB09 E8 46FFFFFF call kernel32.7C81CA54
7C81CB0E E9 9ACF0100 jmp kernel32.7C839AAD
观察堆栈:
0012FF6C 0091B787/CALL 到 ExitProcess 来自 0091B785
0012FF70 00000000\ExitCode = 0
0012FF74 00A41044
0012FF78 00A3F000
0012FF7C 009C7BB4
往下拉到最下面,发现程序的领空地址00A3E175,并不是熟悉的400000区段。。
0012FFAC 00A3E175返回到 00A3E175 来自 009C3D6C ->here
0012FFB0 7FFDA000
0012FFB4 0012FFE0
0012FFB8 009C39FC
0012FFBC 0012FFC0
0012FFC0 0012FFF0
0012FFC4 7C817067返回到 kernel32.7C817067
0012FFC8 7C930208ntdll.7C930208
0012FFCC FFFFFFFF
0012FFD0 7FFDA000
0012FFD4 C0000005
0012FFD8 0012FFC8
0012FFDC 0012FA6C
0012FFE0 FFFFFFFFSEH 链尾部
0012FFE4 7C839AC0SE 处理器
0012FFE8 7C817070kernel32.7C817070
0012FFEC 00000000
0012FFF0 00000000
0012FFF4 00000000
0012FFF8 00419000offset Obsidium.<模块入口点>
0012FFFC 00000000
Ctrl+G 00A3E175
00A3E14B FF8B 0DB003A4 dec dword ptr ds:
00A3E151 00A1 BC02A400 add byte ptr ds:,ah
00A3E157 8B00 mov eax,dword ptr ds:
00A3E159 8B15 3CDCA300 mov edx,dword ptr ds:
00A3E15F E8 444AFDFF call 00A12BA8
00A3E164 A1 BC02A400 mov eax,dword ptr ds:
00A3E169 8B00 mov eax,dword ptr ds:
00A3E16B E8 B84AFDFF call 00A12C28
00A3E170 E8 F75BF8FF call 009C3D6C
00A3E175 8D40 00 lea eax,dword ptr ds: ->到这里
代码很乱,花指令很多,再00A3E17处按住Ctrl往上慢慢翻,到这个位置时,再往上都是不正常的代码
00A3E130 05 675D51DC add eax,DC515D67
00A3E135 D0A5 C4D80E7D shl byte ptr ss:,1
00A3E13B E8 687CF8FF call 009C5DA8 ->这里就是foep了,记住地址00A3E13B
00A3E140 A1 BC02A400 mov eax,dword ptr ds:
00A3E145 8B00 mov eax,dword ptr ds:
00A3E147 E8 444AFDFF call 00A12B90
00A3E14C 8B0D B003A400 mov ecx,dword ptr ds:
00A3E152 A1 BC02A400 mov eax,dword ptr ds:
重新载入程序,Ctrl+G到00A3E13B,但无法到达,应该是还没解码出来,那就先内存断点,Alt+M,在402000处下断,SHIFT+F9
断下后,Ctrl+G到00A3E13B,在00A3E13B下F2,F9运行。到达foep~~
看语言特点,是DELPHI写的,跟住寄存器和数据窗口的信息,不难退出被偷的代码。。
push ebp
mov ebp,esp
add esp,-10
mov eax,00A3DED0
算好位置补上被偷的代码
00A3E130 55 push ebp ->此处新建EIP
00A3E131 8BEC mov ebp,esp
00A3E133 83C4 F0 add esp,-10
00A3E136 B8 D0DEA300 mov eax,0A3DED0
00A3E13B E8 687CF8FF call 009C5DA8
00A3E140 A1 BC02A400 mov eax,dword ptr ds:
00A3E145 8B00 mov eax,dword ptr ds:
00A3E147 E8 444AFDFF call 00A12B90
00A3E14C 8B0D B003A400 mov ecx,dword ptr ds:
00A3E152 A1 BC02A400 mov eax,dword ptr ds:
打开LordPE完整DUMP和区域DUMP包含00A3E130的那段(Region009C0000-00A47000.dmp)
PE编辑器打开DUMP,打开区段从磁盘载入Region009C0000-00A47000.dmp,载入后修改它的虚拟地址为005C0000,保存并重建PE。
二:寻找IAT。。。。。
OD大家没急着关闭吧?。
找IAT的RAV和SIZE(不会找?翻论坛吧)
00A4212C0091CD04
00A421300091CD10
00A421340091CD1C
00A421380091CD28
00A4213C0091CD34
.
.
.省略部分代码
.
00A427B00091E116
00A427B40091E122
00A427B80091E12E
00A427BC0091E13A
00A427C00091E146
00A427C400000000
全加密了(不加密还好玩吗?呵呵)SIEZ:0x698
那就随便跟一个看看吧,一般跟最开始的那个00A4212C0091CD04
Ctrl+G 0091CD04
0091CD04 60 pushad ->新建EIP
0091CD05 66:B8 0000 mov ax,0
0091CD09 B1 00 mov cl,0
慢慢跟一下。。。。。
0091B389 /0F84 DE040000 je 0091B86D 这有个跳转,不过没跳
0091B38F |EB 03 jmp short 0091B394
0091B3B9 /0F84 62010000 je 0091B521 没跳
0091B3BF |EB 01 jmp short 0091B3C2
0091B3CB /0F84 F4000000 je 0091B4C5 没跳
0091B3D1 /EB 02 jmp short 0091B3D5
0091B3E5 /0F84 83060000 je 0091BA6E 没跳
0091B3EB |EB 02 jmp short 0091B3EF
0091B3F8 /0F84 99010000 je 0091B597 没跳
0091B3FE |EB 01 jmp short 0091B401
单步到这里时,过了CALL之后EAX处出现指针了。
0091B40A 6A 01 push 1
0091B40C 50 push eax
0091B40D 6A 00 push 0
0091B40F FF76 04 push dword ptr ds:
0091B412 FF77 04 push dword ptr ds:
0091B415 FF53 50 call dword ptr ds:
0091B418 EB 04 jmp short 0091B41E
EAX 7C93135A ntdll.RtlDeleteCriticalSection
ECX 7C920000 ntdll.7C920000
EDX 7C92CE40 ntdll.ZwAcceptConnectPort
EBX 00419622 Obsidium.00419622
ESP 0012FF90
EBP 005012CE
ESI 00918864
EDI 00918664
EIP 0091B418
再跟几个,都是在这个位置,EAX出现指针,那就PATCH代码吧,估计能找出大部分被加密的函数出来。
申请一个空间写代码,我用的是SOD插件申请的。
00970000 C705 2821A400 2>mov dword ptr ds:,0A4212C->新建eip
0097000A 8B35 2821A400 mov esi,dword ptr ds:
00970010 8906 mov dword ptr ds:,eax
00970012 83C6 04 add esi,4
00970015 8935 2821A400 mov dword ptr ds:,esi
0097001B 8B06 mov eax,dword ptr ds:
0097001D 83F8 00 cmp eax,0
00970020 74 04 je short 00990026
00970022 8BFA mov edi,edx
00970024 FFE0 jmp eax ->跳到下一个DLL地址
00970026- EB FE jmp short 00990026 ->这里下断,停在这里表示寻找完毕
00970028 3BD7 cmp edx,edi ->这里是判断分隔函数的代码段,是分割段就填充eax为0,
0097002A- 0F84 BAB2F8FF je 0091B2EA 不判断的话就要自己来分割,为什么这样判断?大家分析一下,很容易就想到的。
00970030 B8 00000000 mov eax,0
00970035^ EB D3 jmp short 0099000A
C7 05 28 21 A4 00 2C 21 A4 00 8B 35 28 21 A4 00 89 06 83 C6 04 89 35 28 21 A4 00 8B 06 83 F8 00
74 04 8B FA FF E0 EB FE 3B D7 0F 84 BA B2 FA FF B8 00 00 00 00 EB D3
0091B2E5 /EB 03 jmp short 0091B2EA 改成jmp 00970028(改了之后多了3个NOP,把那3个NOP撤销修改)
0091B418 EB 04 jmp short 0091B41E 改成jmp 0097000A(跳到PATCH函数段,将函数还原)
这样运行后,在几个DLL处出现错误。自己跟踪发现不到函数的直接跳过,有如下2处。
0091C9DB /EB 04 jmp short 0091C9E1改成jmp 0097000A
0091CB80 C8 000000 enter 0,0 改成 jmp 0097000A
0091CB84 53 push ebx
0091CB85 E8 00000000 call 0091CB8A
还有一个错误,就是
0091B3F8 /0F84 99010000 je 0091B597 大多数函数都没跳,但有几个函数这里跳了,估计是分支。
0091B3FE |EB 01 jmp short 0091B401
Ctrl+G 0091B597
0091B597 /EB 03 jmp short 0091B59C
在这里下F2断点,遇到进入这里的分支就慢慢跟一下,跟到函数就立刻jmp 0097000A
这分支里面有3个判断分支,其中1个跟到retn都跟不到函数,就直接将retn改成
mov eax,1(随便填充eax,防止它的值是0)
jmp 0097000A
有一分支进入到00400000的区段,跟出了函数后,再jmp 0097000A,之后需要返回撤销修改。
剩下的一个分支很和谐,直接跟踪到函数了,之后jmp 0097000A运行并没出现错误
得到的IAT,2进制复制。。
5A 13 93 7C E0 10 92 7C 00 10 92 7C 81 9F 80 7C 74 9B 80 7C E1 9A 80 7C BF 99 80 7C 1D 9A 80 7C
05 01 28 0A B8 97 80 7C 0A 98 80 7C F6 97 80 7C 61 BA 80 7C 64 A1 80 7C 88 9C 80 7C 80 CB 91 00
A1 01 81 7C 53 1D 80 7C A5 A4 80 7C F2 1E 80 7C 30 AE 80 7C 31 B7 80 7C 5F B5 80 7C F2 D2 80 7C
B2 CE 91 00 6E AC 80 7C 69 38 81 7C 67 EE 80 7C FA CA 81 7C 17 0E 81 7C 6A 3E 86 7C A5 AB 94 7C
99 2A 81 7C C9 2F 81 7C 00 00 00 00 DB 11 D3 77 08 C9 D2 77 EA 07 D5 77 B0 C8 D2 77 00 00 00 00
AB 7A DA 77 42 78 DA 77 17 6C DA 77 00 00 00 00 80 48 0F 77 EC A3 0F 77 39 4B 0F 77 00 00 00 00
55 9C 80 7C D0 97 80 7C 1D 9A 80 7C 31 B7 80 7C 00 00 00 00 AB 7A DA 77 42 78 DA 77 17 6C DA 77
00 00 00 00 91 BE 80 7C 31 BB 80 7C 17 0E 81 7C 30 25 80 7C 61 BA 80 7C E1 9A 80 7C 46 24 80 7C
F9 BC 80 7C DA B8 81 7C 1E 0C 81 7C A7 A0 80 7C 9F AC 80 7C 5E 20 83 7C CB A0 80 7C 12 18 80 7C
88 9C 80 7C 56 98 80 7C 27 CD 80 7C 45 A0 80 7C 7B 1D 80 7C E0 10 92 7C 91 9E 80 7C 81 9F 80 7C
12 FF 80 7C 49 24 81 7C D1 4C 83 7C A9 FF 80 7C BF FC 80 7C DB 60 83 7C AB 0B 83 7C BD FD 80 7C
C1 60 83 7C 6E 2B 81 7C 05 01 28 0A 2E 93 80 7C A5 A4 80 7C E2 5D 83 7C E6 2D 81 7C EF 70 87 7C
C9 2F 81 7C 30 AE 80 7C 31 B7 80 7C 5F B5 80 7C F2 D2 80 7C 64 A8 80 7C 01 FE 92 7C 8C 39 81 7C
DD 02 83 7C 06 62 83 7C B8 97 80 7C D0 03 00 00 06 2F 81 7C A5 99 80 7C 00 00 00 00 1E 98 80 7C
6E AC 80 7C 90 F7 82 7C 19 BF 80 7C 69 38 81 7C 67 EE 80 7C F6 E8 80 7C 4D 06 83 7C 29 82 83 7C
00 10 92 7C 5A 13 93 7C C7 06 81 7C 28 1A 80 7C 9D 08 83 7C 07 D1 80 7C D7 9B 80 7C 00 00 00 00
AA 18 BD 77 EF 19 BD 77 40 1A BD 77 00 00 00 00 37 D8 EF 77 D0 B6 EF 77 14 8E EF 77 B1 C7 F1 77
4C 7B EF 77 77 5D EF 77 97 85 EF 77 D0 D8 EF 77 4B B8 EF 77 1F 6D F0 77 E6 C7 F0 77 EC 87 EF 77
DB 5E EF 77 29 5E EF 77 32 86 EF 77 70 5B EF 77 A0 7A EF 77 EE 8B EF 77 32 C6 F1 77 28 8B EF 77
BE E9 EF 77 1B 82 EF 77 5B EA EF 77 83 E0 EF 77 B0 ED EF 77 47 9F F1 77 9B 86 EF 77 1A A2 EF 77
C1 A0 EF 77 97 D9 EF 77 56 6A EF 77 1E DA EF 77 A4 AE F2 77 01 7C EF 77 45 DF EF 77 FF DC EF 77
1C EF EF 77 9E BA EF 77 C1 61 EF 77 4C B7 EF 77 1A B6 EF 77 25 8D EF 77 FE A9 F2 77 D2 03 F0 77
7F 9A F1 77 71 5A EF 77 A5 9F EF 77 DE B1 EF 77 EF D9 EF 77 75 EE F0 77 3D 83 EF 77 A1 6A EF 77
F6 99 EF 77 F4 AA EF 77 8D 59 EF 77 5D A9 EF 77 EC 90 EF 77 FA 6B EF 77 44 FD EF 77 5F 6E EF 77
A5 61 EF 77 86 77 EF 77 7C 79 F0 77 55 A1 EF 77 EA B5 EF 77 8A BA EF 77 CE EC EF 77 23 AD EF 77
19 9E EF 77 E0 5F EF 77 0A 70 EF 77 69 D9 EF 77 EF 61 EF 77 90 70 F0 77 E7 95 EF 77 79 6F EF 77
00 00 00 00 A9 E4 D2 77 66 97 D2 77 5D EE D3 77 0C 94 D1 77 AB AE D2 77 A3 89 D2 77 F3 D5 D2 77
F6 8B D1 77 2F FB D2 77 1E 53 D6 77 B2 DE D2 77 56 AF D2 77 F2 F2 D2 77 E6 61 D5 77 6E FA D2 77
28 E5 D2 77 11 12 D3 77 F3 99 D2 77 46 DE D1 77 BB C2 D2 77 9D C2 D2 77 2E 8C D1 77 9B F9 D2 77
50 F7 D2 77 56 90 D1 77 A6 8F D2 77 00 00 D3 77 F9 C7 D2 77 5E AE D6 77 F6 F3 D4 77 ED 42 D2 77
12 B1 D2 77 30 99 D2 77 9E 0F D3 77 71 FE D2 77 5E C3 D2 77 22 78 D2 77 C2 F3 D2 77 39 FF D2 77
A0 97 D2 77 94 00 D3 77 16 F7 D1 77 9D 86 D1 77 7A C3 D2 77 28 8E D1 77 28 8E D1 77 5E EA D2 77
44 99 D2 77 19 97 D2 77 5A CA D2 77 FD AA D2 77 40 A3 D2 77 77 02 D3 77 11 90 D2 77 D7 00 D3 77
9E B2 D2 77 EA 07 D5 77 7B 1F D3 77 07 95 D2 77 EA FE D2 77 08 C9 D2 77 62 62 D5 77 F6 E8 D2 77
3E D3 D2 77 3C 47 D2 77 42 8C D1 77 8A 9C D2 77 3D 9E D2 77 72 9F D2 77 7A 97 D2 77 13 93 D2 77
FE 98 D2 77 FF 97 D2 77 89 C6 D3 77 0E 97 D1 77 D5 8F D2 77 1F 8F D2 77 10 F7 D4 77 26 ED D3 77
D5 98 D2 77 80 8A D1 77 36 78 D2 77 CD A5 D2 77 6B 21 D3 77 B4 90 D2 77 C7 03 D3 77 A6 88 D1 77
5D 94 D1 77 21 90 D1 77 5B F2 D2 77 9C 8F D1 77 22 B2 D2 77 AB 8E D1 77 78 8E D1 77 96 D8 D2 77
87 F7 D2 77 04 F7 D2 77 E2 DF D2 77 42 00 D3 77 0F 91 D2 77 55 96 D2 77 4E F2 D4 77 67 F9 D1 77
AD F0 D2 77 C8 F1 D4 77 1C EF D2 77 BA 14 D3 77 7A 15 D3 77 26 D2 D2 77 1B 9C D2 77 F6 9B D2 77
D9 9E D2 77 B4 F6 D4 77 27 D4 D2 77 23 98 D2 77 C8 98 D2 77 6B D8 D2 77 1B AF D2 77 D2 D1 D2 77
95 C5 D2 77 C7 86 D1 77 4E 97 D2 77 1B A9 D2 77 BA 0D D3 77 8E 90 D2 77 5F F4 D2 77 FF EB D3 77
DA 94 D1 77 E8 C2 D2 77 2A F9 D2 77 4A 21 D3 77 E1 82 D2 77 2F 9C D2 77 81 9E D2 77 AE A5 D2 77
39 F5 D2 77 FD 8F D2 77 49 98 D2 77 05 80 D6 77 C4 D2 D2 77 96 0D D3 77 E2 D7 D2 77 02 C7 D3 77
9C F6 D4 77 84 CB D2 77 6C D0 D3 77 40 E9 D3 77 4F F9 D2 77 F6 FB D2 77 B8 96 D1 77 9C B1 D2 77
9D D3 D2 77 12 D3 D2 77 12 D3 D2 77 D3 CE D2 77 7E C1 D2 77 B4 F9 D4 77 65 F9 D4 77 01 F6 D1 77
06 F3 D2 77 BC 70 D5 77 14 DC D2 77 65 02 D3 77 60 9B D2 77 BD 1A D3 77 7D A9 D2 77 C6 B3 D2 77
E9 8F D2 77 B0 C8 D2 77 45 88 D2 77 17 87 D2 77 3F AE D1 77 F1 AE D1 77 EA E7 D2 77 73 86 D2 77
00 00 00 00 46 24 80 7C 00 00 00 00 10 AB 0F 77 5A 51 0F 77 A6 51 0F 77 55 AA 0F 77 BB 6B 0F 77
FD 4C 0F 77 F0 48 0F 77 50 49 0F 77 00 00 00 00 A9 2F 1B 5D 3A E3 17 5D F5 2D 1B 5D 6D 40 1B 5D
D6 2B 1B 5D 22 2D 1B 5D 82 2B 1B 5D CF 2C 1B 5D FA 2C 1B 5D A1 2C 1B 5D 1B 2C 1B 5D 59 2C 1B 5D
91 4A 1B 5D DF 06 18 5D FD 68 18 5D F1 DF 18 5D 80 84 18 5D 6C B6 17 5D F4 C7 17 5D C5 2E 1B 5D
78 D5 17 5D D8 03 18 5D 05 02 18 5D 00 00 00 00 50 11 61 7D 00 00 00 00
重新载入程序,到达foep,补上被偷的代码,2进制粘贴找到的DLL。。打开ImpREC
Rva:0064212C
SIEZ:0x698
获取输入表,有6个无效。还好就6个。。随便找一个DELPHI程序,对比他的IAT,很快就找到跟不出的几个函数名称了
rva:0064214C GetVersion
00642168 lstrlen
0064218C GetCommandLineA
00642294 GetVersion
006422D8 GetCurrentProcessId
006422E4 FreeResource
修改完后OEP记得填上 63E130
转存后的程序能运行了。。。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Kir,转载请注明作者并保持文章的完整, 谢谢!
XIMO动画里在IAT加密前躲过去,我想了想,无论怎么加密,你总要把它(DLL)给取出来吧???,所以就尝试了自己还原DLL,虽然繁琐,不过重在过程而已。。
回复 1# kir
下来试试看了,谢谢楼主
学习了,写的不错 代码最好使用代码框标签这样会显得很好看,加精鼓励!期待更多作品! 代码最好使用代码框标签这样会显得很好看,加精鼓励!期待更多作品!
Hmily 发表于 2010-9-30 18:07 http://www.52pojie.cn/images/common/back.gif
改好啦!! 写的很好啊 虽然看得不太懂,但还是顶一下 感谢楼主的教程,这在研究这个壳,在iat加密上停了好久。 分析的不错,小菜菜来学习了,顶起来 想不到这贴子加精了,好久没玩脱壳,现在看回来挺有感觉的
页:
[1]