kir 发表于 2010-9-30 14:01

菜鸟脱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,虽然繁琐,不过重在过程而已。。

      

寂寞地发呆 发表于 2010-9-30 14:13

回复 1# kir


    下来试试看了,谢谢楼主

xie83544109 发表于 2010-9-30 14:13


学习了,写的不错

Hmily 发表于 2010-9-30 18:07

代码最好使用代码框标签这样会显得很好看,加精鼓励!期待更多作品!

kir 发表于 2010-9-30 18:16

代码最好使用代码框标签这样会显得很好看,加精鼓励!期待更多作品!
Hmily 发表于 2010-9-30 18:07 http://www.52pojie.cn/images/common/back.gif

改好啦!!

kenljc 发表于 2010-10-3 19:54

写的很好啊

hero2008 发表于 2010-10-3 20:06

虽然看得不太懂,但还是顶一下

寻梦小子 发表于 2012-6-4 00:58

感谢楼主的教程,这在研究这个壳,在iat加密上停了好久。

落岸天使 发表于 2012-6-4 12:51

分析的不错,小菜菜来学习了,顶起来

kir 发表于 2013-6-25 23:54

想不到这贴子加精了,好久没玩脱壳,现在看回来挺有感觉的
页: [1]
查看完整版本: 菜鸟脱Obsidium 1.2.0.0