用各种不同编程语言写注册机
启动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-1
Text2.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[80];
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<d;i++)
printf("%c",a[i]-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
);
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:
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法