好友
阅读权限255
听众
最后登录1970-1-1
|
Hmily
发表于 2008-10-19 22:56
【文章标题】: Obsidium V1.3.0.4加壳之VB脱壳
【文章作者】: 夜凉如水
【作者邮箱】: Estelle@yeah.net
【作者QQ号】: 272227777
【软件名称】: 外挂
【下载地址】: 自己搜索下载
【加壳方式】: Obsidium V1.3.0.4 -> Obsidium Software * Sign.By.haggar [Overlay] *
【编写语言】: VB6.0
【使用工具】: OllyDbg 等等
【操作平台】: SP3黑屏版本
【软件介绍】: 几年前的外挂,整理硬盘的时候发现了就顺便脱壳这个版本已经过期了
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
几年前的外挂,整理硬盘的时候发现了就顺便脱壳,拿出来和大家分享分享,有不正确的地方请指教。外挂作者别杀我 呵呵开个玩笑
首先HideNtDebgBit,CheckRemoteDebuggerPresent,Process32Next三项勾上即可隐藏OD。不忽略内存访问异常
0043D000 沈> /EB 02 jmp short 0043D004//ep
0043D002 |73 5A jnb short 0043D05E
0043D004 \E8 25000000 call 0043D02E
0043D009 EB 04 jmp short 0043D00F
0043D00B 94 xchg eax, esp
0043D00C 6F outs dx, dword ptr es:[edi]
0043D00D 01BF EB019F8B add dword ptr [edi+8B9F01EB], edi
shift+F9 第十二次
0043ED73 8911 mov dword ptr [ecx], 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 [ebp+8]
0043F39B 90 nop
0043F39C 90 nop
0043F39D 90 nop
0043F39E 90 nop
F8一路走来到这里:
0043F563 E8 CB000000 call 0043F633//按一下F4即可走出这个循环
0043F568 ^ E2 EF loopd short 0043F559
0043F56A 848A 8F8B1E7A test byte ptr [edx+7A1E8B8F], 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 A0010000 call dword ptr [esi+1A0]
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 [esi+4]
0043F57E 90 nop
0043F57F 90 nop
0043F580 90 nop
0043F581 FFB6 54010000 push dword ptr [esi+154]
0043F587 FF96 84000000 call dword ptr [esi+84]
0043F58D 90 nop
0043F58E 90 nop
0043F58F 90 nop
0043F590 90 nop
0043F591 25 FF030000 and eax, 3FF
0043F596 90 nop
0043F597 90 nop
0043F598 90 nop
0043F599 90 nop
0043F59A 8DBC07 00010000lea edi, dword ptr [edi+eax+100]
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 A133EE00 lea esi, dword ptr [ebp+EE33A1]
0043F5BA 90 nop
0043F5BB 90 nop
0043F5BC 90 nop
0043F5BD 90 nop
0043F5BE B9 93000000 mov ecx, 93
0043F5C3 90 nop
0043F5C4 90 nop
0043F5C5 90 nop
0043F5C6 F3:A4 rep movs byte ptr es:[edi], 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 EF34EE00 lea eax, dword ptr [ebp+EE34EF]
0043F5E3 90 nop
0043F5E4 90 nop
0043F5E5 90 nop
0043F5E6 90 nop
0043F5E7 90 nop
0043F5E8 68 80000000 push 80
0043F5ED 50 push eax
0043F5EE FF76 04 push dword ptr [esi+4]
0043F5F1 FF76 20 push dword ptr [esi+20]
0043F5F4 FF96 84000000 call dword ptr [esi+84]
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 [esi+4]
0043F604 FF76 28 push dword ptr [esi+28]
0043F607 FF96 84000000 call dword ptr [esi+84]
0043F60D 90 nop
0043F60E 90 nop
0043F60F 90 nop
0043F610 90 nop
0043F611 90 nop
0043F612 FFE7 jmp edi //F7 跟进
0093C799 E8 00000000 call 0093C79E //
0093C79E EB 01 jmp short 0093C7A1
0093C7A0 AF scas dword ptr es:[edi]
0093C7A1 5D pop ebp
0093C7A2 EB 03 jmp short 0093C7A7
0093C7A4 A2 719D81ED mov byte ptr [ED819D71], al
0093C7A9 A6 cmps byte ptr [esi], 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 D448ACFF jmp 沈阳四冲.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 2C104000 jmp dword ptr [40102C]
0040106C - FF25 08104000 jmp dword ptr [401008]
00401072 - FF25 10104000 jmp dword ptr [401010]
00401078 - FF25 04104000 jmp dword ptr [401004]
0040107E - FF25 48104000 jmp dword ptr [401048]
00401084 - FF25 50104000 jmp dword ptr [401050]
0040108A - FF25 38104000 jmp dword ptr [401038]
00401090 - FF25 28104000 jmp dword ptr [401028]
00401096 - FF25 3C104000 jmp dword ptr [40103C]
0040109C - FF25 4C104000 jmp dword ptr [40104C]
004010A2 - FF25 30104000 jmp dword ptr [401030]
004010A8 - FF25 0C104000 jmp dword ptr [40100C]
004010AE - FF25 40104000 jmp dword ptr [401040]
004010B4 - FF25 24104000 jmp dword ptr [401024]
004010BA - FF25 34104000 jmp dword ptr [401034]
004010C0 - FF25 20104000 jmp dword ptr [401020]
004010C6 - FF25 14104000 jmp dword ptr [401014]
004010CC - FF25 1C104000 jmp dword ptr [40101C]
004010D2 - FF25 00104000 jmp dword ptr [401000]
004010D8 - FF25 44104000 jmp dword ptr [401044]
004010DE 0000 add byte ptr [eax], al
004010E0 60 pushad
004010E1 AE scas byte ptr es:[edi]
004010E2 ^ 74 E2 je short 004010C6
004010E4 CB retf
004010E5 E8 EEFFFFFF call 004010D8 //来到这里
VB偸的比较少
Stole code push 00406E80
补上代码后:
004010E0 68 806E4000 push 00406E80
004010E5 E8 EEFFFFFF call 004010D8
004010EA 0000 add byte ptr [eax], al
运行LordPE,完全Dump这个进程。发现IAT都加密了 现在来处理IAT
重新加载程序
许多壳对VB保护不佳。Obsidium也没有对这个程序使用上特色重定位功能,因此我们直接去搞定输入表了。
修改完上面几处去除反跟踪后,Ctrl+G:IsProcessorFeaturePresent
7C80AEBA ke>8BFF mov edi, edi
7C80AEBC 55 push ebp
7C80AEBD 8BEC mov ebp, esp
7C80AEBF 8B45 08 mov eax, dword ptr [ebp+8]
7C80AEC2 83F8 40 cmp eax, 40
7C80AEC5 73 0B jnb short 7C80AED2
7C80AEC7 0FB680 7402FE7Fmovzx eax, byte ptr [eax+7FFE0274]
7C80AECE 5D pop ebp
7C80AECF C2 0400 retn 4 ////在函数末尾下断,避开壳的检测。Shift+F9中断后取消断点
在PE Header下面的第2区段设置内存访问断点。Shift+F9中断下来取消断点
00937FCA 893E mov dword ptr [esi], edi//这里
00937FCC 90 nop
00937FCD 90 nop
00937FCE 90 nop
00937FCF 83C7 0C add edi, 0C
00937FD2 90 nop
00937FD3 90 nop
00937FD4 90 nop
00937FD5 90 nop
00937FD6 83C6 04 add esi, 4
00937FD9 90 nop
00937FDA 90 nop
00937FDB 90 nop
00937FDC 90 nop
00937FDD 90 nop
下面关于还原IAT代码的修改,我直接借鉴前人有关OB脱壳文章中的方法,仍然有效
Ctrl+F在整个段块搜索命令:test word ptr ds:[esi],20
00937D3C 66:F706 2000 test word ptr [esi], 20
修改 test word ptr ds:[esi],8
00937D41 90 nop
00937D42 90 nop
00937D43 90 nop
00937D44 0F84 93000000 je 00937DDD
修改为 JE 00937ddd
00937D4A 90 nop
00937D4B 90 nop
00937D4C 90 nop
00937D4D 90 nop
00937D4E 90 nop
00937D4F 90 nop
00937D50 66:F706 0200 test word ptr [esi], 2
00937D55 90 nop
00937D56 90 nop
00937D57 90 nop
00937D58 90 nop
00937D59 90 nop
00937D5A 75 47 jnz short 00937DA3
00937D5C 90 nop
00937D5D 90 nop
00937D5E 90 nop
00937D5F 90 nop
00937D60 90 nop
00937D61 90 nop
00937D62 90 nop
00937D63 90 nop
00937D64 90 nop
00937D65 90 nop
00937D66 33C0 xor eax, eax
00937D68 90 nop
00937D69 90 nop
00937D6A 90 nop
00937D6B 66:C706 0400 mov word ptr [esi], 4
00937D70 90 nop
00937D71 90 nop
00937D72 90 nop
00937D73 90 nop
00937D74 90 nop
00937D75 90 nop
00937D76 6A 01 push 1
00937D78 50 push eax
00937D79 FF76 04 push dword ptr [esi+4]
00937D7C 50 push eax
00937D7D FF75 18 push dword ptr [ebp+18]
00937D80 FF53 54 call dword ptr [ebx+54]
00937D83 90 nop
00937D84 90 nop
00937D85 90 nop
00937D86 90 nop
00937D87 85C0 test eax, eax
00937D89 90 nop
00937D8A 90 nop
00937D8B 90 nop
00937D8C 90 nop
00937D8D 0F84 86000000 je 00937E19
修改为 JNE 00937dd
00937D93 90 nop
00937D94 90 nop
00937D95 90 nop
00937D96 90 nop
00937D97 90 nop
00937D98 90 nop
00937D99 8907 mov dword ptr [edi], eax
00937D9B 90 nop
00937D9C 90 nop
00937D9D 90 nop
00937D9E EB 3D jmp short 00937DDD
00937DA0 90 nop
00937DA1 90 nop
00937DA2 90 nop
00937DA3 90 nop
00937DA4 90 nop
00937DA5 90 nop
00937DA6 90 nop
00937DA7 90 nop
00937DA8 66:C706 0400 mov word ptr [esi], 4
00937DAD 90 nop
00937DAE 90 nop
00937DAF 90 nop
00937DB0 90 nop
00937DB1 0FB756 02 movzx edx, word ptr [esi+2]
00937DB5 90 nop
00937DB6 90 nop
00937DB7 90 nop
00937DB8 90 nop
00937DB9 6A 01 push 1
00937DBB 52 push edx
00937DBC 6A 00 push 0
00937DBE FF76 04 push dword ptr [esi+4]
00937DC1 FF75 18 push dword ptr [ebp+18]
00937DC4 FF53 54 call dword ptr [ebx+54]
00937DC7 90 nop
00937DC8 90 nop
00937DC9 90 nop
00937DCA 90 nop
00937DCB 90 nop
00937DCC 85C0 test eax, eax
00937DCE 90 nop
00937DCF 90 nop
00937DD0 90 nop
00937DD1 74 46 je short 00937E19
修改为 JNE 00937dd
00937DD3 90 nop
00937DD4 90 nop
00937DD5 90 nop
00937DD6 8907 mov dword ptr [edi], eax
00937DD8 90 nop
00937DD9 90 nop
00937DDA 90 nop
00937DDB 90 nop
00937DDC 90 nop
00937DDD 90 nop
00937DDE 90 nop
00937DDF 90 nop
00937DE0 83C6 08 add esi, 8
00937DE3 90 nop
00937DE4 90 nop
00937DE5 90 nop
00937DE6 90 nop
00937DE7 83C7 04 add edi, 4
00937DEA 90 nop
00937DEB 90 nop
00937DEC 90 nop
00937DED 90 nop
00937DEE 90 nop
00937DEF 90 nop
00937DF0 FF4D 08 dec dword ptr [ebp+8]
00937DF3 90 nop
00937DF4 90 nop
00937DF5 90 nop
00937DF6 ^ 0F85 3CFFFFFF jnz 00937D38
00937DFC 90 nop
00937DFD 90 nop
00937DFE 90 nop
00937DFF 90 nop
00937E00 90 nop
00937E01 33C0 xor eax, eax
00937E03 90 nop
00937E04 90 nop
00937E05 90 nop
00937E06 90 nop
00937E07 40 inc eax
00937E08 90 nop
00937E09 90 nop
00937E0A 90 nop
00937E0B 90 nop
00937E0C 90 nop
00937E0D 90 nop
00937E0E 5F pop edi
00937E0F 5E pop esi
00937E10 5B pop ebx
00937E11 5D pop ebp
00937E12 C2 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 |
|