吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11986|回复: 23
收起左侧

[原创] Obsidium 1.3.0.4 注册版主程序脱壳

  [复制链接]
cyto 发表于 2009-6-10 08:07
本帖最后由 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:
00BC6150  00CD0000
00BC6154  00CD000C
00BC6158  00CD0018
00BC615C  00CD0024
00BC6160  00000000
00BC6164  00000000
00BC6168  00CD0030
00BC616C  00CD003C
00BC6170  00000000
00BC6174  00000000
00BC6178  00000000
...
00BC618C  00000000
00BC6190  00000000
00BC6194  0111FC80  keygen.ConvertToBin
00BC6198  0111FBE0  keygen.ConvertToString
00BC619C  0111EEC0  offset keygen.GenerateKeyfile
00BC61A0  0111E7F0  offset keygen.GenerateShortKey
00BC61A4  0111E000  offset keygen.SKGen
00BC61A8  0111DFC0  offset keygen.UPRNG
00BC61AC  0111F630  keygen.VerifyKeyfile
00BC61B0  0111E0C0  offset keygen.VerifyShortKey
00BC61B4  00CD00A8
00BC61B8  00000000
00BC61BC  00000000
...
00BC7450  00CD1CCA
00BC7454  00CD1CD6
00BC7458  00CD1CE2
00BC745C  00CD1CEE
00BC7460  00CD1CFA
00BC7464  00000000
00BC7468  00000000
00BC746C  00000000

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

2.1 iat解密:
以下代码可能因为重新加载而导致地址不一样,以代码为准.
009D2B98     837F 04 00         cmp dword ptr ds:[edi+4],0
009D2B9C     EB 02              jmp short 009D2BA0
009D2B9E     5F                 pop edi                                                        ; 00CD0000
009D2B9F     AA                 stos byte ptr es:[edi]
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:[esi+4]
009D2D51     EB 04              jmp short 009D2D57
009D2D57     3385 76F7A300      xor eax,dword ptr ss:[ebp+A3F776]
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:[esi+4]
009D2D04     6A 00              push 0
009D2D06     FF37               push dword ptr ds:[edi]                                        ; hhctrl.#12
009D2D08     FF53 54            call dword ptr ds:[ebx+54]                                     ; 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:[ebx-1253]
009CEC5C     8975 F8            mov dword ptr ss:[ebp-8],esi
009CEC5F     8DBE 85020000      lea edi,dword ptr ds:[esi+285]
009CEC65     BE 04000000        mov esi,4
009CEC6A     8B07               mov eax,dword ptr ds:[edi]
009CEC6C     85C0               test eax,eax
009CEC6E     74 14              je short 009CEC84
009CEC70     8D55 FC            lea edx,dword ptr ss:[ebp-4]
009CEC73     FF75 08            push dword ptr ss:[ebp+8]
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:[ebp-8]
009CEC87     FF75 08            push dword ptr ss:[ebp+8]
009CEC8A     FFB6 15030000      push dword ptr ds:[esi+315]
009CEC90     FF93 84000000      call dword ptr ds:[ebx+84]                ; mov eax,[esp];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:[edi]                                        ; KERNEL32.77E60000
009D302E     FF53 54            call dword ptr ds:[ebx+54]                                     ; 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:[esi+4]
009D2C2E     FF37               push dword ptr ds:[edi]               
009D2C30     FF53 54            call dword ptr ds:[ebx+54]                      ; 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:[edx]
00A11625    |43                 inc ebx
00A11626    |2B2B               sub ebp,dword ptr ds:[ebx]
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:[B8E08B]                ; 这个地址可以参考相同程序进行定位
00A11637     C1E0 02            shl eax,2
00A1163A     A3 8FE0B800        mov dword ptr ds:[B8E08F],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:[4010E8]           ; 1_.009D20FF,解密
...
00A11CE3     68 01010000        push 101
00A11CE8     FF15 EC104000      call dword ptr ds:[4010EC]            ; 1_.009D2593,再加密回去


解密用的代码:
009D2338     6A 0E              push 0E
009D233A     51                 push ecx
009D233B     FF56 28            call dword ptr ds:[esi+28]      ; 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[ecx],68
        jnz continue
        cmp dword[ecx+7],4010E8
        jnz continue
        mov [addr],ecx
        call ecx
patch_retn:
        mov ecx,[addr]
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:[0]
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:[BC6150]        ; 注册信息
00B8C932   - FF25 5461BC00      jmp dword ptr ds:[BC6154]        ; 注册与否
00B8C938   - FF25 5861BC00      jmp dword ptr ds:[BC6158]        ; ???

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


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

解决重定位.rar

29.17 KB, 下载次数: 47, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 1威望 +1 收起 理由
CHHSun + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
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
学习了,谢谢发布,辛苦了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-6 19:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表