首页
社区
课程
招聘
写KEYGEN遇到了问题求助!
发表于: 2006-6-1 12:07 7682

写KEYGEN遇到了问题求助!

2006-6-1 12:07
7682
我写 一个KEYGEN 遇到了问题
Dim sname, aname As Variant
Dim i, j, y As Integer
Dim A, B As Long
A = 1228473093 '常数
B = 1214452256 '常数

i = Len(name1.Text) '得到name长度
For j = 1 To i
sname = Asc(Mid(name1.Text, j, 1)) '分别取每位的ASC码16

sname = sname Xor A '10
A = sname '保留这个 A
sname = sname Xor B '10
B = sname '10

y = Right(Hex(A), 2) '取后两位(是16进制时候的后2位)
  If y Mod 2 = 0 Then '如果为偶数。。!这里其实是比较Y是不是偶数,但是我不知道用什么函数把Y变成10进制的,搜索了也没找到, 就有10进制变成16进制的,大家帮我看看 还有别的办法没?我感觉不用函数换个思路可以不?!
               
                sname = sname \ 2
                A = sname Xor 18875153
                Else '奇数
                A = sname \ 2
  End If
Next j
code1.Text = Mid(A, 5, 4) & "-" & Mid(A, 1, 4) & "-" & Mid(B, 5, 4) & "-" & Mid(B, 1, 4)

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

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
2
看不懂你的程序,只看到AB被赋值了好几次。不过VB的16进制转10进制很简单,求A的10进制只要&HA即可。假如你非要个转换函数的话可以用下面这个:

Public Function HEX_to_DEC(ByVal Hex As String) As Long
  Dim i As Long
  Dim B As Long
   Hex = UCase(Hex)
  For i = 1 To Len(Hex)
    Select Case Mid(Hex, Len(Hex) - i + 1, 1)
        Case "0": B = B + 16 ^ (i - 1) * 0
        Case "1": B = B + 16 ^ (i - 1) * 1
        Case "2": B = B + 16 ^ (i - 1) * 2
        Case "3": B = B + 16 ^ (i - 1) * 3
        Case "4": B = B + 16 ^ (i - 1) * 4
        Case "5": B = B + 16 ^ (i - 1) * 5
        Case "6": B = B + 16 ^ (i - 1) * 6
        Case "7": B = B + 16 ^ (i - 1) * 7
        Case "8": B = B + 16 ^ (i - 1) * 8
        Case "9": B = B + 16 ^ (i - 1) * 9
        Case "A": B = B + 16 ^ (i - 1) * 10
        Case "B": B = B + 16 ^ (i - 1) * 11
        Case "C": B = B + 16 ^ (i - 1) * 12
        Case "D": B = B + 16 ^ (i - 1) * 13
        Case "E": B = B + 16 ^ (i - 1) * 14
        Case "F": B = B + 16 ^ (i - 1) * 15
    End Select
  Next i
  HEX_to_DEC = B
End Function
2006-6-1 14:17
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
其实是以前一个 crackme的 注册机我正在练习写 不过遇到了问题
算法如下:
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
哪个 哥们帮帮我 我头一次写 KEYGEN

2006-6-1 20:34
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
4
Private Sub Command1_Click()
Dim a, b

a = &H49390305
b = &H48631220
For i = 1 To Len(Text1.Text)
a = a Xor Asc(Mid(Text1.Text, i, 1))
b = b Xor a
If CLng("&h" & Right(Hex(a), 2)) Mod 2 = 0 Then
a = a / 2
Else
a = (a / 2) Xor &H1200311
End If
Next
Text2.Text = Right(Hex(a), 4) & "-" & Left(Hex(a), 4) & "-" & Right(Hex(b), 4) & "-" & Left(Hex(b), 4)
End Sub
2006-6-2 12:49
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢你 哥们!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2006-6-3 12:35
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哥们我  请教一下 VB适合写  一些 算法吗》?
2006-6-3 12:57
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
7
当然可以.
2006-6-4 12:28
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哥们 按照你的代码我做了个KEYGEN 不过 如果用户名大于2位时候 注册码就有错误这是怎么搞的?
作者的破文中这样写着你看看哪里有错误?
4)OD重新载入程序,输入注册信息确定后程序中断。
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
------------------------------------------------------------------------
我感觉没有错误 KEYGEN也对啊
不过就是不知道 哪里 有问题了....郁闷了好久 哥们你 能帮 看看不
还有 能把 QQ留下不?
2006-6-8 08:55
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
9
注册机是根据你的描述写出来的,从上面的部分代码看,你的分析与软件的算法有出入.SAR(算术右移)并不全等于十六进制值除2,这当中还涉及到进位,VB中没有SAR函数,可以自己写一个:

Public CF As Boolean '进位标志
Public Function SAR(xsar As Long, n As Integer) As Long '自定义Sar算术右移函数
Dim I As Integer
For I = 1 To n - 1
xsar = xsar \ 2 '右移
Next I
CF = xsar And 1 '判断D0位是否进位
SAR = xsar \ 2 '右移
End Function
2006-6-8 11:16
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 laomms 发布
注册机是根据你的描述写出来的,从上面的部分代码看,你的分析与软件的算法有出入.SAR(算术右移)并不全等于十六进制值除2,这当中还涉及到进位,VB中没有SAR函数,可以自己写一个:

Public CF As Boolean '进位标志
Public Function SAR(xsar As Long, n As Integer) As Long '自定义Sar算术右移函数
Dim I As Integer
........

这位哥们 麻烦了你这么多 真是谢谢
还有 感觉 跟你真学了 不少东西
谢谢
对了能 留 个QQ不 ....
2006-6-8 16:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
请问 laomms大哥  上面 写的这个 keygen  转换成 delphi的代码是什么样的
?用delphi写 怎么写?
2006-6-28 12:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我转 这样了 不过总提示有错误啊
procedure TForm1.Label3Click(Sender: TObject);
var
a,b,i:integer;
s:string;
begin
a := $49390305;
b := $48631220;
  for i:=1 to length(edit1.text) do
  begin
  a:=a xor ord(edit1.text[i]);//得到每一位的ASC码
  b:=b xor a;
  if (copy(a,j-6,2)) mod 2 =0 then a:= a shl 2;
  else
  a:=(a shl 2) xor $120331;
  end;
  edit2.text :=rightstr(a,4) +'-'+ leftstr(a,4) +'-'+ rightstr(b,4) +'-'+ leftstr(b,4);

  end;

end.
2006-6-28 12:49
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
13
DELPHI的ELSE前面不能带分号,copy(a,j-6,2),不知道什么意思,J也没有定义,自定义函数rightstr(),要求的对象应该是字符串,而括号中的A你已经定义为整型,需要转换.
2006-6-28 14:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
求 楼上大哥 帮忙写个 delphi版的呗?
拜托 本人垃圾实在搞 不出来了 .......
你那么厉害 一看就知道怎么搞的 拜托了写给我 回去学习研究
一下吧
看不懂我写的程序很正常没几个人能看的懂,因为我编程能力很差
拜托 laomms大哥
2006-6-28 20:52
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
15
function HexToInt(Tstr:string):longint;  //十六进制转十进制
var i,Tlen :integer;
    p1:array [0..1] of char;
begin
   result:=0;
   Tstr:=trim(Tstr);
   tlen:=length(Tstr);
   for i:=1 to tlen do
   begin
     StrPcopy(p1,copy(Tstr,i,1));
     result:=result*16+strToint(p1[0]);
   end
end;

function RightStr
    (Const Str: String; Size: Word): String;    // 取字符串右边函数
begin
  if Size > Length(Str) then Size := Length(Str) ;
  RightStr := Copy(Str, Length(Str)-Size+1, Size)
end;
function LeftStr                                  // 取字符串左边函数
    (Const Str: String; Size: Word): String;
begin
  LeftStr := Copy(Str, 1, Size)
end;

//-----------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
a,b:int64;
begin
   a := $49390305;
   b := $48631220;
for i:=0 to length(edit1.text)-1 do
  begin
    a:=a xor ord(edit1.text[i]);
    b:=b xor a;
    if a mod 2 =0 then a:= a shr 1
    else
    a:=(a shr 1) xor $1200311;
  end;
   edit2.text :=rightstr(inttohex(a,8),4) +'-'+ leftstr(inttohex(a,8),4) +'-'+ rightstr(inttohex(b,8),4) +'-'+ leftstr(inttohex(b,8),4);
end;
2006-6-29 08:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我晕  还要自己打造函数啊 delphi支持的函数那么少啊......
谢谢 laomms大哥 我回去研究研究吧........
2006-6-29 11:05
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
17
最初由 laomms 发布
function HexToInt(Tstr:string):longint; //十六进制转十进制
var i,Tlen :integer;
p1:array [0..1] of char;
begin
result:=0;
........

HexToInt不用自己写,Delphi自带有。
StrToInt('$'+String);在String前面加'$'符号就是转十六进制整数。
2006-6-29 11:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢 斑竹 哎呀``` 真晕啊
2006-6-29 11:59
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
19
知道这个函数,谢谢小虾提醒.
2006-6-29 12:35
0
游客
登录 | 注册 方可回帖
返回
//