标 题: 菜鸟用内联汇编写注册机(求邀请码) 作 者: 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作者讲授!
上传的附件: