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,否则加壳后程序有异常. 在一蓑发了1.3.6.4的DEMO脱壳,突然想起52pj,老没发东西,有点过意不去啊.
于是对1.3.0.4老版的注册版进行yy. 专家的贴 一定要顶 :lol恩,支持我爱我家~ 受教了 。呵呵 一直对于文字教程的理解,不是很好~~
拿笔记录下来慢慢消化去~~~~
支持LZ,期待LZ的下一个精彩文章~~~~~~~ 太厉害俩,基本看不懂。
写看不懂东西的大大都是高人。 终于见到好贴 确实高人啊 可惜我看不懂 呵呵 学习了,谢谢发布,辛苦了