首页
社区
课程
招聘
[推荐]用各种不同编程语言写注册机
发表于: 2006-4-28 21:01 7513

[推荐]用各种不同编程语言写注册机

2006-4-28 21:01
7513
用各种不同编程语言写注册机

启动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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
支持一下!
2006-4-28 22:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
收藏...学习
2006-4-28 22:28
0
雪    币: 454
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,学习一下。
2006-4-29 01:06
0
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好,正在学习。
2006-4-29 11:17
0
雪    币: 230
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,学习一下~~~
2006-4-29 12:17
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
支持
2006-4-29 12:31
0
雪    币: 279
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8

学习啦~~
2006-4-29 13:02
0
雪    币: 560
活跃值: (354)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
9
学习,楼主比较"全能".
2006-4-29 14:19
0
雪    币: 247
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
强,学习一个
2006-4-29 14:22
0
雪    币: 436
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
?主的?算?遮言?得一定不邋吧!!
2006-4-29 14:28
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这篇贴子似曾相识。
2006-4-29 14:52
0
雪    币: 182
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
厉害,怎么什么都会啊
2006-4-29 14:54
0
雪    币: 142
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错呀:还是好好学习吧,我能力有限:只能学习了。
2006-4-29 19:03
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
15
最初由 ranger 发布
用各种不同编程语言写注册机

启动ollydbg和CRACKME。
关键代码如下:
:0040132B E80C020000 call 0040153C
........


警告ranger一次!转帖的东西请注明,并且不要去头截尾!下次再有类似行为封ID!

原文:http://www.pediy.com/bbshtml/bbs4/kanxue156.htm

被去除的的开头部分:
标 题:注册机写作教学。奉贤给想加入CCG和BCG的朋友。 (11千字)
发信人:LL[CCG]
时 间:2001-10-21 23:18:55
详细信息:

前些天在论坛看到有人问软件的算法是如何看懂的 ??注册机是如何写出来的??有感于目前看雪教学中没有这方面的内容(对于不是明码比较的注册机工具就都没有办法了)。于是这篇文章出炉了.由于我对编程方面的技术实在是那个。所以拉来了halfbit(云观)老哥。让他帮忙写ASM,VC的注册机。我自己来写VB的。
本文的目的是通过一个简单的CRACKME的破解来说一下算法的分析和注册机的写作(针对于NAME/SERIAL保护的)。奉献给想加入BCG和CCG的破解爱好者。我尽量写的详细点。如有不明之处请发信到llmen@sina.com
工具:调试器一个(我用的是TRW2000)。编程工具一个。iceClock。

技术要求:熟悉基本的汇编指令。调试器的运用。编程基础(什么 ??你说你不会。。。。那就去找一本书了。一般看完前4章就可以了。由于能力原因只给出了VB,VC,ASM的注册机原代码。)

目标:http://www.cracknow.com/crackme/figugegl.1.zip 2KB。伪装者那里的。加了自己写的壳,入口点是0040147B。
选目标可让我费了些工夫。一开始halfbit让我找个软件,可是我没找到简单点的。才想到CRACKME,又小又简单。可是手头只有CCG和BCG的考试CRACKME。不过为了生命安全着想我还是用别的吧。:)
废话说完了,现在我们开始。

启动TRW2000和CRACKME。输入姓名:liuliu,注册码:98765,用HMEMCPY做断点。点下CHECK。断下来,用PMODULE回到程序领空。跟踪的时候要注意寄存器EAX,EBX,ECX,EDX,ESI,EDI的变化。用D命令查看内容。
:0040132B E80C020000 call 0040153C
:00401330 89C6 mov esi, eax 我们在这里,
:00401332 83FE05 cmp esi, 00000005 比较姓名长度是不是小于5 。


标 题:TC的注册机~~~ (596字)
发信人:伪装者[CCG]
时 间:2001-10-22 0:00:39
详细信息:


#include "stdio.h"
main()
{
unsigned char a[80];
int d,i;
unsigned long s;
start:printf("*********-={ figugegl }=- Crackme #1*********\nThis keygen is made by Pretender \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);

printf("\n ***************************** --- --- ---\n *Welcome to WWW.CRACKNOW.COM* / / / --\n ***************************** --- --- --/\n");
}

2006-4-29 20:21
0
雪    币: 93944
活跃值: (200219)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
16
同意坛主的意见!

如果再有类似情况,BAN ID.

If again has the similar situation, BAN ID.
2006-4-29 20:32
0
雪    币: 450
活跃值: (552)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
17
严禁抄袭!
转载请注明出处!
2006-4-29 21:03
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
会的语言还真不少,不过是转贴的,原创的人真强
2006-4-29 22:22
0
雪    币: 269
活跃值: (51)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
kanxue真是厉害,一眼就看出来了,原来是抄的别人的。
2006-5-2 16:20
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hxx
20
BS一下
2006-5-2 17:53
0
游客
登录 | 注册 方可回帖
返回
//