[原创]monkey Crackme #1 算法分析和delphi注册机代码实现
2006-7-24 16:04
5519
[原创]monkey Crackme #1 算法分析和delphi注册机代码实现
【文章标题】: monkey Crackme #1 算法分析和delphi注册机代码实现
【作 者】: testkey
【邮 箱】: pediytest@sina.com
【主 页】: http://bbs.pediy.com
【软件名称】: monkey crackme #1
【下载地址】: 本地下载
【保护方式】: 注册码
【工 具】: OD
【作者声明】: 仅做分析研究,无商业用途。
--------------------------------------------------------------------------------
【详细过程】
注册名和注册码都为空时,通过注册,可能是一个没进行处理的BUG吧。
注册码计算过程中用到下面的内容表数据:
00D7A8F0 D0 61 46 00 6D CE BF 58
嗅F.m慰X
================================================================================================
0046627A |> /8B45 F8 /
mov eax , [
ebp -8]
0046627D |. |8B55 F0 |
mov edx , [
ebp -10]
00466280 |. |8A4410 FF |
mov al , [
eax +
edx -1] ;
用户名HEX
00466284 |. |0FB755 EE |
movzx edx , word ptr [
ebp -12] ; 4DE1 (
后面为循环结果)
00466288 |. |C1EA 08 |
shr edx , 8 ;
结果 DIV $100
0046628B |. |32C2 |
xor al ,
dl ;
对HEX和处理结果xor处理
0046628D |. |8845 F5 |
mov [
ebp -B],
al ;
处理结果
00466290 |. |33C0 |
xor eax ,
eax
00466292 |. |8A45 F5 |
mov al , [
ebp -B] ;
处理结果数据
00466295 |. |66:0345 EE |
add ax , [
ebp -12] ;
结果+4DE1(循环结果)
00466299 |. |8B55 FC |
mov edx , [
ebp -4] ; [0012F5EC]=00D7A8F0
查表
0046629C |. |66:F76A 04 |
imul word ptr [
edx +4] ;
取数据$CE6D EAX*EDX 取低4位或者看作 MOD $10000
004662A0 |. |8B55 FC |
mov edx , [
ebp -4] ; [0012F5EC]=00D7A8F0
查表
004662A3 |. |66:0342 06 |
add ax , [
edx +6] ;
结果+$58BF
004662A7 |. |66:8945 EE |
mov [
ebp -12],
ax ;
结果MOD $10000 得到循环处理用到的数据
004662AB |. |8D4D E4 |
lea ecx , [
ebp -1C]
004662AE |. |33C0 |
xor eax ,
eax
004662B0 |. |8A45 F5 |
mov al , [
ebp -B] ;
得到的XOR结果
004662B3 |. |BA 02000000 |
mov edx , 2
004662B8 |. |E8 831CFAFF |
call 00407F40
004662BD |. |8B55 E4 |
mov edx , [
ebp -1C] ;
转换HEX为字符连接为正确注册码
004662C0 |. |8B45 08 |
mov eax , [
ebp +8]
004662C3 |. |E8 A0DFF9FF |
call 00404268
004662C8 |. |8B45 08 |
mov eax , [
ebp +8]
004662CB |. |FF45 F0 |
inc dword ptr [
ebp -10]
004662CE |. |FF4D E8 |
dec dword ptr [
ebp -18]
004662D1 |.^\75 A7 \jnz
short 0046627A
=======================================================
var
a,b,c,l,i:Integer;
name1,sn:String;
begin
name1:=Edit1.Text;
l:=Length(edit1.text);
if l=0 then exit;
a:=$4de1;
b:=0;
c:=0;
sn:='';
for i:=1 to l
do
begin
b:=ord(name1[i]);
c:=(a
div $100)
xor b;
a:=((((a+c)*$CE6D) mod $10000)+$58BF) mod $10000;
sn:=sn+hextostr(c,2);
end;
edit2.Text:=sn;
里面的数据处理 a shr 8 用了div实现
计算后的eax结果用mod 处理实现取ax的值。
--------------------------------------------------------------------------------
【总结】
比较简单,主要熟悉shr与div的转化,以及eax与ax之间的处理。
刚学习delphi,一切都觉得困难,继续努力ing。
--------------------------------------------------------------------------------
【版权声明】: 转载请注明文章出自http://www.pediy.com
本代码的着色效果由xTiNt自动完成
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: