cyto 发表于 2009-6-10 08:07

Obsidium 1.3.0.4 注册版主程序脱壳

本帖最后由 cyto 于 2009-6-16 19:50 编辑

1.3.0.4

很老的一个版本,一直躺在硬盘里,这段时间空虚,翻出来搞搞.

hideToolz+StrongOD:HidePEB+Skip some exception

1.foep:
PE头往下第三个区段下内存写入断点,F9,停住后在code下内存访问断点,F9,就到foep.
这个已经被重定位过了:

00A11642   E8 E3B41700      call 00B8CB2A
00A11647   8BD0               mov edx,eax
00A11649   E8 DEE01600      call 00B7F72C
00A1164E   5A               pop edx
00A1164F   E8 3CE01600      call 00B7F690
00A11654   E8 13E11600      call 00B7F76C
00A11659   6A 00            push 0
00A1165B   E8 18F61600      call 00B80C78
00A11660   59               pop ecx


dump,并A10000区段(记得设置为完整权限),并所有可能用到的区段(也不多),补区段用.
LordPE补区段后Validate PE保存为dumped.exe,备用.

2.iat:
00BC615000CD0000
00BC615400CD000C
00BC615800CD0018
00BC615C00CD0024
00BC616000000000
00BC616400000000
00BC616800CD0030
00BC616C00CD003C
00BC617000000000
00BC617400000000
00BC617800000000
...
00BC618C00000000
00BC619000000000
00BC61940111FC80keygen.ConvertToBin
00BC61980111FBE0keygen.ConvertToString
00BC619C0111EEC0offset keygen.GenerateKeyfile
00BC61A00111E7F0offset keygen.GenerateShortKey
00BC61A40111E000offset keygen.SKGen
00BC61A80111DFC0offset keygen.UPRNG
00BC61AC0111F630keygen.VerifyKeyfile
00BC61B00111E0C0offset keygen.VerifyShortKey
00BC61B400CD00A8
00BC61B800000000
00BC61BC00000000
...
00BC745000CD1CCA
00BC745400CD1CD6
00BC745800CD1CE2
00BC745C00CD1CEE
00BC746000CD1CFA
00BC746400000000
00BC746800000000
00BC746C00000000

几乎都加密了,除了keygen.dll.

2.1 iat解密:
以下代码可能因为重新加载而导致地址不一样,以代码为准.

009D2B98   837F 04 00         cmp dword ptr ds:,0
009D2B9C   EB 02            jmp short 009D2BA0
009D2B9E   5F               pop edi                                                      ; 00CD0000
009D2B9F   AA               stos byte ptr es:
009D2BA0   0F84 84050000      je 009D312A                                ; 特殊函数,patch它,直接返回jmp 0130002E
009D2BA6   EB 02            jmp short 009D2BAA

009D2BC4   83F8 04            cmp eax,4
009D2BC7   EB 04            jmp short 009D2BCD
009D2BCD    /0F84 78010000      je 009D2D4B                        ; 分支1
009D2BD3    |EB 01            jmp short 009D2BD6

009D2BDC   83F8 01            cmp eax,1
009D2BDF   EB 01            jmp short 009D2BE2
009D2BE2    /0F84 11010000      je 009D2CF9                        ; 分支2
009D2BE8    |EB 04            jmp short 009D2BEE

009D2BF2   3D 80000000      cmp eax,80
009D2BF7   EB 02            jmp short 009D2BFB
009D2BFB    /0F84 AE070000      je 009D33AF                        ; 分支3
009D2C01    |EB 02            jmp short 009D2C05

009D2C0A   83F8 40            cmp eax,40
009D2C0D   EB 01            jmp short 009D2C10
009D2C10    /0F84 AB010000      je 009D2DC1                        ; 分支4
009D2C16    |EB 04            jmp short 009D2C1C                ; 分支5


函数地址的解密:
申请空间写入patch代码:这里为1300000
BB 50 61 BC 00 90 89 1D 00 02 30 01 8B 3B 83 FF 00 74 0C 81 FF 00 00 00 01 7F 04 FF D7 90 90 83
C3 04 81 FB 64 74 BC 00 72 DC EB FE 00 00 8B 1D 00 02 30 01 EB E9 00 00 8B 1D 00 02 30 01 89 03
EB DD

2.2 然后在各个解密分支跟随下断,在patch代码的头部新建eip,F9,跟进各个分支patch.:
分支1:eax=4

009D2D4B    /EB 01            jmp short 009D2D4E
009D2D4E   8B46 04            mov eax,dword ptr ds:
009D2D51   EB 04            jmp short 009D2D57
009D2D57   3385 76F7A300      xor eax,dword ptr ss:
009D2D5D   EB 01            jmp short 009D2D60                        ; 特殊函数,jmp 130002E


分支2:eax=1

009D2CF9    /EB 02            jmp short 009D2CFD
009D2CFB    |51               push ecx
009D2CFC    |F2:                prefix repne:
009D2CFD    \6A 01            push 1
009D2CFF   6A 00            push 0
009D2D01   FF76 04            push dword ptr ds:
009D2D04   6A 00            push 0
009D2D06   FF37               push dword ptr ds:                                        ; hhctrl.#12
009D2D08   FF53 54            call dword ptr ds:                                     ; Obsidium.00457C80
009D2D0B   EB 02            jmp short 009D2D0F


分支3:eax=80

009D33AF    /EB 04            jmp short 009D33B5
...
009D33BF   83F8 1D            cmp eax,1D
009D33C2   EB 03            jmp short 009D33C7
009D33C7   ^\0F87 49FEFFFF      ja 009D3216
009D33CD   EB 04            jmp short 009D33D3
...
009D33E2   - FFE2               jmp edx                                ; 这个进入另一区段进行处理
....
009D3359   ^\FFE0               jmp eax                                ; 在这里下断,转向各个小分支

其中一个小分支如下代码:
009CEC45   55               push ebp
009CEC46   8BEC               mov ebp,esp
009CEC48   83EC 08            sub esp,8
009CEC4B   53               push ebx
009CEC4C   56               push esi
009CEC4D   57               push edi
009CEC4E   E8 00000000      call 009CEC53
009CEC53   5B               pop ebx                              
009CEC54   8BF3               mov esi,ebx
009CEC56   8B9B ADEDFFFF      mov ebx,dword ptr ds:
009CEC5C   8975 F8            mov dword ptr ss:,esi
009CEC5F   8DBE 85020000      lea edi,dword ptr ds:
009CEC65   BE 04000000      mov esi,4
009CEC6A   8B07               mov eax,dword ptr ds:
009CEC6C   85C0               test eax,eax
009CEC6E   74 14            je short 009CEC84
009CEC70   8D55 FC            lea edx,dword ptr ss:
009CEC73   FF75 08            push dword ptr ss:
009CEC76   52               push edx                                 
009CEC77   FFD0               call eax
009CEC79   83F8 01            cmp eax,1
009CEC7C   74 21            je short 009CEC9F
009CEC7E   83C7 04            add edi,4
009CEC81   4E               dec esi
009CEC82   ^ 75 E6            jnz short 009CEC6A
009CEC84   8B75 F8            mov esi,dword ptr ss:
009CEC87   FF75 08            push dword ptr ss:
009CEC8A   FFB6 15030000      push dword ptr ds:
009CEC90   FF93 84000000      call dword ptr ds:                ; mov eax,;jmp 1300038
009CEC96   5F               pop edi                  
009CEC97   5E               pop esi                           
009CEC98   5B               pop ebx                           
009CEC99   8BE5               mov esp,ebp
009CEC9B   5D               pop ebp                              
009CEC9C   C2 0400            retn 4


很多类似的结构,各个patch.

分支4:

009D3021   6A 00            push 0
009D3023   6A 45            push 45
009D3025   6A 00            push 0
009D3027   68 CC971025      push 251097CC
009D302C   FF37               push dword ptr ds:                                        ; KERNEL32.77E60000
009D302E   FF53 54            call dword ptr ds:                                     ; Obsidium.00457C80
009D3031   EB 04            jmp short 009D3037


分支5:

009D2C26   6A 01            push 1
009D2C28   50               push eax
009D2C29   6A 00            push 0
009D2C2B   FF76 04            push dword ptr ds:
009D2C2E   FF37               push dword ptr ds:               
009D2C30   FF53 54            call dword ptr ds:                      ; Obsidium.00457C80
009D2C33   EB 01            jmp short 009D2C36                                ; jmp 1300038


经过patch后,还有若干未知函数,有些在dll末尾,可以cut,有些手工恢复下,可参考1.3.6.4DEMO的.
然后fix dumped.exe得到dumped_.exe

3.stolen oep:

00A11620 1> /EB 10            jmp short 00A11632                                             ; 1_.00A11632
00A11622    |66:623A            bound di,dword ptr ds:
00A11625    |43               inc ebx
00A11626    |2B2B               sub ebp,dword ptr ds:
00A11628    |48               dec eax
00A11629    |4F               dec edi
00A1162A    |4F               dec edi
00A1162B    |4B               dec ebx
00A1162C    |90               nop
00A1162D   -|E9 28014B00      jmp 00EC175A
00A11632    \A1 8BE0B800      mov eax,dword ptr ds:                ; 这个地址可以参考相同程序进行定位
00A11637   C1E0 02            shl eax,2
00A1163A   A3 8FE0B800      mov dword ptr ds:,eax
00A1163F   52               push edx
00A11640   6A 00            push 0


保存为1_.exe

4.CODE_加密:
4.1第一种:

00A11BD7   68 01010000      push 101                             ; 长度
00A11BDC   FF15 E8104000      call dword ptr ds:         ; 1_.009D20FF,解密
...
00A11CE3   68 01010000      push 101
00A11CE8   FF15 EC104000      call dword ptr ds:            ; 1_.009D2593,再加密回去


解密用的代码:

009D2338   6A 0E            push 0E
009D233A   51               push ecx
009D233B   FF56 28            call dword ptr ds:      ; 1_.004530C6;这里进入解密
009D233E   EB 02            jmp short 009D2342                                             ; 1_.009D2342


从这里返回:

00453100   C2 1000            retn 10
...
009D247B    /EB 01            jmp short 009D247E                                             ; 1_.009D247E
009D247D    |51               push ecx
009D247E    \8BE5               mov esp,ebp
009D2480   5D               pop ebp                                                      ; KERNEL32.77E889D5
009D2481   C2 0400            retn 4


这个可以在长度地方新建eip,然后在009D2481下断,如果这个地址是变化的,那么在00453100先下断.F9后代码就出来了.
拷贝粘贴.然后把这对加密解密的代码nop掉.
或者写代码patch:

mov ecx,code_start
search:
        cmp byte,68
        jnz continue
        cmp dword,4010E8
        jnz continue
        mov ,ecx
        call ecx
patch_retn:
        mov ecx,
continue:
        add ecx,1
        cmp ecx,code_end
        jb search
        jmp finish

B9 65 57 A2 00 80 39 68 90 90 90 75 1D 81 79 07 E8 10 40 00 75 14 89 0D 00 B7 C8 00 FF D1 90 90
90 90 90 90 90 8B 0D 00 B7 C8 00 83 C1 01 81 F9 00 00 A8 00 72 CF EB FE


完成后保存为2_.exe

4.2 第2种:

00A14F88   68 1E140000      push 141E
00A14F8D   E8 45FBFBFF      call 009D4AD7                                                ; 1_.009D4AD7


解密后返回:

009D4E2F   64:67:8F06 0000    pop dword ptr fs:
009D4E35   EB 02            jmp short 009D4E39
009D4E37   E5 64            in eax,64
009D4E39   83C4 04            add esp,4
009D4E3C   EB 02            jmp short 009D4E40
009D4E3E   7A 2C            jpe short 009D4E6C
009D4E40   9D               popfd
009D4E41   EB 03            jmp short 009D4E46
009D4E43   13F8               adc edi,eax
009D4E45   1F               pop ds
009D4E46   61               popad
009D4E47   EB 04            jmp short 009D4E4D
009D4E4D   8BE5               mov esp,ebp
009D4E4F   5D               pop ebp
009D4E50   C2 0400            retn 4                                ; 然后返回到刚解密的地址,可以patch


再说下:这些申请的地址每次加载会有所不一样.

这个解密只能在原程序里搞,脱壳后老有异常.
断点
地址         模块       激活      反汇编                              注释
00A14F8D       3_         永远      call 009D4AD7
00A17C2B       3_         永远      call 009D4AD7
00A181C0       3_         永远      call 009D4AD7                ; 载入
00A18B80       3_         永远      call 009D4AD7
00A1EB2B       3_         永远      call 009D4AD7
00A3683A       3_         永远      call 009D4AD7
00A368F7       3_         永远      call 009D4AD7
00A36A13       3_         永远      call 009D4AD7
00A36A48       3_         永远      call 009D4AD7
00A36A7D       3_         永远      call 009D4AD7
00A36B24       3_         永远      call 009D4AD7
00A36C3A       3_         永远      call 009D4AD7
00A36CD7       3_         永远      call 009D4AD7
00A5C201       3_         永远      call 009D4AD7
00A65C07       3_         永远      call 009D4AD7
00A66B9E       3_         永远      call 009D4AD7
00A66F76       3_         永远      call 009D4AD7
00A672ED       3_         永远      call 009D4AD7
00A67792       3_         永远      call 009D4AD7
00A67AD8       3_         永远      call 009D4AD7
00A6CC80       3_         永远      call 009D4AD7
00A6CD19       3_         永远      call 009D4AD7
00A768F8       3_         永远      call 009D4AD7                ; 新建
00A76B34       3_         永远      call 009D4AD7

这些注册信息在这里用到:新建,载入,消除试用信息等.
完后保存为3_.exe.

5.SDK函数:
00B8C92C   - FF25 5061BC00      jmp dword ptr ds:        ; 注册信息
00B8C932   - FF25 5461BC00      jmp dword ptr ds:        ; 注册与否
00B8C938   - FF25 5861BC00      jmp dword ptr ds:        ; ???

如果要解决跨平台,需要搞定这3个注册函数.
这个略过.


6.补充:
最后发狠解决了重定位问题.因为图片较多,本人较懒,所以放在附件里.
这个需要解决SDK,否则加壳后程序有异常.

cyto 发表于 2009-6-10 08:10

在一蓑发了1.3.6.4的DEMO脱壳,突然想起52pj,老没发东西,有点过意不去啊.
于是对1.3.0.4老版的注册版进行yy.

estelle 发表于 2009-6-10 08:23

专家的贴 一定要顶

Hmily 发表于 2009-6-10 11:48

:lol恩,支持我爱我家~

jcmyt 发表于 2009-6-10 19:39

受教了 。呵呵

小糊涂虫 发表于 2009-6-10 20:16

一直对于文字教程的理解,不是很好~~
拿笔记录下来慢慢消化去~~~~
支持LZ,期待LZ的下一个精彩文章~~~~~~~

hdzhyy 发表于 2009-6-12 20:53

太厉害俩,基本看不懂。

写看不懂东西的大大都是高人。

sir 发表于 2009-6-13 18:56

终于见到好贴

封神之剑 发表于 2009-6-14 11:08

确实高人啊 可惜我看不懂 呵呵

秋天的爱 发表于 2009-6-15 08:19

学习了,谢谢发布,辛苦了
页: [1] 2 3
查看完整版本: Obsidium 1.3.0.4 注册版主程序脱壳