首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
0
0
[原创][原创]一个小CrackMe的分析~~~~
发表于: 2012-7-3 23:56
2874
[原创][原创]一个小CrackMe的分析~~~~
xixifusi
2012-7-3 23:56
2874
004011B3 . 66:3D 0200 CMP AX,2 ; WM_DESTROY
004011B7 . 75 04 JNZ SHORT 004011BD
004011B9 . EB 27 JMP SHORT 004011E2
004011BB . EB 1F JMP SHORT 004011DC
004011BD > 66:3D 1000 CMP AX,10 ; WM_CLOSE
004011C1 . 75 04 JNZ SHORT 004011C7
004011C3 . EB 1D JMP SHORT 004011E2
004011C5 . EB 15 JMP SHORT 004011DC
004011C7 > 66:3D 1101 CMP AX,111 ; 找到了 WM_COMMAND 消息处理的分支,接下来跳到该分支的处理过程去分析
004011CB . 75 04 JNZ SHORT 004011D1
004011CD . EB 35 JMP SHORT 00401204
004011CF . EB 0B JMP SHORT 004011DC
004011D1 > 66:3D 1001 CMP AX,110 ; WM_INITDIALOG
004011D5 . 75 05 JNZ SHORT 004011DC
004011D7 . E9 B8010000 JMP 00401394
004011DC > 33C0 XOR EAX,EAX
004011DE . C9 LEAVE
004011DF . C2 1000 RETN 10
004011E2 > FF05 1C234000 INC DWORD PTR DS:[40231C]
004011E8 . 833D 1C234000>CMP DWORD PTR DS:[40231C],1
004011EF . 75 05 JNZ SHORT 004011F6
004011F1 . E8 29020000 CALL 0040141F
004011F6 > 6A 00 PUSH 0 ; /Result = 0
004011F8 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011FB . E8 5E020000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
00401200 . C9 LEAVE
00401201 . C2 1000 RETN 10
00401204 > 817D 10 EB030>CMP DWORD PTR SS:[EBP+10],3EB
0040120B . 0F85 3E010000 JNZ 0040134F
00401211 . C16D 10 10 SHR DWORD PTR SS:[EBP+10],10
00401215 . 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
00401219 . 0F85 2E010000 JNZ 0040134D
0040121F . 60 PUSHAD
00401220 . BF 47124000 MOV EDI,00401247
00401225 . 803F 84 CMP BYTE PTR DS:[EDI],84
00401228 . 0F85 DF000000 JNZ 0040130D
0040122E . 68 57214000 PUSH 00402157 ; /pModule = "User32"
00401233 . E8 5C020000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401238 . 68 5F214000 PUSH 0040215F ; /ProcNameOrOrdinal = "GetDlgItemTextA"
0040123D . 50 PUSH EAX ; |hModule
0040123E . E8 4B020000 CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress
00401243 . 8038 CC CMP BYTE PTR DS:[EAX],0CC
00401246 . 0F84 AB000000 JE 004012F7
0040124C . 6A 28 PUSH 28 ; /Count = 28 (40.)
0040124E . 68 06214000 PUSH 00402106 ; |Buffer = crcme1.00402106
00401253 . 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)
00401258 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040125B . E8 10020000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401260 . 83F8 05 CMP EAX,5 ; 用户名要大于等于5个字符
00401263 . 0F82 BD000000 JB 00401326
00401269 . 6A 28 PUSH 28 ; /Count = 28 (40.)
0040126B . 68 2E214000 PUSH 0040212E ; |Buffer = crcme1.0040212E
00401270 . 68 EA030000 PUSH 3EA ; |ControlID = 3EA (1002.)
00401275 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401278 . E8 F3010000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040127D . BF 06214000 MOV EDI,00402106 ; ASCII "12345"
00401282 . 33DB XOR EBX,EBX
00401284 . 33C0 XOR EAX,EAX
00401286 > 8A1F MOV BL,BYTE PTR DS:[EDI] ; 取用户名字符
00401288 . 80FB 20 CMP BL,20 ; 字符ASCII值不小于0x20
0040128B . 0F82 95000000 JB 00401326
00401291 . 03C3 ADD EAX,EBX ; 累加字符的ASCII值,结果放到eax中
00401293 . 47 INC EDI
00401294 . 803F 00 CMP BYTE PTR DS:[EDI],0
00401297 .^ 75 ED JNZ SHORT 00401286
00401299 . C1C0 03 ROL EAX,3 ; 将eax的值左移三位,相当于乘以8
0040129C . 35 A5150500 XOR EAX,515A5 ; 和 515AD异或
004012A1 . 50 PUSH EAX
004012A2 . 33C0 XOR EAX,EAX
004012A4 . 33DB XOR EBX,EBX
004012A6 . 33FF XOR EDI,EDI ; 开始假码的处理
004012A8 . BE 2E214000 MOV ESI,0040212E ; ASCII "67890"
004012AD > B8 0A000000 MOV EAX,0A
004012B2 . 8A1E MOV BL,BYTE PTR DS:[ESI] ; 取假码的一个字符
004012B4 . 85DB TEST EBX,EBX ; 如果为 \0 则跳出循环
004012B6 . 74 15 JE SHORT 004012CD
004012B8 . 80FB 30 CMP BL,30 ; 判断字符是否是 '1' ~ '9',不是则跳出
004012BB . 72 69 JB SHORT 00401326
004012BD . 80FB 39 CMP BL,39
004012C0 . 7F 64 JG SHORT 00401326
004012C2 . 83EB 30 SUB EBX,30 ; 将字符转换为数字
004012C5 . 0FAFF8 IMUL EDI,EAX
004012C8 . 03FB ADD EDI,EBX
004012CA . 46 INC ESI
004012CB .^ EB E0 JMP SHORT 004012AD
004012CD > 81F7 CA870000 XOR EDI,87CA ; 与 87CA 异或
004012D3 . 8BDF MOV EBX,EDI ; 假码计算的值存入 ebx
004012D5 . 58 POP EAX ; 取之前用户名计算得到的值
004012D6 . 03C3 ADD EAX,EBX ; eax +=ebx
004012D8 . 35 E7970700 XOR EAX,797E7 ; eax 与 797E7异或
004012DD . 85C0 TEST EAX,EAX ; 测试 eax == 0 是否成立
004012DF . 75 45 JNZ SHORT 00401326 ; 如果 eax == 0 则成功 否则跳转
004012E1 . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004012E3 . 68 1B204000 PUSH 0040201B ; |Title = "-=ACG=- T h e B e s t -=ACG=-"
004012E8 . 68 77204000 PUSH 00402077 ; |Text = "Yeah You Did It!!!",LF,CR,"Czyli nareszczie ci si?uda硂",LF,CR,"Teraz mo縠sz przy彻
czy?si?do ACG"
004012ED . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004012F0 . E8 5D010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
004012F5 . EB 55 JMP SHORT 0040134C
004012F7 > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004012F9 . 68 1B204000 PUSH 0040201B ; |Title = "-=ACG=- T h e B e s t -=ACG=-"
004012FE . 68 7F214000 PUSH 0040217F ; |Text = "No BPX Allowed!!!",LF,CR,"I oczywi渟ie standard:",LF,CR,"nie mo縩a zak砤da?pu砤pek!"
00401303 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401306 . E8 47010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040130B . EB 19 JMP SHORT 00401326
0040130D > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040130F . 68 1B204000 PUSH 0040201B ; |Title = "-=ACG=- T h e B e s t -=ACG=-"
00401314 . 68 21234000 PUSH 00402321 ; |Text = "Gdzie mi grzebiesz w exe'cu??",LF,CR,"Jak cie trzepne to se w muzgu pogrzebiesz"
00401319 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040131C . E8 31010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401321 .^ E9 BCFEFFFF JMP 004011E2
00401326 > 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00401328 . 68 1B204000 PUSH 0040201B ; |Title = "-=ACG=- T h e B e s t -=ACG=-"
0040132D . 68 CE204000 PUSH 004020CE ; |Text = "Nic z tego!!!"
00401332 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401335 . E8 18010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040133A . 68 DD204000 PUSH 004020DD ; /Text = ""
0040133F . 68 EA030000 PUSH 3EA ; |ControlID = 3EA (1002.)
00401344 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401347 . E8 F4000000 CALL <JMP.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
分析过程都在上面
大概的算法流程就是 取用户名的每个字符,然后累加期ascii值,放到eax中,然后值乘以8,接着再与 515AD异或,结果入栈,
接下来取 假码的值,看代码的步骤大概就是将输入的字符串转换为数字的形式 然后与87CA 异或 ,结果存放到ebx中
然后 eax+=ebx ,eax 与 797E7比较,如果相等 就成功,不相等就失败
写个注册函数,参数为指向用户名和注册码的指针,返回指向真实注册码的字符串:
TCHAR * RegFunc(TCHAR* szName,TCHAR* szCode){
DWORD dwName=0;
while(*szName!=0)dwName+=*szName++;
dwName<<=3;
dwName^=0x515AD;
dwName =0x797E7 - dwName;
dwName^=0x87CA;
memset(szCode,0,16);
wsprintf(szCode,"%ld",dwName);
return szCode;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
收藏
・
0
免费
・
0
支持
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
loongzyd
雪 币:
1015
活跃值:
(235)
能力值:
( LV12,RANK:440 )
在线值:
发帖
191
回帖
1111
粉丝
4
关注
私信
loongzyd
10
2
楼
感谢楼主的分享啊,何不把附件一起发上来啦?
2012-7-4 07:00
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
xixifusi
10
发帖
31
回帖
10
RANK
关注
私信
他的文章
CreateProcess 中 CREATE_SEPARATE_WOW_VDM 标志的使用
3810
[求助]在Win7 64位系统上 普通32应用程序都是运行在一个Job中么
1133
[原创][原创]一个小CrackMe的分析~~~~
2875
[下载]分享个工具 ----------------windows消息和消息ID值互查的工具
1684
原创]VC动态获取API
1057
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部