小子贼野 发表于 2007-5-6 19:18:33

寻Stolen Code之Acprotect

Od设置不忽略INT3中断,其余异常全部忽略。隐藏!

OD载入
004AC000 N>60                   pushad//记下004AC000,这个后面要用到的!
004AC001   4E                   dec esi
004AC002   D3D6               rcl esi,cl
004AC004   4E                   dec esi
004AC005   66:D3E8            shr ax,cl


F9运行。

004BAB23    90            NOP    //第一次也是最后一次INT3异常。
004BAB24    64:67:8F06 0000 POP DWORD PTR FS:
004BAB2A    83C4 04         ADD ESP,4
004BAB2D    60            PUSHAD
004BAB2E    E8 00000000   CALL NetClean.004BAB33
004BAB33    5E            POP ESI
004BAB34    83EE 06         SUB ESI,6
004BAB37    B9 5B000000   MOV ECX,5B
004BAB3C    29CE            SUB ESI,ECX
004BAB3E    BA 09E5B87E   MOV EDX,7EB8E509
004BAB43    C1E9 02         SHR ECX,2
004BAB46    83E9 02         SUB ECX,2
004BAB49    83F9 00         CMP ECX,0
004BAB4C    7C 1A         JL SHORT NetClean.004BAB68

.................................................



堆栈内容


0012FF58   0012FFE0指针到下一个 SEH 记录
0012FF5C   004BAAF0SE 句柄    //右键对004BAAF0转存中跟随,下内存访问断点,Shift+F9!
0012FF60   F9E1E5CE



004BAAF0    8B4424 04       MOV EAX,DWORD PTR SS://下断点Shift+F9中断1
004BAAF4    8B4C24 0C       MOV ECX,DWORD PTR SS:
004BAAF8    FF81 B8000000   INC DWORD PTR DS:
004BAAFE    8B00            MOV EAX,DWORD PTR DS:
004BAB00    2D 03000080   SUB EAX,80000003
004BAB05    75 12         JNZ SHORT NetClean.004BAB19
004BAB07    90            NOP
004BAB08    90            NOP
004BAB09    90            NOP
004BAB0A    90            NOP
004BAB0B    33C0            XOR EAX,EAX
004BAB0D    8941 04         MOV DWORD PTR DS:,EAX
004BAB10    8941 08         MOV DWORD PTR DS:,EAX
004BAB13    8941 0C         MOV DWORD PTR DS:,EAX
004BAB16    8941 10         MOV DWORD PTR DS:,EAX
004BAB19    C3            RETN

.................................................



004BAB4E    8B048E          MOV EAX,DWORD PTR DS: //下断点Shift+F9中断2,清除内存断点
004BAB51    8B5C8E 04       MOV EBX,DWORD PTR DS:
004BAB55    03C3            ADD EAX,EBX
004BAB57    C1C8 0E         ROR EAX,0E
004BAB5A    2BC2            SUB EAX,EDX
004BAB5C    81EA D41CF55C   SUB EDX,5CF51CD4
004BAB62    89048E          MOV DWORD PTR DS:,EAX
004BAB65    49            DEC ECX
004BAB66^ EB E1         JMP SHORT NetClean.004BAB49
004BAB68    61            POPAD
004BAB69    61            POPAD
004BAB6A    C3            RETN //F4直接下来,这时是寻找Stolen Code时候了。

.................................................



再次点它的死穴。

命令行d 12ffc0。
右键下硬件访问dword断点!


004C9B31    55            PUSH EBP         //Stolen Code
004C9B32    8BEC            MOV EBP,ESP   //Stolen Code
004C9B34    6A FF         PUSH -1      //Stolen Code
004C9B36    90            NOP
004C9B37    60            PUSHAD
004C9B38    60            PUSHAD
这个程序抽了5个字节。
........................................................................

ALT+M 打开内存镜像断点,对准它的第二个死穴点。

内存镜像, 项目 12
地址=00401000   //Code段下内存访问断点
大小=00047000 (290816.)
Owner=NetClean 00400000
区段=.text
Contains=code
类型=Imag 01001002
访问=R
初始访问=RWE

F9运行



004431F9    68 D8B24400   PUSH NetClean.0044B2D8//临时Oep,滚动条向上看,如何判断抽掉多少字节,用滚动条是代码会混乱,右键分析代码,如我现在调整的样式,标签1
004431FE    68 B4334400   PUSH NetClean.004433B4                   ; JMP to MSVCRT._except_handler3
00443203    64:A1 00000000MOV EAX,DWORD PTR FS:
00443209    50            PUSH EAX
0044320A    64:8925 0000000>MOV DWORD PTR FS:,ESP
00443211    83EC 68         SUB ESP,68
00443214    53            PUSH EBX
00443215    56            PUSH ESI
00443216    57            PUSH EDI

.............................................................................
标签1

004431F4      8C            DB 8C   //真Oep
004431F5   .C3            RETN
004431F6      49            DB 49                                    ;CHAR 'I'
004431F7      2E            DB 2E                                    ;CHAR '.'
004431F8      79            DB 79                                    ;CHAR 'y'
004431F9   .68 D8B24400   PUSH NetClean.0044B2D8
004431FE   .68 B4334400   PUSH NetClean.004433B4                   ;JMP to MSVCRT._except_handler3; SE handler installation
00443203   .64:A1 0000000>MOV EAX,DWORD PTR FS:
00443209   .50            PUSH EAX
0044320A   .64:8925 00000>MOV DWORD PTR FS:,ESP
00443211   .83EC 68       SUB ESP,68
00443214   .53            PUSH EBX
00443215   .56            PUSH ESI
00443216   .57            PUSH EDI
00443217   .8965 E8       MOV DWORD PTR SS:,ESP
0044321A   .33DB          XOR EBX,EBX
0044321C   .895D FC       MOV DWORD PTR SS:,EBX
0044321F   .6A 02         PUSH 2
00443221   .FF15 70874400 CALL DWORD PTR DS:               ;MSVCRT.__set_app_type

.............................................................................


还原代码!

55 8B EC 6A FF



004431F4      55            PUSH EBP //用Od插件修正入口为431F4直接脱壳吧,重建输入表的勾去掉
004431F5      8BEC          MOV EBP,ESP
004431F7      6A FF         PUSH -1
004431F9   .68 D8B24400   PUSH NetClean.0044B2D8
004431FE   .68 B4334400   PUSH NetClean.004433B4                   ;JMP to MSVCRT._except_handler3; SE handler installation
00443203   .64:A1 0000000>MOV EAX,DWORD PTR FS:
00443209   .50            PUSH EAX
0044320A   .64:8925 00000>MOV DWORD PTR FS:,ESP
00443211   .83EC 68       SUB ESP,68
00443214   .53            PUSH EBX
00443215   .56            PUSH ESI
00443216   .57            PUSH EDI
00443217   .8965 E8       MOV DWORD PTR SS:,ESP
0044321A   .33DB          XOR EBX,EBX
0044321C   .895D FC       MOV DWORD PTR SS:,EBX
0044321F   .6A 02         PUSH 2
00443221   .FF15 70874400 CALL DWORD PTR DS:               ;MSVCRT.__set_app_type

........................................................................



修复IAT必须关闭OD单独开加壳程序修复,不然ImportREC停止响应,最后用ImportREC Oep填431F4,跟踪等级三轻松修复,有10个指针提示无法修复,你可以验证一下,经过验证全部是垃圾指针,通常ImportREC可全部修复指针,如有没有一般都是垃圾,拿剪刀全部Cut掉,修复后无法运行。



寻找出错原因。



004431C4|.68 00404500   PUSH 2_.00454000
004431C9|.E8 DC000000   CALL <JMP.&msvcrt._initterm>//这个Call可能是新版Acprotect的解码技术,进这个Call里面,循环解码,没解完程序就崩溃。
004431CE|.83C4 24       ADD ESP,24//这里类似代码,我没有再次跟踪。
其实本版本Acprotect嵌有Oep处代码检验程序,发现Oep处代码被替换,立即拒绝解码,你失去了关键的代码当然程序无法运行,还要承认N次错误确定按钮。


004C9B31    55            PUSH EBP         //Stolen Code
004C9B32    8BEC            MOV EBP,ESP   //Stolen Code
004C9B34    6A FF         PUSH -1      //Stolen Code

我们已经掌握。

004431F9   .68 D8B24400   PUSH NetClean.0044B2D8    //临时Oep也知道。

现在做什么,让程序认为你没有脱壳,将perplex段里面有用的内容全部解码。



方法

PUSH EBP      //Stolen Code   
MOV EBP,ESP    //Stolen Code   
PUSH -1       //Stolen Code

jmp 004431F9



Od载入脱壳修复后的程序,Ctrl+G 004AC000,右键清除分析。



004AC000    60            PUSHAD//4AC000是原来壳的入口点,将Oep入口代码复制到这里。
004AC001    4E            DEC ESI
004AC002    D3D6            RCL ESI,CL
004AC004    4E            DEC ESI
004AC005    66:D3E8         SHR AX,CL
004AC008    4E            DEC ESI
004AC009    8BC3            MOV EAX,EBX
004AC00B    48            DEC EAX
004AC00C    7A 03         JPE SHORT Unpack_.004AC011
004AC00E    7B 01         JPO SHORT Unpack_.004AC011
004AC010    7A C1         JPE SHORT Unpack_.004ABFD3
004AC012    EF            OUT DX,EAX                               ; I/O 命令
004AC013    F0:50         LOCK PUSH EAX                            ; 锁定前缀是不允许的
004AC015    E8 01000000   CALL Unpack_.004AC01B

.........................................................

55 8B EC 6A FF
jmp 004431F9


004AC000   55               push ebp
004AC001   8BEC             mov ebp,esp
004AC003   6A FF            push -1
004AC005   - E9 EF71F9FF      jmp dump1_.004431F9
004AC00A   C3               retn
004AC00B   48               dec eax
004AC00C   7A 03            jpe short dump1_.004AC011
004AC00E   7B 01            jpo short dump1_.004AC011
004AC010   7A C1            jpe short dump1_.004ABFD3
004AC012   EF               out dx,eax
004AC013   F0:50            lock push eax                   ; 不允许锁定前缀

保存文件,OK~!

...........................................................

最后用LordPE修正入口为AC000,就可以正常运行了!

一位高手的文章,我看过了,跟着做了一次,的确是强啊,以前不会处理Stolen Code,今天刚学会,把文章拿上来和大家分享/:014

小子贼野 发表于 2007-5-20 16:12:57

这么好的文章居然没有人看?郁闷,自己顶下先,个人认为这篇文章非常好~!希望大家看看~!

glts 发表于 2007-5-20 18:21:12

不错,有看过!

MayDay 发表于 2007-5-25 16:43:04

貌似这个方法是通用的,学习了,感谢LZ

ABCdiyPE 发表于 2007-5-26 00:03:30

不是又来人看了嘛?

小子贼野 发表于 2007-5-26 12:53:31

呵呵,主要是刚发的时候就没有人看,我也是刚开始学stolen code,感觉这文章对我帮助很大,所以就发了点牢骚

suyajun 发表于 2007-5-26 21:00:18

三人行的徒弟 下次不能泄露教程了 兄弟

网游难民 发表于 2007-6-9 15:48:56

呵呵~~
第二十一课~
的确不错~~

小子贼野 发表于 2007-6-9 16:40:35

原帖由 网游难民 于 2007-6-9 15:48 发表 https://www.chinapyg.com/images/common/back.gif
呵呵~~
第二十一课~
的确不错~~

呵呵,这个方法好像是通用的,我是希望大家来学习,不要因为是VIP就学不到,共享精神嘛,嘿嘿

kgdurgwu 发表于 2007-6-24 19:29:39

是很好啊
不过我还没有三人行的教程那   
    讲的真好   那教程
页: [1] 2
查看完整版本: 寻Stolen Code之Acprotect