找回密码
 注册
搜索
热搜: 回贴

Obsidium1.2.5.0主程序脱壳记录点滴,Obsidium,脱壳技术

2010-1-30 18:21| 发布者: admin| 查看: 75| 评论: 0|原作者: 千年缘


Obsidium1.2.5.0主程序脱壳记录点滴,Obsidium,脱壳技术
2008年06月23日 星期一 下午 05:35
这不是完整的脱文,只是简单记录一下我自己认为的一些要点,太多的细节我也不知所以然,

能蒙混过去的我就暂且欺骗一下自己了,我也懒得去跟踪每一段代码的细节

这个1.25版本和上次脱的1.20版难易度基本差不多,现在完全忘了上次怎么脱的了

这次多花了不少时间,所以这次才决定留下点简单记录

如果你自己亲自跟踪过,我想应该能看懂我的思路



开工喽:

set seh:memory voilation

set seh:div 0

ignore others



第一次div 0

008D9A28 F7F0 DIV EAX ;第一次div 0

008D9A2A 8381 B8000000 02 ADD DWORD PTR DS:[ECX B8],2

008D9A31 5B POP EBX

008D9A32 5D POP EBP

008D9A33 C3 RETN



008D99DB 64:8F00 POP DWORD PTR FS:[EAX] ;goto here

008D99DE 83C4 04 ADD ESP,4

008D99E1 5B POP EBX

008D99E2 C3 RETN



bp VirtualAlloc

0044DE1C FF93 80000000 CALL DWORD PTR DS:[EBX 80] ;VirtualAlloc

0044DE22 85C0 TEST EAX,EAX ;返回这里,eax=9F0000

0044DE24 0F84 3A010000 JE Obsidium.0044DF64 ;new imagebase



下面开始解码过程

解码后这里处理reloc,为了脱壳后使base定位在400000h,就需要在这里做些手脚了,大家自己想吧

0044DF27 8B43 10 MOV EAX,DWORD PTR DS:[EBX 10] ;new imagebase

0044DF2A 2B43 10 SUB EAX,DWORD PTR DS:[EBX 3C] ;old imagebase

0044DF2D FF77 08 PUSH DWORD PTR DS:[EDI 8]

0044DF30 FF77 04 PUSH DWORD PTR DS:[EDI 4]

0044DF33 FF73 78 PUSH DWORD PTR DS:[EBX 78]

0044DF36 50 PUSH EAX

0044DF37 FF73 10 PUSH DWORD PTR DS:[EBX 10]

0044DF3A FF53 70 CALL DWORD PTR DS:[EBX 70]

0044DF3D 83C7 14 ADD EDI,14

0044DF40 FF4D FC DEC DWORD PTR SS:[EBP-4]

0044DF43 ^0F85 F4FEFFFF JNZ Obsidium.0044DE3D



继续shift F9几次看到这样的代码:

008DC4B2 F7F0 DIV EAX ;div 0

008DC4B4 8B00 MOV EAX,DWORD PTR DS:[EAX] ;紧接着一个这样的异常

008DC4B6 85C0 TEST EAX,EAX

008DC4B8 74 19 JE SHORT 008DC4D3

008DC4BA 8B53 04 MOV EDX,DWORD PTR DS:[EBX 4]

008DC4BD C702 07000000 MOV DWORD PTR DS:[EDX],7

008DC4C3 C740 08 00000000 MOV DWORD PTR DS:[EAX 8],0

008DC4CA 8343 04 0C ADD DWORD PTR DS:[EBX 4],0C

008DC4CE 52 PUSH EDX

008DC4CF 51 PUSH ECX

008DC4D0 FF63 4C JMP DWORD PTR DS:[EBX 4C]

008DC4D3 64:67:8F06 0000 POP DWORD PTR FS:[0] ;goto here

008DC4D9 83C4 04 ADD ESP,4

008DC4DC 5B POP EBX

008DC4DD C3 RETN



下面是关于IAT处理的:

ctrl g 8DC5D0 ,hard break point on exec

(关于8DC5D0这个地址是怎么找到的,我是多次运行过去,观察后下硬件断点,逐层回溯过来的

然后把它记下来了,让我重新再找一次的话,我也要尝试并思考几次才能定位的)

F9 两次停到这里:

008DC5D0 E8 3F040000 CALL 008DCA14 ;

008DC5D5 85C0 TEST EAX,EAX

008DC5D7 74 55 JE SHORT 008DC62E

008DC5D9 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

008DC5DC 05 679D4100 ADD EAX,419D67

008DC5E1 8B56 04 MOV EDX,DWORD PTR DS:[ESI 4]

008DC5E4 0353 44 ADD EDX,DWORD PTR DS:[EBX 44]

008DC5E7 52 PUSH EDX

008DC5E8 50 PUSH EAX

008DC5E9 E8 26040000 CALL 008DCA14

008DC5EE 85C0 TEST EAX,EAX

008DC5F0 74 3C JE SHORT 008DC62E

...

008DC692 FF36 PUSH DWORD PTR DS:[ESI]

008DC694 53 PUSH EBX

008DC695 52 PUSH EDX

008DC696 50 PUSH EAX

008DC697 FF76 0C PUSH DWORD PTR DS:[ESI C]

008DC69A E8 F4000000 CALL 008DC793 ;进入



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

008DC793 55 PUSH EBP

008DC794 8BEC MOV EBP,ESP

008DC796 56 PUSH ESI

008DC797 57 PUSH EDI

008DC798 8B75 10 MOV ESI,DWORD PTR SS:[EBP 10]

008DC79B 8B7D 0C MOV EDI,DWORD PTR SS:[EBP C]

008DC79E 66:F706 2000 TEST WORD PTR DS:[ESI],20 ;改为 TEST WORD PTR DS:[ESI],8

008DC7A3 74 46 JE SHORT 008DC7EB ;改为 JNE SHORT 008DC7EB

008DC7A5 66:F706 0200 TEST WORD PTR DS:[ESI],2

008DC7AA 75 1F JNZ SHORT 008DC7CB

008DC7AC 66:C706 0400 MOV WORD PTR DS:[ESI],4

008DC7B1 8B45 14 MOV EAX,DWORD PTR SS:[EBP 14]

008DC7B4 6A 01 PUSH 1

008DC7B6 6A 00 PUSH 0

008DC7B8 FF76 04 PUSH DWORD PTR DS:[ESI 4]

008DC7BB 6A 00 PUSH 0

008DC7BD FF75 18 PUSH DWORD PTR SS:[EBP 18]

008DC7C0 FF50 50 CALL DWORD PTR DS:[EAX 50]

008DC7C3 85C0 TEST EAX,EAX ;改为 JE SHORT 008DC7EB

008DC7C5 74 38 JE SHORT 008DC7FF

008DC7C7 8907 MOV DWORD PTR DS:[EDI],EAX

008DC7C9 EB 20 JMP SHORT 008DC7EB

008DC7CB 66:C706 0400 MOV WORD PTR DS:[ESI],4

008DC7D0 8B45 14 MOV EAX,DWORD PTR SS:[EBP 14]

008DC7D3 0FB756 02 MOVZX EDX,WORD PTR DS:[ESI 2]

008DC7D7 6A 01 PUSH 1

008DC7D9 52 PUSH EDX

008DC7DA 6A 00 PUSH 0

008DC7DC FF76 04 PUSH DWORD PTR DS:[ESI 4]

008DC7DF FF75 18 PUSH DWORD PTR SS:[EBP 18]

008DC7E2 FF50 50 CALL DWORD PTR DS:[EAX 50]

008DC7E5 85C0 TEST EAX,EAX

008DC7E7 74 16 JE SHORT 008DC7FF ;改为 JE SHORT 008DC7EB

008DC7E9 8907 MOV DWORD PTR DS:[EDI],EAX

008DC7EB 83C6 08 ADD ESI,8

008DC7EE 83C7 04 ADD EDI,4

008DC7F1 FF4D 08 DEC DWORD PTR SS:[EBP 8]

008DC7F4 ^75 A8 JNZ SHORT 008DC79E

008DC7F6 33C0 XOR EAX,EAX

008DC7F8 40 INC EAX

008DC7F9 5F POP EDI

008DC7FA 5E POP ESI

008DC7FB 5D POP EBP

008DC7FC C2 1400 RETN 14



stolen code 我没去找,我只是翻看一下代码,看到下面这个就知道oep就在附近,自己手工修复几行就可以了

009F15FE 43 2B 2B 48 4F 4F 4B C HOOK

OB是从这里开始进入原始程序代码的:

009F161E E8 A1B41500 CALL 00B4CAC4

009F1623 8BD0 MOV EDX,EAX

009F1625 E8 46E11400 CALL 00B3F770

009F162A 5A POP EDX

009F162B E8 A4E01400 CALL 00B3F6D4

009F1630 E8 7BE11400 CALL 00B3F7B0

009F1635 6A 00 PUSH 0

009F1637 E8 80F61400 CALL 00B40CBC



象下面这种结构是动态解码的SDK

009F1BB0 68 A4000000 PUSH 0A4 ;len

009F1BB5 FF15 EA104000 CALL DWORD PTR DS:[4010EA]

...

009F1C5F 68 A4000000 PUSH 0A4

009F1C64 FF15 EE104000 CALL DWORD PTR DS:[4010EE]



修改下面代码用于SDK FIX:

008DB38C 55 PUSH EBP

008DB38D 8BEC MOV EBP,ESP

008DB38F 81EC 30010000 SUB ESP,130

008DB395 60 PUSHAD

008DB396 E8 00000000 CALL 008DB39B

008DB39B 5E POP ESI

008DB39C 8D96 60010000 LEA EDX,DWORD PTR DS:[ESI 160]

008DB3A2 33C0 XOR EAX,EAX

008DB3A4 52 PUSH EDX

008DB3A5 83C5 04 ADD EBP,4 ;已修改

008DB3A8 BE 7FD34400 MOV ESI,44D37F ;

008DB3AD 90 NOP ;

008DB3AE 90 NOP ;

008DB3AF EB 02 JMP SHORT 008DB3B3 ;

008DB3B1 ^EB FA JMP SHORT 008DB3AD

008DB3B3 8B7D 04 MOV EDI,DWORD PTR SS:[EBP 4]

008DB3B6 8D85 D0FEFFFF LEA EAX,DWORD PTR SS:[EBP-130]

008DB3BC 50 PUSH EAX

008DB3BD 57 PUSH EDI

008DB3BE FF96 30010000 CALL DWORD PTR DS:[ESI 130]

...

008DB437 2B46 10 SUB EAX,DWORD PTR DS:[ESI 10]

008DB43A 8B4E 3C MOV ECX,DWORD PTR DS:[ESI 3C] ; Obsidium.00400000

008DB43D 8B55 08 MOV EDX,DWORD PTR SS:[EBP 8]

008DB440 2B4E 10 SUB ECX,DWORD PTR DS:[ESI 10]

008DB443 81E2 FFFFFF1F AND EDX,1FFFFFFF

008DB449 52 PUSH EDX

008DB44A 50 PUSH EAX

008DB44B FF76 78 PUSH DWORD PTR DS:[ESI 78]

008DB44E 51 PUSH ECX

008DB44F FF76 10 PUSH DWORD PTR DS:[ESI 10]

008DB452 83C4 14 ADD ESP,14 ;已修改,为了定位到400000

008DB455 8B45 08 MOV EAX,DWORD PTR SS:[EBP 8]

008DB458 8D8D F0FEFFFF LEA ECX,DWORD PTR SS:[EBP-110]

008DB45E 25 FFFFFF1F AND EAX,1FFFFFFF

008DB463 50 PUSH EAX

008DB464 FF75 04 PUSH DWORD PTR SS:[EBP 4]

008DB467 6A 0E PUSH 0E

008DB469 51 PUSH ECX

008DB46A FF56 28 CALL DWORD PTR DS:[ESI 28]

008DB46D 837E 70 00 CMP DWORD PTR DS:[ESI 70],0

008DB471 74 52 JE SHORT 008DB4C5

008DB473 F745 08 00000080 TEST DWORD PTR SS:[EBP 8],80000000

008DB47A 75 49 JNZ SHORT 008DB4C5

008DB47C 8B45 04 MOV EAX,DWORD PTR SS:[EBP 4]

008DB47F 8B4E 10 MOV ECX,DWORD PTR DS:[ESI 10]

008DB482 8B55 08 MOV EDX,DWORD PTR SS:[EBP 8]

008DB485 2B46 10 SUB EAX,DWORD PTR DS:[ESI 10]

008DB488 2B4E 3C SUB ECX,DWORD PTR DS:[ESI 3C]

008DB48B 81E2 FFFFFF1F AND EDX,1FFFFFFF

008DB491 52 PUSH EDX

008DB492 50 PUSH EAX

008DB493 FF76 78 PUSH DWORD PTR DS:[ESI 78]

008DB496 51 PUSH ECX

008DB497 FF76 10 PUSH DWORD PTR DS:[ESI 10]

008DB49A 83C4 14 ADD ESP,14 ;已修改,为了定位到400000

...

008DB4E5 FF96 1C020000 CALL DWORD PTR DS:[ESI 21C]

008DB4EB 83ED 04 SUB EBP,4 ;已修改

008DB4EE 90 NOP ;

008DB4EF 90 NOP ;

008DB4F0 90 NOP ;

008DB4F1 83C4 04 ADD ESP,4

008DB4F4 61 POPAD

008DB4F5 8BE5 MOV ESP,EBP

008DB4F7 5D POP EBP

008DB4F8 C2 0400 RETN 4



有了上面的一段修改,随便找个空闲空间写入下面代码,就可以修复动态解码的SDK

009F0800 BE 00109F00 MOV ESI,9F1000

009F0805 4E DEC ESI

009F0806 46 INC ESI

009F0807 81FE 00E0B400 CMP ESI,0B4E000

009F080D 7D 41 JGE SHORT 009F0850

009F080F 803E 68 CMP BYTE PTR DS:[ESI],68

009F0812 ^75 F2 JNZ SHORT 009F0806

009F0814 66:817E 05 FF15 CMP WORD PTR DS:[ESI 5],15FF

009F081A ^75 EA JNZ SHORT 009F0806

009F081C 817E 07 EA104000 CMP DWORD PTR DS:[ESI 7],4010EA

009F0823 ^75 E1 JNZ SHORT 009F0806

009F0825 FF76 01 PUSH DWORD PTR DS:[ESI 1]

009F0828 8D46 0B LEA EAX,DWORD PTR DS:[ESI B]

009F082B 50 PUSH EAX

009F082C FF15 EA104000 CALL DWORD PTR DS:[4010EA] ;8DB38C,进入我们上面那段修改过的还原SDK代码

009F0832 5A POP EDX

009F0833 8BFE MOV EDI,ESI

009F0835 B0 90 MOV AL,90

009F0837 B9 0B000000 MOV ECX,0B

009F083C F3:AA REP STOS BYTE PTR ES:[EDI]

009F083E 03FA ADD EDI,EDX

009F0840 B9 0B000000 MOV ECX,0B

009F0845 F3:AA REP STOS BYTE PTR ES:[EDI]

009F0847 83C6 0B ADD ESI,0B

009F084A ^EB BA JMP SHORT 009F0806

009F084C 90 NOP

009F084D 90 NOP

009F084E 90 NOP

009F084F 90 NOP

009F0850 CC INT 3

009F0851 90 NOP

009F0852 90 NOP

009F0853 90 NOP



还有一种有key才能还原的SDK保护代码,没key的情况下手工修改跳过就可以了,我不解释了

我思维已经有些混乱了,因此写内容也比较混乱,错误之处欢迎指正,想扔鸡蛋的请使点劲

就到这里结束吧,还有剩下的其他一些体力活就略过了




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 21:18 , Processed in 0.283643 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部