飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 20692|回复: 19

[转贴] 寻Stolen Code之Acprotect

[复制链接]

该用户从未签到

发表于 2007-5-6 19:18:33 | 显示全部楼层 |阅读模式
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:[0]
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   004BAAF0  SE 句柄    //右键对004BAAF0转存中跟随,下内存访问断点,Shift+F9!
0012FF60   F9E1E5CE



004BAAF0    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]  //下断点Shift+F9中断1
004BAAF4    8B4C24 0C       MOV ECX,DWORD PTR SS:[ESP+C]
004BAAF8    FF81 B8000000   INC DWORD PTR DS:[ECX+B8]
004BAAFE    8B00            MOV EAX,DWORD PTR DS:[EAX]
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:[ECX+4],EAX
004BAB10    8941 08         MOV DWORD PTR DS:[ECX+8],EAX
004BAB13    8941 0C         MOV DWORD PTR DS:[ECX+C],EAX
004BAB16    8941 10         MOV DWORD PTR DS:[ECX+10],EAX
004BAB19    C3              RETN

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



004BAB4E    8B048E          MOV EAX,DWORD PTR DS:[ESI+ECX*4] //下断点Shift+F9中断2,清除内存断点
004BAB51    8B5C8E 04       MOV EBX,DWORD PTR DS:[ESI+ECX*4+4]
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:[ESI+ECX*4],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 00000000  MOV EAX,DWORD PTR FS:[0]
00443209    50              PUSH EAX
0044320A    64:8925 0000000>MOV DWORD PTR FS:[0],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:[0]
00443209   .  50            PUSH EAX
0044320A   .  64:8925 00000>MOV DWORD PTR FS:[0],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:[EBP-18],ESP
0044321A   .  33DB          XOR EBX,EBX
0044321C   .  895D FC       MOV DWORD PTR SS:[EBP-4],EBX
0044321F   .  6A 02         PUSH 2
00443221   .  FF15 70874400 CALL DWORD PTR DS:[448770]               ;  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:[0]
00443209   .  50            PUSH EAX
0044320A   .  64:8925 00000>MOV DWORD PTR FS:[0],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:[EBP-18],ESP
0044321A   .  33DB          XOR EBX,EBX
0044321C   .  895D FC       MOV DWORD PTR SS:[EBP-4],EBX
0044321F   .  6A 02         PUSH 2
00443221   .  FF15 70874400 CALL DWORD PTR DS:[448770]               ;  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
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-5-20 16:12:57 | 显示全部楼层
这么好的文章居然没有人看?郁闷,自己顶下先,个人认为这篇文章非常好~!希望大家看看~!
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2018-6-6 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-5-20 18:21:12 | 显示全部楼层
    不错,有看过!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-5-25 16:43:04 | 显示全部楼层
    貌似这个方法是通用的,学习了,感谢LZ
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-3-9 21:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-5-26 00:03:30 | 显示全部楼层
    不是又来人看了嘛?
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-5-26 12:53:31 | 显示全部楼层
    呵呵,主要是刚发的时候就没有人看,我也是刚开始学stolen code,感觉这文章对我帮助很大,所以就发了点牢骚
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-5-26 21:00:18 | 显示全部楼层
    三人行的徒弟 下次不能泄露教程了 兄弟
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-9 15:48:56 | 显示全部楼层
    呵呵~~
    第二十一课~
    的确不错~~
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-6-9 16:40:35 | 显示全部楼层
    原帖由 网游难民 于 2007-6-9 15:48 发表
    呵呵~~
    第二十一课~
    的确不错~~


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

    该用户从未签到

    发表于 2007-6-24 19:29:39 | 显示全部楼层
    是很好啊
      不过我还没有三人行的教程那   
        讲的真好   那教程
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表