用各种不同编程语言写注册机
的有关信息介绍如下:注册机编写
启动ollydbg和CRACKME。
关键代码如下::0040132B E80C020000 call 0040153C :00401330 89C6 mov esi, eax ; esi装姓名长度:00401332 83FE05 cmp esi, 00000005 ;比较姓名长度是不是小于5 。 :00401335 7D04 jge 0040133B ;不小于就跳,小于就错 :00401337 31C0 xor eax, eax :00401339 EB44 jmp 0040137F :0040133B 6A14 push 00000014 :0040133D 8D45D6 lea eax, dword ptr [ebp-2A] :00401340 50 push eax :00401341 6A66 push 00000066 :00401343 53 push ebx :00401344 E8F3010000 call 0040153C ;取注册码的长度。 :00401349 09C0 or eax, eax ;看看EAX是不是0,也就是注册码有没有输入。 :0040134B 7432 je 0040137F ;是0即没有输入就挂 :0040134D 31FF xor edi, edi ;初始化,EDI清零,用来做计数器。 :0040134F EB15 jmp 00401366 ;跳到算法开始。 :00401351 0FBE443DD6 movsx eax, byte ptr [ebp+edi-2A] ;注册码第一个字符入EAX。:00401356 0FBE543DEB movsx edx, byte ptr [ebp+edi-15] ;姓名第一个字符入EDX。 :0040135B 29FA sub edx, edi ;用姓名第一个字符的ASCII码减去EDI(计数器,首次为0)。 :0040135D 39D0 cmp eax, edx ;比较EAX和EDX是否相等。:0040135F 7404 je 00401365 ;相等就继续。跳(这里改变z标志位的值强行跳过。) :00401361 31C0 xor eax, eax :00401363 EB1A jmp 0040137F ;不等就挂。 :00401365 47 inc edi ;计数器EDI加1。 :00401366 39F7 cmp edi, esi ;比较EDI是否等于ESI(姓名长度),也就是注册码是否计算完毕。 :00401368 7CE7 jl 00401351 ;相等就结束,不相等则继续。到这里第一次循环结束。第一位注册码验证完毕。在0040135D这里是关键的比较。以后的几次循环算法是一样的,只是数值不同。算法弄的差不多了。
:0040136A 6A00 push 00000000 :0040136C 6848204000 push 00402048 :00401371 6850204000 push 00402050 :00401376 53 push ebx :00401377 E8E4010000 call 00401560 注册成功! 下面总结一下:算法总结:程序的流程是这样子的 1,比较输入姓名的长度是不是小于5。 2,比较注册码是不是没有输入。 3,算法开始,第1位注册码要等于第1位姓名的ASCII码-0(EDI的值)。 第2位注册码要等于第2位姓名的ASCII码-1。 第3位注册码要等于第3位姓名的ASCII码-2。依次类推。 NAME:abcde SERIAL:aaaaa 到这里算法分析完毕。注册码也出来了。程序计算的流程也弄明白了。用你熟悉的编程语言来模拟一下程序作个注册机。
VB版的注册机先介绍一下里面用到的一般书上没有的函数。我用的是VB6。0企业版。 LEN() 返回字符串的长度。 ASC()返回字符的ASCII码,VB返回的是10进制的。 MID()返回参数指定的字符。用法:MID(目标字符串,开始的位数,取字符的个数) STRING()把数字转换为字符。如:A=STRING(76)此时A=“L”。 启动VB6,新建一个工程。在FORM上加两个LABLE控件。然后加两个TEXTBOX控件。一个COMMANDBUTTON控件。 TEXT1。TEXT用来获取NAME,TEXT2。TEXT用来输出SERIAL。 在COMMAND1控件的CLICK事件里如下代码: Private Sub Command1_Click() Dim a, b, c, d, e '变量声明。VB不用特别声明变量的类型。多简单。:) text2.text="姓名不能小于5位!大哥!" a = Text1.Text 'a=输入的姓名 b = Len(a) 'b=姓名的长度 c = 0 '设一个计数器,类似于程序中的EDI。 If b < 5 Then GoTo a: '判断姓名长度。小于5就什么也不做。 Do ’循环语句,用来计算注册码。 d = Mid(a, c, 1) d = Asc(d) d = d - c d = String(1, d) e = e & d c = c + 1 Loop While c <= b-1Text2.Text = e '输出注册码。 a: End Sub 然后用P-CODE编译。才12KB。
Visual C++的注册机 先用APPWIZARD做一个默认的DIALOG BASED。然后删掉上面的东西。加入两个EDITBOX,一个BUTTON。 EDITBOX1用来获得NAME,EDITBOX2用来输出SERIAL。 用CLASSWIZARD加入EDITBOX1的MEMBER m_name.EDITBOX2的MEMBER m_key. 用CLASSWIZARD在BUTTON1的BN_CLICKED事件加个函数OnButton1() 加入如下代码: void CLLDlg::OnButton1() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_key = ""; char * pName= m_name.GetBuffer(0); if(m_name.GetLength() < 5)MessageBox("姓名必须大于5个字母", "error", MB_OK); else{ for(int n=0;n<=m_name.GetLength();n++) { m_key += *(pName+n)-n; } UpdateData(FALSE); }; m_name.ReleaseBuffer(); } 用RELEASE编译。
Turbo C版的注册机
#include "stdio.h" main() { unsigned char a; int d,i; unsigned long s; start:printf("*********-={ figugegl }=- Crackme #1*********\nThis keygen is made by fpx\nPlease input your name : "); gets(a); d=strlen(a); if(d<5) {printf("Your user name must longer than 4 letters!!please re-input\n");goto start;} printf("Your Register code is : "); for(i=0;i DELPHI版的注册机 procedure TForm1.BitBtn1Click(Sender: TObject); var a,c,e:string; //定义a、c、e为字符型, b,d:integer; //定义b、d为数值型。 begin a:=edit1.Text; //让a的值等于EDIT1的值。 if length(a)<5 then //LENGTH()相当于VB中的LEN(),如果注册名小于则报错。 showmessage('注册名不能小于五位!') else begin for b:=1 to length(a) do ’循环语句,用来计算注册码。 begin d:=ord(a[b]); d:=d+1-b; c:=chr(d); e:=e+c; end; end; edit2.Text:=e; end; 只是将上面的VB版改为DELPHI的了:) keymake算法注册机 .const .data szHomePage db "http://fpx.yeah.net",0 szEmail db "mailto:fpx425@163.com",0 szErrMess db "请输入姓名!",0 szBuffer db 30 dup (0) szErrNameLen db "姓名位数不能小于5!",0 .code mov esi,eax invoke lstrlen,esi cmp eax,5 jb ERR mov edx,eax xor eax,eax xor ecx,ecx n1: mov al,byte ptr [esi+ecx] sub al,cl mov byte ptr [szBuffer+ecx],al inc ecx cmp ecx,edx jl n1 lea eax,szBuffer jmp n2 ERR: lea eax,szErrNameLen n2: