进程执法官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 显示注册码--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
对于简单的压缩壳加密的软件的破解我一般不用脱壳的,免得软件带有自校验反而带来不必要的麻烦。
这话经典~~:lol: 原帖由 Nisy 于 2006-12-14 16:43 发表
对于简单的压缩壳加密的软件的破解我一般不用脱壳的,免得软件带有自校验反而带来不必要的麻烦。
这话经典~~:lol:
明吗比码比较灵....
页:
[1]