首页
社区
课程
招聘
[原创]菜鸟用内联汇编写注册机
发表于: 2012-2-23 00:08 5611

[原创]菜鸟用内联汇编写注册机

2012-2-23 00:08
5611

标 题: 菜鸟用内联汇编写注册机(求邀请码)
作 者: XGalaxy
时 间: 2012-2-23,12:00:03

      
     相信不少同学看过,四波的【Crack之初体验系列】,一共三课,可是第四课迟迟不出来,【Crack之初体验-第三课 】
http://bbs.pediy.com/showthread.php?t=144053
的crackme,也算是菜鸟入门的一个很好的例子,但是注册机的制作方法四波同学没有告诉大家,我自己研究了一段时间,然后用内联汇编
写了一个注册机,把方法拿出来,与和我一样的菜鸟分享。废话不多说,进入正题。   

carakme,如图:

1、
OD载入,如图:

然后直接F9让程序跑起来。

2、
下bp GetDlgItemTextA断点,如图:

然后返回到程序


按钮,然后od自然就中断下来了,

如图:

然后Alt+F9返回程序领空,删除断点
如图:


分析汇编代码(汇编代码是从断首开始的)
004011BB  /$  55            push ebp
004011BC  |.  8BEC          mov ebp,esp
004011BE  |.  57            push edi
004011BF  |.  56            push esi
004011C0  |.  53            push ebx
004011C1  |>  6A 32         /push 0x32                               ; /Count = 32 (50.)
004011C3  |.  68 84624000   |push crackme2.00406284                  ; |Buffer = crackme2.00406284
004011C8  |.  6A 01         |push 0x1                                ; |ControlID = 1
004011CA  |.  FF75 08       |push [arg.1]                            ; |hWnd
004011CD  |.  E8 16020000   |call <jmp.&user32.GetDlgItemTextA>      ; \GetDlgItemTextA
004011D2  |.  64:8B15 18000>|mov edx,dword ptr fs:[0x18]
004011D9  |.  8B52 30       |mov edx,dword ptr ds:[edx+0x30]
004011DC  |.  0FB652 02     |movzx edx,byte ptr ds:[edx+0x2]
004011E0  |.  83F8 00       |cmp eax,0x0
004011E3  |.  7F 11         |jg short crackme2.004011F6
004011E5  |.  68 D8604000   |push crackme2.004060D8                  ; /Text = "nameless"
004011EA  |.  6A 01         |push 0x1                                ; |ControlID = 1
004011EC  |.  FF75 08       |push [arg.1]                            ; |hWnd
004011EF  |.  E8 0C020000   |call <jmp.&user32.SetDlgItemTextA>      ; \SetDlgItemTextA
004011F4  |.^ EB CB         \jmp short crackme2.004011C1
004011F6  |>  8D35 84624000 lea esi,dword ptr ds:[0x406284]
004011FC  |.  33C9          xor ecx,ecx
004011FE  |>  0FBE06        /movsx eax,byte ptr ds:[esi]
00401201  |.  8BD8          |mov ebx,eax
00401203  |.  2BF2          |sub esi,edx
00401205  |.  C1E0 04       |shl eax,0x4
00401208  |.  C1EB 05       |shr ebx,0x5
0040120B  |.  33C3          |xor eax,ebx
0040120D  |.  83C0 26       |add eax,0x26
00401210  |.  33C1          |xor eax,ecx
00401212  |.  03C8          |add ecx,eax
00401214  |.  46            |inc esi
00401215  |.  803E 00       |cmp byte ptr ds:[esi],0x0
00401218  |.^ 75 E4         \jnz short crackme2.004011FE
0040121A  |.  B8 EF0D0C00   mov eax,0xC0DEF
0040121F  |.  2BC1          sub eax,ecx
00401221  |.  0FAFC0        imul eax,eax
//当执行完这句后,大家注意eax和ecx的值,如图:
[ATTACH]64860[/ATTACH]

00401224  |.  50            push eax                                 ; /<%lX>
00401225  |.  51            push ecx                                 ; |<%lX>
00401226  |.  68 E1604000   push crackme2.004060E1                   ; |Format = "CM2-%lX-%lX"
0040122B  |.  68 B6624000   push crackme2.004062B6                   ; |s = crackme2.004062B6
00401230  |.  E8 9B010000   call <jmp.&user32.wsprintfA>             ; \wsprintfA


      
    执行到0040122B时候,可以发现004062B6=crackme2.004062B6 (ASCII "CM2-47B9-A21B9364"),如图:

    这个CM2-47B9-A21B9364就是正确的注册码。正确注册码有三部分,第一个部分是CM2,第二部分是47B9,第三部分是A21B9364。现在我们回到刚才的执行到00401221这句的时候,寄存器的值。如图:


    eax=A21B9364,ecx=000047B9。好了算法分析就么多了,可能我说的不是很清楚,有想了解更多的可以看四波同学的教程。其实我想说的,之所以用内联汇编就是不想分析其算法实现的具体细节,大概明白就行。


4,、
注册机制作。现在开始写注册机了,从刚才的分析我们不难得到,关键算法在这里:

004011F6  |> \8D35 84624000 lea esi,dword ptr ds:[0x406284] //esi指向字符串地址
004011FC  |.  33C9          xor ecx,ecx
004011FE  |>  0FBE06        /movsx eax,byte ptr ds:[esi]
00401201  |.  8BD8          |mov ebx,eax
00401203  |.  2BF2          |sub esi,edx
00401205  |.  C1E0 04       |shl eax,0x4
00401208  |.  C1EB 05       |shr ebx,0x5
0040120B  |.  33C3          |xor eax,ebx
0040120D  |.  83C0 26       |add eax,0x26
00401210  |.  33C1          |xor eax,ecx
00401212  |.  03C8          |add ecx,eax
00401214  |.  46            |inc esi
00401215  |.  803E 00       |cmp byte ptr ds:[esi],0x0
00401218  |.^ 75 E4         \jnz short crackme2.004011FE  //循环执行,name的字符次数,也就是name里输入几个字符就执行几次。
0040121A  |.  B8 EF0D0C00   mov eax,0xC0DEF
0040121F  |.  2BC1          sub eax,ecx
00401221  |.  0FAFC0        imul eax,eax //执行完了之后eax和ecx就是我们注册码的一部分


之后我们改写代码,od有个插件叫做,Asm2clipboard,用可以直接帮我们改写代码:


 lea esi,dword ptr ds:[00x406284h]   //dword ptr ds:[00x406284h]这里我们需要改的地方,用我们自己的字符串来代替
 xor ecx,ecx
L002:
 movsx eax,byte ptr ds:[esi]
 mov ebx,eax
 sub esi,edx  //其实这句有没有都可以,可以删除
 shl eax,00x4h
 shr ebx,00x5h
 xor eax,ebx
 add eax,00x26h
 xor eax,ecx
 add ecx,eax
 inc esi
 cmp byte ptr ds:[esi],00x0h
 jnz L002
 mov eax,00xC0DEFh
 sub eax,ecx
 imul eax,eax


好了,把我用vc写的源码贴上来,再分析一下:
void CKeyGenDlg::OnBnClickedButton1()
{
char name[]={0};
LPSTR user=new char[32];//我们输入的注册名
TCHAR cCode[100]={0};//注册码
int x1,x2;//其实代表存放正确部分注册码的eax和ecx的值
::GetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT1,user,32); 
    wsprintf(name, "%s", user);

__asm 
	{
lea esi,name
 xor ecx,ecx  
 L001:
 movsx eax,byte ptr ds:[esi]
 mov ebx,eax  
 //sub esi,edx  这句加了会导致esi的值错误,直接把他注释掉了
 shl eax,04h
 shr ebx,05h
 xor eax,ebx
 add eax,026h
 xor eax,ecx
 add ecx,eax
 inc esi
 cmp byte ptr ds:[esi],00h

 jnz L001
 mov eax,00C0DEFh
 sub eax,ecx
 imul eax,eax	
 mov x1,ecx
 mov x2,eax
	  
 }

wsprintf(cCode,TEXT("CM2-%.4X-%.4X"),x1,x2);
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT2,cCode);


}

传个测试图:


结束,附件里面有crackme,和keygen,有兴趣的同学可以看看,谢谢大家!
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (13)
雪    币: 13257
活跃值: (3652)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享   收藏学习
2012-2-23 07:12
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习一下,还不会这些呢
2012-2-23 08:46
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
VB、VC、C、Delphi等写一个也是非常容易的事。
2012-2-23 09:29
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享
2012-2-23 09:38
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢分享,呵呵!
2012-2-23 09:44
0
雪    币: 2329
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
长见识,学习了
2012-2-23 10:06
0
雪    币: 37
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢班主,以后可以方便的向大家学习和交流了!
2012-2-23 12:26
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,看一下
2012-2-23 13:18
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
囧 我也做好了准备发帖 结果楼主先发了 那我把我的C代码发出来好了
    
    char z[10];
    int a,b,c = 0;
    scanf("%s",z);
    for(int i = 0;z[i];i++){
        a = z[i];
        b = a;
        a <<= 4;
        b >>= 5;
        a ^= b;
        a += 0x26;
        a ^= c;
        c += a;
    }
    a = 0x0C0DEF;
    a -= c;
    a *= a;
    printf("CM2-%x-%x\n",c,a);


谢谢13L指出错误 因为是直接十六进制输出 所以请把小写转换成大写哦 亲=w= 我这人懒。。。懒得转换成ASCII码了。。
2012-2-23 13:27
0
雪    币: 37
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我想请教一下,我现在发现注册机有问题,就是有些注册名出的注册码就不对了,能帮我看看是啥问题么?
比方说用户名是 ilove就不行 iknow也不行,iwant就行,还有2位的貌似都不行,求解。。
2012-2-23 13:31
0
雪    币: 37
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=夏式;1047200]囧 我也做好了准备发帖 结果楼主先发了 那我把我的C代码发出来好了
   
    char z[10];
    int a,b,c = 0;
    scanf("%s",z);
    for(int i = 0;z[i];i++){
        a = z[i];
   ...[/QUOTE]

谢谢你了,贴出来大家一起分享吧。我想说你也抢先我一步写了纯c代码,我正准备一俩天之内把这个给大家补上呢。
2012-2-23 13:32
0
雪    币: 37
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
找到原因了原来是多了一个0,
iknow 对应 CM2-0819-8C320EE4;第二部分的0是多余的,正确的是CM2-819-8C320EE4
ilove  对应  CM2-0979-6B23E664;正确的是CM2-979-6B23E664
iwant 对应  CM2-3769-23484E24;没问题
刚才试了一下10楼的代码,用户名生成的注册码也有问题。字母应该是大写的而不是小写的。
2012-2-23 14:00
0
雪    币: 37
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
问题都解决了,现在再贴个源码,真正的无bug注册机:谢谢“  T二十天²º¹² ”大哥给我的提示
void CKeyGenDlg::OnBnClickedButton1()
{

               char name[]={0};//="ilovecwq"
	LPSTR user=new char[32];
	TCHAR cCode[100]={0};
                 int x1,x2;

	::GetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT1,user,32); 
     wsprintf(name, "%s", user);
__asm 
	{
 xor edx,edx //新加语句
 lea esi,name
  xor ecx,ecx  
  L001:
  movsx eax,byte ptr ds:[esi]
  mov ebx,eax
  sub esi,edx//新加语句
  shl eax,04h
  shr ebx,05h
  xor eax,ebx
  add eax,026h
  xor eax,ecx
  add ecx,eax
  inc esi
  cmp byte ptr ds:[esi],00h

  jnz L001
  mov eax,00C0DEFh
  sub eax,ecx
  imul eax,eax	
  mov x1,ecx
  mov x2,eax
	  
 }

wsprintf(cCode,TEXT("CM2-%X-%.4X"),x1,x2);  //把第一个%.4X改成%X
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT2,cCode);


}


一共修个了3处,谢谢所有帮助我的人,继续努力学汇编啦!
2012-2-23 23:41
0
游客
登录 | 注册 方可回帖
返回
//