mucki's crackme#2分析
标 题: 【转载】mucki's crackme#2分析作 者: llydd
时 间: 2006-10-06,00:01:44
链 接: http://bbs.pediy.com/showthread.php?t=32914
【文章标题】: mucki's crackme#2分析
【文章作者】: llydd
【作者邮箱】: [email protected]
【编写语言】: MASM32 / TASM32
【使用工具】: OD+PEID
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
用PEID查壳发现好像加了壳,本人壳盲一个,直接用PEID找到程序入口,得用OD字符插件找到关键点如下
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 32 ; /Count = 32 (50.)
004011C3|.68 84624000 |push 00406284 ; |Buffer = crackme2.00406284
004011C8|.6A 01 |push 1 ; |ControlID = 1
004011CA|.FF75 08 |push dword ptr ; |hWnd
004011CD|.E8 16020000 |call <jmp.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
004011D2|.64:8B15 18000>|mov edx, dword ptr fs:
004011D9|.8B52 30 |mov edx, dword ptr
004011DC|.0FB652 02 |movzx edx, byte ptr
004011E0|.83F8 00 |cmp eax, 0 ;取出用户名,比较用户名的位数是不否大于0,大于则跳
004011E3|.7F 11 |jg short 004011F6
004011FE/movsx eax, byte ptr ;取出用户名每位的ASCII码移至EAX
00401201|mov ebx, eax ;ASCII码也移至EBX
00401203|sub esi, edx
00401205|shl eax, 4 ;然后将存于EAX中的ASCII码左移四位,
00401208|shr ebx, 5 ;将存于EBX中的ASCII码右移五位
0040120B|xor eax, ebx ;将上面两步的结果相加送EAX
0040120D|add eax, 26 ;将EAX+26H
00401210|xor eax, ecx ;(注:ECX存放操作的结果)将上面操作的结果(EAX)与以前所得结果(ECX)异或送至EAX
00401212|add ecx, eax ;将以前操作的结果(ECX)与该结果(EAX)相加保存至ECX
00401214|inc esi
00401215|cmp byte ptr , 0;重复上面的操作
00401218\jnz short 004011FE
CM2-2769-9F190E24
0040121Amov eax, 0C0DEF
0040121Fsub eax, ecx ;用0C0DEF减上面求得的结果(ECX),然后平方送EAX
00401221imul eax, eax
00401224push eax ; /<%lX>
00401225push ecx ; |<%lX>
00401226push 004060E1 ; |cm2-%lx-%lx ;将EAX,与ECX的值按CM2-%lx-%lx的格式转换成注册码
0040122Bpush 004062B6 ; |s = crackme2.004062B6
00401230call <jmp.&user32.wsprintfA> ; \wsprintfA
00401235|.6A 4B push 4B ; /Count = 4B (75.)
00401237|.68 B1604000 push 004060B1 ; | nameless
0040123C|.6A 02 push 2 ; |ControlID = 2
0040123E|.FF75 08 push dword ptr ; |hWnd
00401241|.E8 A2010000 call <jmp.&user32.GetDlgItemTextA> ; \GetDlgItemTextA ;取假注册码^_^
00401246|.68 B1604000 push 004060B1 ; / nameless
0040124B|.68 B6624000 push 004062B6 ; |String1 = ""
00401250|.E8 DB010000 call <jmp.&kernel32.lstrcmpA> ; \lstrcmpA ;比较注册码与假码是否相同,相同则注册成功,
00401255|.75 16 jnz short 0040126D
00401257|.6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401259|.68 00604000 push 00406000 ; |crackme2
0040125E|.68 3D604000 push 0040603D ; |valid serial - now write a keygen!
00401263|.FF75 08 push dword ptr ; |hOwner
00401266|.E8 89010000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
注册机代码:
#include "string.h"
#include "stdio.h"
int main()
{char szID;
inti;
long nSum=0,nconst=0x0c0def;
printf("ID=");
gets(szID);
while(strlen(szID)<=0)
{
printf("ID=");
gets(szID);
}
for(i=0;i<strlen(szID);i++)
nSum+=(long)(szID*16+szID/32+0x26)^nSum;
nconst-=nSum;
nconst*=nconst;
printf("serial=CM2-%lX-%lX\n",nSum,nconst);
system("pause");
return 0;
}
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年10月06日 0:00:44 学习下 呵呵 还可以 指令能看懂 来看看 学习一下~~
页:
[1]