Nisy 发表于 2006-12-14 16:43:29

进程执法官v1.801详细分析过程

标 题: 进程执法官v1.801详细分析过程
作 者: ljy3282393
时 间: 2006-12-12,15:09
链 接: http://bbs.pediy.com/showthread.php?threadid=36273

【文章标题】: 进程执法官v1.801详细分析过程
【文章作者】: ljy3282393                                    
【软件名称】: 进程执法官1.801
【下载地址】: 自己搜索下载
【加壳方式】: ASPack 2.12
【软件介绍】: 进程执法官是一款强悍的手工杀毒与系统监控软件。
【作者声明】: 主要是写给亲手看的,高手请跳过。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
    PEID查壳:ASPack 2.12!
    对于简单的压缩壳加密的软件的破解我一般不用脱壳的,免得软件带有自校验反而带来不必要的麻烦。
   OD载入软件后,按F9键直接让软件运行起来!软件运行起来之后我一般都会搜索字符串参考看看有没有“注册成功”、“注册失败”、“rigistercode”等之类的敏感字符。不过如果这时搜索字符串的话,则会什么也搜不到!为什么?因为我是带壳调试软件的,并且调试时没有经过OEP而是直接按F9键让软件运行起来的,这时OD还停在壳的领空!只有让OD到达程序的领空才能搜到相关的字符。为了让OD到达程序的领空我们需要对程序的代码段下内存访问一次性断点!(注:在这里最好不要下内存访问断点,否则当OD到达程序的领空后,还要删除内存断点,多一个步骤。)下断方法:ALT+M,对程序的代码段按F2键即可!(由于本文主要是写给新手看的,所以写得详细、噜嗦些)http://bbs.pediy.com/upload/2006/4/image/od3.jpg_502.jpg

下好内存断点后,OD即时中断在程序的领空。这时就可利用OD的搜索字符串插件搜索相关字符串了,如下图:
    http://bbs.pediy.com/upload/2006/4/image/od1.jpg_562.jpg
    看到上图的“rigistercode”吗?不过先别忙在这里下断点,为了找到全部的“rigistercode”,需要先将光标移到字符串查找窗口的第一行代码,然后按CTRL+F,在弹出的查找窗口中输入“rigistercode”,按“确定”键,光标将会停在第一个“rigistercode”的地方!
http://bbs.pediy.com/upload/2006/4/image/od2.jpg_588.jpg
按“N”键,继续下一个查找,光标将会停在第二个“rigistercode”的地方。继续按“N”键,直到查找完毕之后,在所有查找到“rigistercode”的地方按F2键下断点!然后按F9键再次让软件运行起来,接着输入用户名和假注册码后,经过几次中断后(每次中断后都按F9键)便会来到以下关键的地方:

    00419D05|.6A 00         push    0
    00419D07|.68 C0914600   push    004691C0                            ;rigistercode
    00419D0C|.8D5424 28   lea   edx,
    00419D10|.68 D0914600   push    004691D0                            ;rigistersettings
    00419D15|.52            push    edx
    00419D16|.8BC8          mov   ecx, eax
    00419D18|.E8 A3410300   call    <jmp.&mfc42.#3522_CWinApp::GetProfi>
    00419D1D|.50            push    eax
    00419D1E|.8D4C24 14   lea   ecx,
    00419D22|.C64424 38 06mov   byte ptr , 6
    00419D27|.E8 A83F0300   call    <jmp.&mfc42.#858_CString::mad:perator=>
    00419D2C|.8D4C24 20   lea   ecx,
    00419D30|.885C24 34   mov   , bl
    00419D34|.E8 993E0300   call    <jmp.&mfc42.#800_CString::~CString>
    00419D39|.8B4424 18   mov   eax,
    00419D3D|.8B4C24 14   mov   ecx,
    00419D41|.50            push    eax                                 ;机器码入栈
    00419D42|.51            push    ecx                                 ;注册名入栈
    00419D43|.8D5424 14   lea   edx,
    00419D47|.68 40AD4600   push    0046AD40                            ;%s@%s
    00419D4C|.52            push    edx
    00419D4D|.E8 AA3E0300   call    <jmp.&mfc42.#2818_CString::Format>;将注册名和机器码通过字符@连接起来
    00419D52|.83C4 10       add   esp, 10
    00419D55|.8D4C24 1C   lea   ecx,
    00419D59|.E8 42160100   call    0042B3A0
    00419D5E|.6A 10         push    10
    00419D60|.C64424 38 07mov   byte ptr , 7
    00419D65|.6A 00         push    0
    00419D67|.8D4424 2C   lea   eax,
    00419D6B|.50            push    eax
    00419D6C|.51            push    ecx
    00419D6D|.8D5424 1C   lea   edx,
    00419D71|.8BCC          mov   ecx, esp
    00419D73|.896424 38   mov   , esp
    00419D77|.52            push    edx
    00419D78|.E8 5D3F0300   call    <jmp.&mfc42.#535_CString::CString>
    00419D7D|.8D4424 38   lea   eax,
    00419D81|.50            push    eax
    00419D82|.E8 59160100   call    0042B3E0                            ;算法call,跟进!
    00419D87|.83C4 08       add   esp, 8
    00419D8A|.8BC8          mov   ecx, eax
    00419D8C|.C64424 40 08mov   byte ptr , 8
    00419D91|.E8 1A420300   call    <jmp.&mfc42.#4278_CString::Mid>
    00419D96|.8BF0          mov   esi, eax
    00419D98      6A 10         push    10                                  ;压入数字16(10进制)
    00419D9A|.8D4C24 24   lea   ecx,
    00419D9E|.6A 00         push    0
    00419DA0|.51            push    ecx
    00419DA1|.8D4C24 1C   lea   ecx,
    00419DA5|.C64424 40 09mov   byte ptr , 9
    00419DAA|.E8 01420300   call    <jmp.&mfc42.#4278_CString::Mid>   ;截取真注册码(由算法call产生)的前16个字符
    00419DAF|.8B36          mov   esi,
    00419DB1|.8B00          mov   eax,
    00419DB3|.56            push    esi                                 ; /s2
    00419DB4|.50            push    eax                                 ; |s1
    00419DB5|.FF15 106C4500 call    [<&msvcrt._mbscmp>]               ; \比较真假注册码
    00419DBB|.83C4 08       add   esp, 8
    00419DBE|.8D4C24 20   lea   ecx,
    00419DC2|.85C0          test    eax, eax
    00419DC4|.0F944424 0B   sete   
    00419DC9|.E8 043E0300   call    <jmp.&mfc42.#800_CString::~CString>
   
    跟进算法call后来到这里:
    0042B3E0/$6A FF         push    -1
    0042B3E2|.68 67364500   push    00453667                         ;SE 处理程序安装
    0042B3E7|.64:A1 0000000>mov   eax, fs:
    0042B3ED|.50            push    eax
    0042B3EE|.64:8925 00000>mov   fs:, esp
    0042B3F5|.83EC 0C       sub   esp, 0C
    0042B3F8|.53            push    ebx
    0042B3F9|.55            push    ebp
    0042B3FA|.56            push    esi
    0042B3FB|.57            push    edi
    0042B3FC|.C74424 18 000>mov   dword ptr , 0
    0042B404|.BF 94CB4600   mov   edi, 0046CB94                  ;processjudgerhaha1234567890abcdefghijklmnopqrstuvwxyz
    0042B409|.83C9 FF       or      ecx, FFFFFFFF
    0042B40C|.33C0          xor   eax, eax
    0042B40E|.C74424 24 010>mov   dword ptr , 1
    0042B416|.F2:AE         repne   scas byte ptr es:
    0042B418|.F7D1          not   ecx
    0042B41A|.51            push    ecx
    0042B41B|.E8 42280200   call    <jmp.&mfc42.#823_operator new>
    0042B420|.8BE8          mov   ebp, eax
    0042B422|.BF C8A14600   mov   edi, 0046A1C8                  ;processjudger
    0042B427|.83C9 FF       or      ecx, FFFFFFFF
    0042B42A|.33C0          xor   eax, eax
    0042B42C|.83C4 04       add   esp, 4
    0042B42F|.F2:AE         repne   scas byte ptr es:
    0042B431|.F7D1          not   ecx
    0042B433|.2BF9          sub   edi, ecx
    0042B435|.8BC1          mov   eax, ecx
    0042B437|.8BF7          mov   esi, edi
    0042B439|.8BFD          mov   edi, ebp
    0042B43B|.C1E9 02       shr   ecx, 2
    0042B43E|.F3:A5         rep   movs dword ptr es:, dword p>
    0042B440|.8BC8          mov   ecx, eax
    0042B442|.33C0          xor   eax, eax
    0042B444|.83E1 03       and   ecx, 3
    0042B447|.F3:A4         rep   movs byte ptr es:, byte ptr>
    0042B449|.8B4C24 30   mov   ecx,                   ;取字符串“注册名@机器码”
    0042B44D|.8BFD          mov   edi, ebp
    0042B44F|.8B51 F8       mov   edx,                      ;取该字符串的长度给edx
    0042B452|.83C9 FF       or      ecx, FFFFFFFF
    0042B455|.F2:AE         repne   scas byte ptr es:
    0042B457|.F7D1          not   ecx
    0042B459|.8BC2          mov   eax, edx
    0042B45B|.49            dec   ecx                              ;取字符串“ProcessJudger"的长度给ecx
    0042B45C|.33D2          xor   edx, edx
    0042B45E|.F7F1          div   ecx                              ;edx除以ecx
    0042B460|.8D4C24 10   lea   ecx,
    0042B464 >|.8BDA          mov   ebx, edx                         ;取余数赋给ebx
    0042B466|.E8 79270200   call    <jmp.&mfc42.#540_CString::CStrin>
    0042B46B|.8B4424 30   mov   eax,
    0042B46F|.33F6          xor   esi, esi
    0042B471|.C64424 24 02mov   byte ptr , 2
    0042B476|.8B48 F8       mov   ecx,
    0042B479|.85C9          test    ecx, ecx
    0042B47B|.7E 4D         jle   short 0042B4CA
    0042B47D|>8A1406      /mov   dl,                    ;取字符串“注册名@机器码”的第esi个字符的ASCII值赋给dl(设该值为x),开始计算注册码!
    0042B480|.8BFD          |mov   edi, ebp                        ;edi指向字符ProcessJudger
    0042B482|.83C9 FF       |or      ecx, FFFFFFFF
    0042B485|.33C0          |xor   eax, eax
    0042B487|.F2:AE         |repne   scas byte ptr es:
    0042B489|.F7D1          |not   ecx
    0042B48B|.885424 14   |mov   , dl
    0042B48F|.49            |dec   ecx                           ;ecx为字符串“Processjudger"的长度
    0042B490|.8D041E      |lea   eax,                   ;eax=esi+ebx
    0042B493|.33D2          |xor   edx, edx
    0042B495|.F7F1          |div   ecx                           ;将eax除以ecx的余数赋给edx
    0042B497|.8B4C24 14   |mov   ecx,                    ;将x赋给ecx
    0042B49B|.33C0          |xor   eax, eax
    0042B49D|.81E1 FF000000 |and   ecx, 0FF
    0042B4A3|.8A042A      |mov   al,                    ;取字符串“Processjudger"的第edx个字符的ASCII值赋给al(设该值为y)!
    0042B4A6|.8B5424 10   |mov   edx,
    0042B4AA|.33C1          |xor   eax, ecx                        ;x与y进行异或
    0042B4AC|.50            |push    eax                           ;异或结果入栈
    0042B4AD|.52            |push    edx
    0042B4AE|.8D4424 18   |lea   eax,
    0042B4B2|.68 8CCB4600   |push    0046CB8C                        ;%s%02x
    0042B4B7|.50            |push    eax
    0042B4B8|.E8 3F270200   |call    <jmp.&mfc42.#2818_CString::Form>;将异或结果保存并连接起来!
    0042B4BD|.8B4424 40   |mov   eax,
    0042B4C1|.83C4 10       |add   esp, 10
    0042B4C4|.46            |inc   esi
    0042B4C5|.3B70 F8       |cmp   esi,                   ;计算完了吗?
    0042B4C8|.^ 7C B3         \jl      short 0042B47D                  ;没计算完就跳回去继续计算
    0042B4CA|>55            push    ebp                              ; /block
    0042B4CB|.E8 2A260200   call    <jmp.&mfc42.#825_operator delete>; \free
    0042B4D0|.8B7424 30   mov   esi,
    0042B4D4|.83C4 04       add   esp, 4
    0042B4D7|.8D4C24 10   lea   ecx,
    0042B4DB|.51            push    ecx
    0042B4DC|.8BCE          mov   ecx, esi
    0042B4DE|.E8 F7270200   call    <jmp.&mfc42.#535_CString::CStrin>
    0042B4E3|.C74424 18 010>mov   dword ptr , 1
    0042B4EB|.8D4C24 10   lea   ecx,
    0042B4EF|.C64424 24 01mov   byte ptr , 1
    0042B4F4|.E8 D9260200   call    <jmp.&mfc42.#800_CString::~CStri>
    0042B4F9|.8D4C24 30   lea   ecx,
    0042B4FD|.C64424 24 00mov   byte ptr , 0
    0042B502|.E8 CB260200   call    <jmp.&mfc42.#800_CString::~CStri>
    0042B507|.8B4C24 1C   mov   ecx,
    0042B50B|.8BC6          mov   eax, esi
    0042B50D|.5F            pop   edi
    0042B50E|.5E            pop   esi
    0042B50F|.5D            pop   ebp
    0042B510|.5B            pop   ebx
    0042B511|.64:890D 00000>mov   fs:, ecx
    0042B518|.83C4 18       add   esp, 18
    0042B51B\.C3            retn
   
   
--------------------------------------------------------------------------------
算法总结:设用户名+"@"+机器码组成的字符串为S,S的长度为L; L除以13(13为字符串“Processjudger"的长度)的余数为n,则字符串“Processjudger"从第n位(注:字符串“Processjudger"的“P”为第“0”位,第一位为“r”,其余类推)开始与字符串S循环异或,将异或结果的前16位保存并连接起来就是真正的注册码!

      VB注册机源代码:

Dim str1 As String
Dim str2 As String
Dim c As String
str1 = Text1.Text + "@" + Text2.Text   //Text1.Text=注册用户名,Text2.Text=机器码。
str2 = "ProcessJudger"
nlen = Len(str1)
For i = 1 To 8
n = nlen Mod 13
n = n + 1         //汇编语言中的第n个字符相当于VB中的第n+1个字符
b = Hex(Asc(Mid(str2, n, 1)) Xor Asc(Mid(str1, i, 1)))
If Len(b) < 2 Then b = "0" & b//如果异或结果不是两位数则在前面加“0”
c = c & b
nlen = nlen + 1
Next i
Text3.Text = c    //Text3.Text 显示注册码--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!      

Nisy 发表于 2006-12-14 16:43:58

对于简单的压缩壳加密的软件的破解我一般不用脱壳的,免得软件带有自校验反而带来不必要的麻烦。

这话经典~~:lol:

菜儿 发表于 2006-12-14 19:07:34

原帖由 Nisy 于 2006-12-14 16:43 发表
对于简单的压缩壳加密的软件的破解我一般不用脱壳的,免得软件带有自校验反而带来不必要的麻烦。

这话经典~~:lol:

明吗比码比较灵....
页: [1]
查看完整版本: 进程执法官v1.801详细分析过程