首页
社区
课程
招聘
看完了论坛里的破文准备自己也写一个keygen锻炼一下不过遇到 问题
发表于: 2006-6-18 11:50 4747

看完了论坛里的破文准备自己也写一个keygen锻炼一下不过遇到 问题

2006-6-18 11:50
4747
keygen是delphi写的
坛子里的破文如下
004417C6  |.  55            PUSH EBP                          在这里下断                       
004417C7  |.  68 60184400   PUSH CrackMe0.00441860
004417CC  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004417CF  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004417D2  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
004417D5  |.  8B83 C8020000 MOV EAX,DWORD PTR DS:[EBX+2C8]
004417DB  |.  E8 C419FEFF   CALL CrackMe0.004231A4                   ;  取假码位数
004417E0  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004417E3  |.  50            PUSH EAX                                 ;  EAX=假码
004417E4  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
004417E7  |.  8B83 C4020000 MOV EAX,DWORD PTR DS:[EBX+2C4]
004417ED  |.  E8 B219FEFF   CALL CrackMe0.004231A4                   ;  取注册名位数
004417F2  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  EBP-C=注册名
004417F5  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004417F8  |.  E8 FBFEFFFF   CALL CrackMe0.004416F8                   ;  算法CALL,跟进
004417FD  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
00441800  |.  58            POP EAX
00441801  |.  E8 3E23FCFF   CALL CrackMe0.00403B44                      真假注册码比较
00441806  |.  75 1A         JNZ SHORT CrackMe0.00441822                 不相等则跳向失败。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入算法CALL
来到这里。。。。。。
004416F8  /$  53            PUSH EBX
004416F9  |.  56            PUSH ESI
004416FA  |.  57            PUSH EDI
004416FB  |.  83C4 DC       ADD ESP,-24
004416FE  |.  891424        MOV DWORD PTR SS:[ESP],EDX
00441701  |.  8BF8          MOV EDI,EAX
00441703  |.  BB 05033949   MOV EBX,49390305
00441708  |.  BE 20126348   MOV ESI,48631220
0044170D  |.  8BC7          MOV EAX,EDI
0044170F  |.  E8 2023FCFF   CALL CrackMe0.00403A34                   ;  取注册名位数
00441714  |.  85C0          TEST EAX,EAX                             ;  有注册名吗?没有则跳向OVER
00441716  |.  7E 2E         JLE SHORT CrackMe0.00441746
00441718  |.  BA 01000000   MOV EDX,1                                ;  令EDX=1
0044171D  |>  33C9          /XOR ECX,ECX                             ;  ECX清零
0044171F  |.  8A4C17 FF     |MOV CL,BYTE PTR DS:[EDI+EDX-1]          ;  取注册名的ASCII值
00441723  |.  33D9          |XOR EBX,ECX
00441725  |.  33F3          |XOR ESI,EBX
00441727  |.  F6C3 01       |TEST BL,1                                   判断EBX的后两位转换成十进制数后的奇偶性
0044172A  |.  74 0F         |JE SHORT CrackMe0.0044173B                  偶数就跳,奇数就不跳
0044172C  |.  D1FB          |SAR EBX,1
0044172E  |.  79 03         |JNS SHORT CrackMe0.00441733
00441730  |.  83D3 00       |ADC EBX,0
00441733  |>  81F3 11032001 |XOR EBX,1200311
00441739  |.  EB 07         |JMP SHORT CrackMe0.00441742
0044173B  |>  D1FB          |SAR EBX,1                               ;  EBX/2 即EBX除以2的一次方
0044173D  |.  79 03         |JNS SHORT CrackMe0.00441742
0044173F  |.  83D3 00       |ADC EBX,0
00441742  |>  42            |INC EDX                                 ;  EDX+1
00441743  |.  48            |DEC EAX                                 ;  EAX-1
00441744  |.^ 75 D7         \JNZ SHORT CrackMe0.0044171D
00441746  |>  8B0424        MOV EAX,DWORD PTR SS:[ESP]
00441749  |.  50            PUSH EAX                                 ;  
0044174A  |.  8BC3          MOV EAX,EBX                              ;  将EBX的值赋给EAX
0044174C  |.  25 FFFF0000   AND EAX,0FFFF                            ;  取EAX的后四位
00441751  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX             ;  ESP+8=EAX的后四位
00441755  |.  C64424 0C 00  MOV BYTE PTR SS:[ESP+C],0                ;  
0044175A  |.  C1EB 10       SHR EBX,10                               ;  取EBX的前四位
0044175D  |.  895C24 10     MOV DWORD PTR SS:[ESP+10],EBX            ;  ESP+10=EBX的前四位
00441761  |.  C64424 14 00  MOV BYTE PTR SS:[ESP+14],0               ;
00441766  |.  8BC6          MOV EAX,ESI                              ;  将ESI的值赋给EAX
00441768  |.  25 FFFF0000   AND EAX,0FFFF                            ;  取ESI的后四位
0044176D  |.  894424 18     MOV DWORD PTR SS:[ESP+18],EAX            ;  ESP+18=ESI的后四位
00441771  |.  C64424 1C 00  MOV BYTE PTR SS:[ESP+1C],0               ;
00441776  |.  C1EE 10       SHR ESI,10                               ;  取ESI的前四位
00441779  |.  897424 20     MOV DWORD PTR SS:[ESP+20],ESI            ; ESP+20=ESI的前四位
0044177D  |.  C64424 24 00  MOV BYTE PTR SS:[ESP+24],0               ;
00441782  |.  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]             ;
00441786  |.  B9 03000000   MOV ECX,3                                ;
0044178B  |.  B8 A4174400   MOV EAX,CrackMe0.004417A4                ; |%.4x-%.4x-%.4x-%.4x
00441790  |.  E8 6F68FCFF   CALL CrackMe0.00408004                   ; 合并成注册码。
00441795  |.  83C4 24       ADD ESP,24
00441798  |.  5F            POP EDI
00441799  |.  5E            POP ESI
0044179A  |.  5B            POP EBX
0044179B  \.  C3            RETN
------------------------------------------------------------------------
算法总结:
1)取用户名第一位的ASCII值。
2)将这个值与A=49390305做XOR运算。得到A1。
3)将A1与B1=48631220做XOR运算,得到B2。
4)将A1最右边两位转换成相应的十进制数,判断其奇偶性。
5)若为偶数:
     则A1除以2,结果再与1200311进行XOR运算。得到A2。
   若为奇数:
     则A1除以2,得到A2。
6)取用户名下一位的ASCII值,并与A2,B2重复以上运算。
7)循环的次数为用户名的位数。
8)将最终得到的结果An,Bn分成四段,每段四位。
9)An的后四位-An的前四位-Bn的后四位-Bn的前四位。
例:注册名tc (两位,所以循环计算两次)
第一步
    第一次:
1)取t的ASCII值74,与49390305进行XOR运算等于49390371
2)49390371再与ESI(此时ESI=48631220)进行XOR运算等于015A1151
3)将49390371的后两位即71,转换成十进制为133。
4)133是奇数所以。将49390371除以2商为249C81B8。249C81B8再与1200311进行XOR运算等于25BC82A9
   第二次:
1)取c的ASCII值63,与25BC82A9进行XOR运算等于25BC82CA
2)25BC82CA再与ESI(此时ESI=015A1151)进行XOR运算等于24E6939B
3)将25BC82CA的后两位即CA,转换成十进制为202。
4)202是偶数,所以。将25BC82CA除以2的商等于12DE4165。
第二步
    第一次:
1)将最终EBX的值An=12DE4165,按前四位后四位分成两段每段四位即:12DE,4165
2)将最终ESI的值Bn=24E6939B,按前四位后四位分成两段每段四位即:24E6,939B
    第二次
1)将An的后四位作为注册码的第一部分,前四为作为注册码的第二部分
2)将Bn的后四位作为注册码的第三部分,前四为作为注册码的第四部分
最后输出结果
4165-12DE-939B-24E6
所以:注册名tc
      注册码4165-12DE-939B-24E6
----------------delphi代码如下-----------
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:real;
sp:ansistring;
i,nlen,xp:integer;
begin
a:=$49390305,b:=$48631220,i:=0;
sp:=edit1.text;
  nlen:=length(edit1.text);
  for i:=0 to nlen-1 do
   begin
   a:=strtoint(copy(sp,i,1)) xor a;
   b:=a xor b;
   xp:=right(intohex(a),2);
     if xp mod 2 = 0 then
     a:= (a shr 1) xor $1200311;
     else
     a:=a shl 1;
    end;
   edit2.text:= right(a,4) +'-'+ left(a,4)+'-'+right(b,4)+'-'+left(b,4);

end;

end.
哪位大哥帮忙帮看看啊  谢谢了 哪里 错了 请指点啊 ........拜托了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:real;
sp:ansistring;
i,nlen,xp:integer;
begin
a:=$49390305,b:=$48631220,i:=0;   //错误 语句分割用;
sp:=edit1.text;
  nlen:=length(edit1.text);
  for i:=0 to nlen-1 do
   begin
   a:=strtoint(copy(sp,i,1)) xor a;     //real  不支持xor
   b:=a xor b;
   xp:=right(intohex(a),2);   //xp integer, 无right函数,只有rightstr ,无intohex,只有inttohex,参数个数也不对
     if xp mod 2 = 0 then
     a:= (a shr 1) xor $1200311;  //if 语句未结束,取消;
     else     
     a:=a shl 1;
    end;
   edit2.text:= right(a,4) +'-'+ left(a,4)+'-'+right(b,4)+'-'+left(b,4);//无rightstr,leftstr,需要StrUtils单元

end;

end.

就这么几句错误上10个
2006-6-18 12:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我刚学delphi  不好意思
上面的代码是对的了?
2006-6-18 13:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对了  2楼哥们 问一下  汇编中有 shl sal ...各种位移
delphi中就有  shl 足够了吗?
请教一下 一些细节问题
谢谢 请回 帖子
2006-6-18 19:53
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
5
移位位指令Delphi有的     ,Shr,Shl都有;
2006-6-18 20:17
0
游客
登录 | 注册 方可回帖
返回
//