野猫III 发表于 2006-7-15 12:03:05

E语言KeyGen的中文名与位数取值以英文形式如何解决?

https://www.chinapyg.com/viewthread.php?tid=5716&extra=page%3D2

今天早上搞了1个小时,咱做的E KeyGen还是只支持E文.

接着用中文名字将这个CrackMe跟了一下,结果是这样子的:

取的中文名字以一个中文字符为一位,如:我的猫呀~   <--位数是5
中文名字第一位代码是4个数字.

而易语言里的是:
用户名:我的猫呀~<---位数是10 ,晕咯,当成E文来计算.
第一位的代码是2位的数字...呵呵~乱呀~~~


+++++++++++++++++++++++++++++++++

算法心得:
注册名: WildCatIII <------
在40241B处位数10位,16进制中为A,
在402420处注册名位数A乘以17CFB积得CC1CE,

在402433处取注册名首字母W的16位表达值57,在402436与上面所得的积相加得:EE225

在40243F这个Call里转换成10进制得975397,这个结果在402523位置与软件作者预定的AKA-相组合得最终注册码:AKA-975397

从这个简单的算法来看,注册过程中只提取用户名位数,检验用户名首字符,所以如果满足了这两个条件注册码还是一样的。。。

用咱的注册名引出的例子如:
注册名:W123456789 <--10位且第一个字母为W,所以一样的注册成功!
注册码:AKA-975397
++++++++++++++++++++++++++++++++++++

.版本 2

.程序集 窗口程序集1

.子程序 _按钮2_被单击

信息框 (“Code by WildCatIII” + #换行符 + #换行符 + “ 独立完成于2006/06/26” + #换行符 + #换行符 + “中文用户名Di支持有待修复!”, 0, “关于”)


.子程序 __启动窗口_创建完毕

_启动窗口.标题 = “VBCrackMe1 Keygen!”

.子程序 _按钮1_被单击
.局部变量 user, 文本型
.局部变量 code, 整数型
.局部变量 i, 整数型
.局部变量 Me2, 整数型
.局部变量 Word, 文本型
.局部变量 变量, 整数型

user = 编辑框1.内容
i = 取文本长度 (user)
Me2 = i × 97531' 注册名位数乘以17CFBh
Word = “AKA-”
.如果 (i ≥ 1)
    .计次循环首 (i, 变量)
      code = Me2 + 取代码 (user, 1)
    .计次循环尾 ()
    编辑框2.内容 = Word + 到文本 (code)
.否则
    否则 ()
    信息框 (“用户名还没输入噢!”, 0, “温馨提示!”)
.如果结束


.子程序 否则

https://www.chinapyg.com/attachments/SpxImage_5H1UNXVD7SyX.gif
https://www.chinapyg.com/attachments/xO9zKOh_kpIimDQeCSD6.gif

周笔畅 笔记 Flash
http://vlike.8812345.com/flash/18609.htm

Lifes a struggle
http://vlike.8812345.com/flash/15581.htm

阿地的进行曲
http://www.8812345.com/flash/11/17.htm

周笔畅 天鹅
http://www.vlike.com/flash/20488.htm

[ 本帖最后由 野猫III 于 2006-7-15 12:32 编辑 ]

快雪时晴 发表于 2006-7-15 16:50:17

中英文随你便

00402415    FF15 E4404000   CALL DWORD PTR DS:[<&MSVBVM50.__vbaLenBstr>]             ; MSVBVM50.__vbaLenBstr
0040241B    8BF8            MOV EDI,EAX
0040241D    8B4D E8         MOV ECX,DWORD PTR SS:
00402420    69FF FB7C0100   IMUL EDI,EDI,17CFB
00402426    51            PUSH ECX
00402427    0F80 91020000   JO CrackMe1.004026BE
0040242D    FF15 F8404000   CALL DWORD PTR DS:[<&MSVBVM50.#516>]                     ; MSVBVM50.rtcAnsiValueBstr
00402433    0FBFD0          MOVSX EDX,AX
00402436    03FA            ADD EDI,EDX
00402438    0F80 80020000   JO CrackMe1.004026BE
0040243E    57            PUSH EDI
0040243F    FF15 E0404000   CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrI4>]               ; MSVBVM50.__vbaStrI4





'W'+'i'+'l'+'d'+'C'+'a'+'t'+'I'+'I'+'I'


int WideCharToMultiByte(

    UINT CodePage,        // code page
    DWORD dwFlags,        // performance and mapping flags
    LPCWSTR lpWideCharStr,        // address of wide-character string
    int cchWideChar,        // number of characters in string
    LPSTR lpMultiByteStr,        // address of buffer for new string
    int cchMultiByte,        // size of buffer
    LPCSTR lpDefaultChar,        // address of default for unmappable characters
    LPBOOL lpUsedDefaultChar         // address of flag set when default char. used
   );

快雪时晴 发表于 2006-7-15 16:52:32

截图   ===================

快雪时晴 发表于 2006-7-15 17:06:56

指出猫兄一个冗长语句,没错但没必要

原帖由 野猫III 于 2006-7-15 12:03 发表
.计次循环首 (i, 变量)
      code = Me2 + 取代码 (user, 1)
    .计次循环尾 ()


我E语言不熟,上述语句误导了我,还以为你手误写错了,跟了一下才知道完全没必要用循环




另外,如果用VB写keygen的话,估计要直观容易的多,因为crackme就是vb的,照着写就OK了

[ 本帖最后由 快雪时晴 于 2006-7-15 17:08 编辑 ]

野猫III 发表于 2006-7-15 17:50:07

呵呵~不是误导,是咱菜才用这个循环的,但这个循环的作用是只取前面的一个字符。
呵呵~ 菜鸟笨坏了的方法,请莫见笑~~~


没看到兄弟的E源码呀~~~着急中~
Private Sub Command1_Click()
Dim Name, Str1, Code As String
Dim LenName, Name1 As Integer
Dim Code1 As Long

Name = Text1.Text
LenName = Len(Name)
Str1 = "AKA-"
If LenName <> 0 Then
   Name1 = Asc(Left(Name, 1))
   Code1 = LenName * 97531
   Code1 = Code1 + Name1
      Code = Code1
   Text2.Text = Str1 + Code
Else
   MsgBox "用户名还没输入呢!", 0, "输入有误"
End If
End Sub

[ 本帖最后由 野猫III 于 2006-7-15 17:56 编辑 ]

Mysoft 发表于 2006-7-15 18:17:35

菜鸟还看不大明白,学习中。。。。。

快雪时晴 发表于 2006-7-16 15:24:06

原帖由 野猫III 于 2006-7-15 17:50 发表
没看到兄弟的E源码呀~~~着急中~





.版本 2

.程序集 窗口程序集1

.子程序 _按钮2_被单击

信息框 (“Code by 快雪时晴, 完美支持中英文混合” + #换行符 + #换行符 + “ 2006/07/15” + #换行符 + #换行符 + “:-)”, 0, “关于”)


.子程序 __启动窗口_创建完毕

_启动窗口.标题 = “VBCrackMe1 Keygen!”

.子程序 _按钮1_被单击
.局部变量 user, 文本型
.局部变量 code, 整数型
.局部变量 i, 整数型
.局部变量 Me2, 整数型
.局部变量 Word, 文本型
.局部变量 变量, 整数型
.局部变量 y, 字节型
.局部变量 bstr, 字节集


user = 编辑框1.内容

' 举例: 我1
' (ASCII)宽字符为 CE D2 31
' Unicode 为 11 62 31 00
' UTF-8 为 91 88 E6 31

bstr = ANSI转UNICODE (user)
i = 取字节集长度 (bstr) - 2
i = i ÷ 2

Me2 = i × 97531' 注册名位数乘以17CFBh

Word = “AKA-”
.如果 (i ≥ 1)

    code = 取代码 (user, 1)
    .如果真 (code < 0)
      ' 中文字符
      bstr = 取字节集左边 (到字节集 (user), 2)
      y = 取字节集数据 (bstr, 1, 2)
      code = code × 256 + y

    .如果真结束


    code = Me2 + code

    编辑框2.内容 = Word + 到文本 (code)
.否则
    否则 ()
    信息框 (“用户名还没输入噢!”, 0, “温馨提示!”)
.如果结束


.子程序 否则






函数库:

野猫III 发表于 2006-7-20 10:53:45

哈哈~建议老大封快雪时晴兄为万事懂,热心僮!

再问一下:

.如果真 (code < 0)
      ' 中文字符
      bstr = 取字节集左边 (到字节集 (user), 2)
      y = 取字节集数据 (bstr, 1, 2)
      code = code × 256 + y  '不知道这乘以256是什么意思?原算法没有这个~

    .如果真结束


    code = Me2 + code

    编辑框2.内容 = Word + 到文本 (code)

pentacle 发表于 2006-7-20 19:06:43

上面的方法还得用上一个模块。很不爽的。直接用下面的方法就可以了


.版本 2

.程序集 窗口程序集1

.子程序 _按钮1_被单击
.局部变量 试验用字, 文本型
.局部变量 十六进制文本, 文本型
.局部变量 字前, 整数型
.局部变量 字后, 整数型
.局部变量 转回汉字, 文本型

试验用字 = “我”
字前 = 取代码 (试验用字, 1) + 256' 一个汉字分为二个字节,这是取前面的字节.加256是因为易语言取代码取出的值为负的原因
字后 = 取代码 (试验用字, 2) + 256' 一个汉字分为二个字节,这是取后面的字节
十六进制文本 = 取十六进制文本 (字前) + 取十六进制文本 (字后)' 取十六进制文本
转回汉字 = 字符 (字前) + 字符 (字后)' 通过十六进制的ASCII值转回汉字
编辑框1.内容 = 十六进制文本' 在编辑框中显示
编辑框2.内容 = 转回汉字



[ 本帖最后由 pentacle 于 2006-7-20 19:08 编辑 ]

快雪时晴 发表于 2006-7-20 22:53:59

原帖由 野猫III 于 2006-7-20 10:53 发表
哈哈~建议老大封快雪时晴兄为万事懂,热心僮!

再问一下:
code = code × 256 + y  '不知道这乘以256是什么意思?原算法没有这个~
    ...


*256=左移8位
页: [1] 2
查看完整版本: E语言KeyGen的中文名与位数取值以英文形式如何解决?