Hmily 发表于 2008-10-19 22:56

Obsidium V1.3.0.4加壳之VB脱壳

【文章标题】: Obsidium V1.3.0.4加壳之VB脱壳
【文章作者】: 夜凉如水
【作者邮箱】: Estelle@yeah.net
【作者QQ号】: 272227777
【软件名称】: 外挂
【下载地址】: 自己搜索下载
【加壳方式】: Obsidium V1.3.0.4 -> Obsidium Software * Sign.By.haggar *
【编写语言】: VB6.0
【使用工具】: OllyDBG 等等
【操作平台】: SP3黑屏版本
【软件介绍】: 几年前的外挂,整理硬盘的时候发现了就顺便脱壳这个版本已经过期了
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
几年前的外挂,整理硬盘的时候发现了就顺便脱壳,拿出来和大家分享分享,有不正确的地方请指教。外挂作者别杀我 呵呵开个玩笑


首先HideNtDebgBit,CheckRemoteDebuggerPresent,Process32Next三项勾上即可隐藏OD。不忽略内存访问异常

0043D000 沈> /EB 02    jmp short 0043D004//ep
0043D002|73 5A    jnb short 0043D05E
0043D004\E8 25000000call 0043D02E
0043D009 EB 04    jmp short 0043D00F
0043D00B 94   xchg eax, esp
0043D00C 6F   outs dx, dword ptr es:
0043D00D 01BF EB019F8Badd dword ptr , edi

shift+F9 第十二次

0043ED73 8911   mov dword ptr , edx
0043ED75 EB 01    jmp short 0043ED78
0043ED77 C7   ???            ; Unknown command
0043ED78 EB 01    jmp short 0043ED7B
0043ED7A 9E   sahf

堆栈

0012FF94 0012FFE0Pointer to next SEH record
0012FF98 0043F391SE handler//注意这里
0012FF9C 7C930208ntdll.7C930208

在命令行设断:bp 0043f391

按Shift+F9跳过异常来到:

0043F391 55   push ebp
0043F392 8BEC   mov ebp, esp
0043F394 90   nop
0043F395 90   nop
0043F396 90   nop
0043F397 90   nop
0043F398 8B4D 08    mov ecx, dword ptr
0043F39B 90   nop
0043F39C 90   nop
0043F39D 90   nop
0043F39E 90   nop

F8一路走来到这里:

0043F563 E8 CB000000call 0043F633//按一下F4即可走出这个循环
0043F568 ^ E2 EF    loopd short 0043F559
0043F56A 848A 8F8B1E7Atest byte ptr , cl

解码去除花指令后;

0043F563 90   nop
0043F564 90   nop
0043F565 90   nop
0043F566 90   nop
0043F567 90   nop
0043F568 90   nop
0043F569 90   nop
0043F56A 90   nop
0043F56B 90   nop
0043F56C FF96 A0010000call dword ptr
0043F572 90   nop
0043F573 90   nop
0043F574 90   nop
0043F575 90   nop
0043F576 90   nop
0043F577 90   nop
0043F578 90   nop
0043F579 90   nop
0043F57A 90   nop
0043F57B 8B7E 04    mov edi, dword ptr
0043F57E 90   nop
0043F57F 90   nop
0043F580 90   nop
0043F581 FFB6 54010000push dword ptr
0043F587 FF96 84000000call dword ptr
0043F58D 90   nop
0043F58E 90   nop
0043F58F 90   nop
0043F590 90   nop
0043F591 25 FF030000and eax, 3FF
0043F596 90   nop
0043F597 90   nop
0043F598 90   nop
0043F599 90   nop
0043F59A 8DBC07 00010000lea edi, dword ptr
0043F5A1 90   nop
0043F5A2 90   nop
0043F5A3 90   nop
0043F5A4 90   nop
0043F5A5 90   nop
0043F5A6 90   nop
0043F5A7 56   push esi
0043F5A8 90   nop
0043F5A9 90   nop
0043F5AA 90   nop
0043F5AB 90   nop
0043F5AC 90   nop
0043F5AD 57   push edi
0043F5AE 90   nop
0043F5AF 90   nop
0043F5B0 90   nop
0043F5B1 90   nop
0043F5B2 90   nop
0043F5B3 90   nop
0043F5B4 8DB5 A133EE00lea esi, dword ptr
0043F5BA 90   nop
0043F5BB 90   nop
0043F5BC 90   nop
0043F5BD 90   nop
0043F5BE B9 93000000mov ecx, 93
0043F5C3 90   nop
0043F5C4 90   nop
0043F5C5 90   nop
0043F5C6 F3:A4    rep movs byte ptr es:, byte ptr>//这里F7 F8步过
0043F5C8 90   nop
0043F5C9 90   nop
0043F5CA 90   nop
0043F5CB 90   nop
0043F5CC 5F   pop edi
0043F5CD 90   nop
0043F5CE 90   nop
0043F5CF 90   nop
0043F5D0 5E   pop esi
0043F5D1 90   nop
0043F5D2 90   nop
0043F5D3 90   nop
0043F5D4 90   nop
0043F5D5 90   nop
0043F5D6 90   nop
0043F5D7 90   nop
0043F5D8 90   nop
0043F5D9 90   nop
0043F5DA 90   nop
0043F5DB 90   nop
0043F5DC 90   nop
0043F5DD 8D85 EF34EE00lea eax, dword ptr
0043F5E3 90   nop
0043F5E4 90   nop
0043F5E5 90   nop
0043F5E6 90   nop
0043F5E7 90   nop
0043F5E8 68 80000000push 80
0043F5ED 50   push eax
0043F5EE FF76 04    push dword ptr
0043F5F1 FF76 20    push dword ptr
0043F5F4 FF96 84000000call dword ptr
0043F5FA 90   nop
0043F5FB 90   nop
0043F5FC 90   nop
0043F5FD 6A 7E    push 7E
0043F5FF 57   push edi
0043F600 50   push eax
0043F601 FF76 04    push dword ptr
0043F604 FF76 28    push dword ptr
0043F607 FF96 84000000call dword ptr
0043F60D 90   nop
0043F60E 90   nop
0043F60F 90   nop
0043F610 90   nop
0043F611 90   nop
0043F612 FFE7   jmp edi //F7 跟进


0093C799 E8 00000000call 0093C79E //
0093C79E EB 01    jmp short 0093C7A1
0093C7A0 AF   scas dword ptr es:
0093C7A1 5D   pop ebp
0093C7A2 EB 03    jmp short 0093C7A7
0093C7A4 A2 719D81EDmov byte ptr , al
0093C7A9 A6   cmps byte ptr , byte ptr es:[ed>
0093C7AA 33EE   xor ebp, esi
0093C7AC 00EB   add bl, ch
0093C7AE 04 1B    add al, 1B
0093C7B0 94   xchg eax, esp

一路F7 来到这里

0093C80C - E9 D448ACFFjmp 沈阳四冲.004010E5 //
0093C811 90   nop
0093C812 90   nop
0093C813 90   nop
0093C814 90   nop
0093C815 90   nop
0093C816 90   nop

看堆栈

0012FFC0 00406E80沈阳四冲.00406E80//注意这里以后要用到

F7 跟进

00401066 - FF25 2C104000jmp dword ptr
0040106C - FF25 08104000jmp dword ptr
00401072 - FF25 10104000jmp dword ptr
00401078 - FF25 04104000jmp dword ptr
0040107E - FF25 48104000jmp dword ptr
00401084 - FF25 50104000jmp dword ptr
0040108A - FF25 38104000jmp dword ptr
00401090 - FF25 28104000jmp dword ptr
00401096 - FF25 3C104000jmp dword ptr
0040109C - FF25 4C104000jmp dword ptr
004010A2 - FF25 30104000jmp dword ptr
004010A8 - FF25 0C104000jmp dword ptr
004010AE - FF25 40104000jmp dword ptr
004010B4 - FF25 24104000jmp dword ptr
004010BA - FF25 34104000jmp dword ptr
004010C0 - FF25 20104000jmp dword ptr
004010C6 - FF25 14104000jmp dword ptr
004010CC - FF25 1C104000jmp dword ptr
004010D2 - FF25 00104000jmp dword ptr
004010D8 - FF25 44104000jmp dword ptr
004010DE 0000   add byte ptr , al
004010E0 60   pushad
004010E1 AE   scas byte ptr es:
004010E2 ^ 74 E2    je short 004010C6
004010E4 CB   retf
004010E5 E8 EEFFFFFFcall 004010D8 //来到这里


VB偸的比较少

Stole code push 00406E80

补上代码后:

004010E068 806E4000push 00406E80
004010E5E8 EEFFFFFFcall 004010D8
004010EA0000   add byte ptr , al


运行LordPE,完全Dump这个进程。发现IAT都加密了 现在来处理IAT


重新加载程序

许多壳对VB保护不佳。Obsidium也没有对这个程序使用上特色重定位功能,因此我们直接去搞定输入表了。
修改完上面几处去除反跟踪后,Ctrl+G:IsProcessorFeaturePresent

7C80AEBA ke>8BFF   mov edi, edi
7C80AEBC55   push ebp
7C80AEBD8BEC   mov ebp, esp
7C80AEBF8B45 08    mov eax, dword ptr
7C80AEC283F8 40    cmp eax, 40
7C80AEC573 0B    jnb short 7C80AED2
7C80AEC70FB680 7402FE7Fmovzx eax, byte ptr
7C80AECE5D   pop ebp
7C80AECFC2 0400    retn 4 ////在函数末尾下断,避开壳的检测。Shift+F9中断后取消断点


在PE Header下面的第2区段设置内存访问断点。Shift+F9中断下来取消断点


00937FCA893E   mov dword ptr , edi//这里
00937FCC90   nop
00937FCD90   nop
00937FCE90   nop
00937FCF83C7 0C    add edi, 0C
00937FD290   nop
00937FD390   nop
00937FD490   nop
00937FD590   nop
00937FD683C6 04    add esi, 4
00937FD990   nop
00937FDA90   nop
00937FDB90   nop
00937FDC90   nop
00937FDD90   nop

下面关于还原IAT代码的修改,我直接借鉴前人有关OB脱壳文章中的方法,仍然有效

Ctrl+F在整个段块搜索命令:test word ptr ds:,20


00937D3C66:F706 2000 test word ptr , 20

修改 test word ptr ds:,8

00937D4190   nop
00937D4290   nop
00937D4390   nop
00937D440F84 93000000je 00937DDD

修改为 JE 00937ddd

00937D4A90   nop
00937D4B90   nop
00937D4C90   nop
00937D4D90   nop
00937D4E90   nop
00937D4F90   nop
00937D5066:F706 0200 test word ptr , 2
00937D5590   nop
00937D5690   nop
00937D5790   nop
00937D5890   nop
00937D5990   nop
00937D5A75 47    jnz short 00937DA3
00937D5C90   nop
00937D5D90   nop
00937D5E90   nop
00937D5F90   nop
00937D6090   nop
00937D6190   nop
00937D6290   nop
00937D6390   nop
00937D6490   nop
00937D6590   nop
00937D6633C0   xor eax, eax
00937D6890   nop
00937D6990   nop
00937D6A90   nop
00937D6B66:C706 0400 mov word ptr , 4
00937D7090   nop
00937D7190   nop
00937D7290   nop
00937D7390   nop
00937D7490   nop
00937D7590   nop
00937D766A 01    push 1
00937D7850   push eax
00937D79FF76 04    push dword ptr
00937D7C50   push eax
00937D7DFF75 18    push dword ptr
00937D80FF53 54    call dword ptr
00937D8390   nop
00937D8490   nop
00937D8590   nop
00937D8690   nop
00937D8785C0   test eax, eax
00937D8990   nop
00937D8A90   nop
00937D8B90   nop
00937D8C90   nop
00937D8D0F84 86000000je 00937E19

修改为 JNE 00937dd

00937D9390   nop
00937D9490   nop
00937D9590   nop
00937D9690   nop
00937D9790   nop
00937D9890   nop
00937D998907   mov dword ptr , eax
00937D9B90   nop
00937D9C90   nop
00937D9D90   nop
00937D9EEB 3D    jmp short 00937DDD
00937DA090   nop
00937DA190   nop
00937DA290   nop
00937DA390   nop
00937DA490   nop
00937DA590   nop
00937DA690   nop
00937DA790   nop
00937DA866:C706 0400 mov word ptr , 4
00937DAD90   nop
00937DAE90   nop
00937DAF90   nop
00937DB090   nop
00937DB10FB756 02movzx edx, word ptr
00937DB590   nop
00937DB690   nop
00937DB790   nop
00937DB890   nop
00937DB96A 01    push 1
00937DBB52   push edx
00937DBC6A 00    push 0
00937DBEFF76 04    push dword ptr
00937DC1FF75 18    push dword ptr
00937DC4FF53 54    call dword ptr
00937DC790   nop
00937DC890   nop
00937DC990   nop
00937DCA90   nop
00937DCB90   nop
00937DCC85C0   test eax, eax
00937DCE90   nop
00937DCF90   nop
00937DD090   nop
00937DD174 46    je short 00937E19

修改为 JNE 00937dd


00937DD390   nop
00937DD490   nop
00937DD590   nop
00937DD68907   mov dword ptr , eax
00937DD890   nop
00937DD990   nop
00937DDA90   nop
00937DDB90   nop
00937DDC90   nop
00937DDD90   nop
00937DDE90   nop
00937DDF90   nop
00937DE083C6 08    add esi, 8
00937DE390   nop
00937DE490   nop
00937DE590   nop
00937DE690   nop
00937DE783C7 04    add edi, 4
00937DEA90   nop
00937DEB90   nop
00937DEC90   nop
00937DED90   nop
00937DEE90   nop
00937DEF90   nop
00937DF0FF4D 08    dec dword ptr
00937DF390   nop
00937DF490   nop
00937DF590   nop
00937DF6^ 0F85 3CFFFFFFjnz 00937D38
00937DFC90   nop
00937DFD90   nop
00937DFE90   nop
00937DFF90   nop
00937E0090   nop
00937E0133C0   xor eax, eax
00937E0390   nop
00937E0490   nop
00937E0590   nop
00937E0690   nop
00937E0740   inc eax
00937E0890   nop
00937E0990   nop
00937E0A90   nop
00937E0B90   nop
00937E0C90   nop
00937E0D90   nop
00937E0E5F   pop edi
00937E0F5E   pop esi
00937E105B   pop ebx
00937E115D   pop ebp
00937E12C2 1400    retn 14



在00937e12处下断,Shift+F9后输入表处理完毕
在00401000处向下查看,可以发现结束地址是00401050
运行ImportREC,选择这个进程,填入RVA=00001000、Size=00000050,获取输入表后发现有一个无效指针

0040100066103C99MSVBVM60.MethCallEngine
00401004660E657BMSVBVM60.rtcAnsiValueBstr
00401008660DC5F3MSVBVM60.rtcMsgBox
0040100C660E6AE5MSVBVM60.rtcTrimVar
00401010660E64F3MSVBVM60.rtcMidCharVar
00401014660C9A94MSVBVM60.EVENT_SINK_AddRef
00401018003F0048
0040101C660C9AA7MSVBVM60.EVENT_SINK_Release
00401020660C99A5MSVBVM60.EVENT_SINK_QueryInterface
00401024660E3CA4MSVBVM60.__vbaExceptHandler
00401028660E73BAMSVBVM60.rtcStringVar
0040102C660E0408MSVBVM60.rtcVarBstrFromAnsi
00401030660E8456MSVBVM60.rtcStrConvVar2
00401034660FD05DMSVBVM60.ProcCallEngine
00401038660D4F71MSVBVM60.rtcDir
0040103C660E0833MSVBVM60.rtcHexVarFromVar
00401040660DCFA4MSVBVM60.rtcImmediateIf
004010446600357CMSVBVM60.ThunRTMain
00401048660E6271MSVBVM60.rtcLeftCharVar
0040104C660E6375MSVBVM60.rtcRightCharVar
00401050660D2DD4MSVBVM60.rtcR8ValFromBstr


VB的东东一般加密的特殊函数是DllFunctionCall。处理方法很简单 跟踪就可以得到。


修正ImportREC里面的OEP RVA=004010E0 ,ait RAV= 401000 SIZE= 50FixDump,终于整理完毕了.





--------------------------------------------------------------------------------
【经验总结】
Obsidium 并不可怕 只要你有耐心 文章写得比较乱对付看吧 破解自己去研究就不写

--------------------------------------------------------------------------------
【版权声明】: 本文原创于Unpack论坛, 转载请注明作者并保持文章的完整, 谢谢!
                   2008年10月19日 15:37:42

unpack 发表于 2008-10-23 12:38

被看到了来膜拜学习了 没见过,看到大世界了

上帝不在爱我 发表于 2008-10-30 23:51

这个鸟壳只是冷了点,其强度还算不错,手脱的话还不会,看下大牛的文章!

chen886 发表于 2008-12-29 03:46

要是,能做一个 视频就更好了`

wangxvfeng101 发表于 2008-12-31 12:27

来到最后一次异常,
cpu:
009507B0    F7F0            DIV EAX
009507B2    EB 03         JMP SHORT 009507B7
009507B4    9A EC2FEB02 E76>CALL FAR 62E7:02EB2FEC                   ; 远调用

堆栈:
0012FA74   7C9232A8ntdll.7C9232A8
0012FA78   0012FA9C指向下一个 SEH 记录的指针
0012FA7C   009506F8SE 处理器
0012FA80   00000000
0012FA84/0012FAA8
0012FA88|7C9232A8返回到 ntdll.7C9232A8

断到此里:
009506F8    55            PUSH EBP
009506F9    8BEC            MOV EBP,ESP
009506FB    90            NOP
009506FC    90            NOP
009506FD    90            NOP
009506FE    90            NOP
009506FF    E8 00000000   CALL 00950704
00950704    90            NOP
00950705    90            NOP
00950706    90            NOP
00950707    5A            POP EDX
00950708    90            NOP
00950709    90            NOP
0095070A    90            NOP
0095070B    8B4D 10         MOV ECX,DWORD PTR SS:
0095070E    90            NOP
0095070F    90            NOP
00950710    90            NOP
00950711    8D92 D0000000   LEA EDX,DWORD PTR DS:
00950717    90            NOP
00950718    90            NOP
00950719    90            NOP
0095071A    90            NOP
0095071B    33C0            XOR EAX,EAX
0095071D    90            NOP
0095071E    90            NOP
0095071F    90            NOP
00950720    90            NOP
00950721    90            NOP
00950722    8991 B8000000   MOV DWORD PTR DS:,EDX
00950728    90            NOP
00950729    90            NOP
0095072A    90            NOP
0095072B    90            NOP
0095072C    90            NOP
0095072D    90            NOP
0095072E    90            NOP
0095072F    90            NOP
00950730    90            NOP
00950731    90            NOP
00950732    90            NOP
00950733    90            NOP
00950734    90            NOP
00950735    90            NOP
00950736    8941 04         MOV DWORD PTR DS:,EAX
00950739    90            NOP
0095073A    90            NOP
0095073B    90            NOP
0095073C    8941 0C         MOV DWORD PTR DS:,EAX
0095073F    90            NOP
00950740    90            NOP
00950741    90            NOP
00950742    90            NOP
00950743    90            NOP
00950744    8941 08         MOV DWORD PTR DS:,EAX
00950747    90            NOP
00950748    90            NOP
00950749    90            NOP
0095074A    8941 10         MOV DWORD PTR DS:,EAX
0095074D    90            NOP
0095074E    90            NOP
0095074F    90            NOP
00950750    90            NOP
00950751    90            NOP
00950752    90            NOP
00950753    C741 18 5500333>MOV DWORD PTR DS:,33330055
0095075A    90            NOP
0095075B    90            NOP
0095075C    90            NOP
0095075D    90            NOP
0095075E    90            NOP
0095075F    90            NOP
00950760    90            NOP
00950761    5D            POP EBP
00950762    C3            RETN      单步f8到这里:0012F6B0   7C9232A8返回到ntdll.7C9232A8
然后呢

wgz001 发表于 2009-1-1 12:38

00950722    8991 B8000000   MOV DWORD PTR DS:,EDX
ctrl +G去EDX里的地址

wangxvfeng101 发表于 2009-1-1 14:14

谢谢 wgz001
您说的是对付Obsidium V1.2的方法吧,Obsidium V1.3这个方法貌似是不行.
1.3的版本我想是这个样子的,申请一片内存把代码放到这个堆上来而原来的代码段,直到程序运行起来都是空数据.这是和1.2最大的区别.(我是这样想的,不知对不对)

wgz001 发表于 2009-1-1 14:24

楼上客气了
俺也菜鸟   看看超大的教程吧http://bbs.52pojie.cn/thread-14016-1-1.html]http://bbs.52pojie.cn/thread-14016-1-1.html
页: [1]
查看完整版本: Obsidium V1.3.0.4加壳之VB脱壳