- UID
- 65036
注册时间2010-1-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
标 题: 【转载】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 [ebp+8] ; |hWnd
004011CD |. E8 16020000 |call <jmp.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
004011D2 |. 64:8B15 18000>|mov edx, dword ptr fs:[18]
004011D9 |. 8B52 30 |mov edx, dword ptr [edx+30]
004011DC |. 0FB652 02 |movzx edx, byte ptr [edx+2]
004011E0 |. 83F8 00 |cmp eax, 0 ;取出用户名,比较用户名的位数是不否大于0,大于则跳
004011E3 |. 7F 11 |jg short 004011F6
004011FE /movsx eax, byte ptr [esi] ;取出用户名每位的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 [esi], 0 ;重复上面的操作
00401218 \jnz short 004011FE
CM2-2769-9F190E24
0040121A mov eax, 0C0DEF
0040121F sub eax, ecx ;用0C0DEF减上面求得的结果(ECX),然后平方送EAX
00401221 imul eax, eax
00401224 push eax ; /<%lX>
00401225 push ecx ; |<%lX>
00401226 push 004060E1 ; |cm2-%lx-%lx ;将EAX,与ECX的值按CM2-%lx-%lx的格式转换成注册码
0040122B push 004062B6 ; |s = crackme2.004062B6
00401230 call <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 [ebp+8] ; |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 [ebp+8] ; |hOwner
00401266 |. E8 89010000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
注册机代码:
#include "string.h"
#include "stdio.h"
int main()
{char szID[20];
int i;
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 |
评分
-
查看全部评分
|