其实我一直在学的是Windows编程
,学着学着困惑越来越多了,经高人指点,就开始学习加密与解密了,刚学完解密篇就学着写了篇破文,虽然不怎么样
但也花了俺一个下午的睡觉时间的,
只求能让我转正啊,话说kx真难挣,整天等看雪,就不见往上涨...没办法,经济危机
,只好写点充数,好歹也弄个正式会员啊
...
一:爆破
由于这是个比较简单的CM,所以可以利用ASCII码直接找到关键代码,下面就直接分析了…
如过你连这都不会找,可以去看看Ollydbg的入门教程,好的,下面上代码了….
0040155F /74 08 JE SHORT CRECKME_.00401569 ;如果zf=1,则跳转,此句如果不跳,则程序执行到错误代码处,所以爆破时此处必须跳转,故应该为jmp
00401561 . |57 PUSH EDI
00401562 > |68 60264000 PUSH CRECKME_.00402660 ; name or serial is wrong,try again ! 通过ASCII码查找,可锁定此代码,明显是提示错误的地方
00401567 . |EB 21 JMP SHORT CRECKME_.0040158A
00401569 > \68 58264000 PUSH CRECKME_.00402658 ; zeng
0040156E . 8BCD MOV ECX,EBP
00401570 . FF15 B4214000 CALL DWORD PTR DS:[<&MFC71.#2272>] ; MFC71.7C188D0D
00401576 . 85C0 TEST EAX,EAX
00401578 . 57 PUSH EDI
00401579 . 57 PUSH EDI
0040157A ^ 7E E6 JLE SHORT CRECKME_.00401562 ;小于或等于则会跳转到错误提示的地方 因此爆破时须将此处nop掉
0040157C . 68 10264000 PUSH CRECKME_.00402610 ; congratulation ! correct serial number,good job,do next one? :)
00401581 . EB 07 JMP SHORT CRECKME_.0040158A
00401583 > 57 PUSH EDI
00401584 . 57 PUSH EDI
00401585 . 68 F4254000 PUSH CRECKME_.004025F4 ; name or serial is too short
0040158A > E8 07030000 CALL <JMP.&MFC71.#1123>
到此程序已爆破成功,复制修改到可执行文件,保存就好了...其实还可以通过爆破把注册码的长度限制去掉,在此限于贴码不易,大家可以自行用OD实验(找到00401583的跳转处就好了)...
爆破程序请见附件...
二:注册算法的分析
由上面的爆破分析,我们可发现程序进行注册码校验时,是通过调用一连串的程序进行比较,如果发现注册码不对,则跳转到,错误提示窗口...想进行注册算法分析,光了解程序的大概执行方向是远远不够的,我们必须进行调试分析,那么第一步就是要找到合适的断点...
通过查找本模块内的名称,发现全是调用的MFC类里面的函数,没有sdk程序那么简明,所以想通过系统函数GetDlgItemText下断的想法就不成了...
我这里想到的下断方法比较笨,就是查看指向错误提示模块的跳转一步一步的上述下断...下面贴出我通过上述方法分析过的代码...
00401417 . FF15 C0214000 CALL DWORD PTR DS:[<&MFC71.#2902_?GetLength@?$CSimpleStringT@D$0>; MFC71.7C146AB0
0040141D . 83F8 06 CMP EAX,6
00401420 . 0F8C 5D010000 JL CRECKME_.00401583 ;通过上述法,可找到此处为比较注册码长度的地方,并可在此下断
00401426 . 53 PUSH EBX
00401427 . 8BCE MOV ECX,ESI
00401429 . 897C24 14 MOV DWORD PTR SS:[ESP+14],EDI
0040142D . FF15 C0214000 CALL DWORD PTR DS:[<&MFC71.#2902_?GetLength@?$CSimpleStringT@D$0>; MFC71.7C146AB0
00401433 . 85C0 TEST EAX,EAX
00401435 . 7E 4E JLE SHORT CRECKME_.00401485
;下面是一个for循环,用来计算你输入的注册码的...
00401437 > 6A 01 PUSH 1
00401439 . 8D043F LEA EAX,DWORD PTR DS:[EDI+EDI]
0040143C . 50 PUSH EAX
0040143D . 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
00401441 . 51 PUSH ECX
00401442 . 8BCE MOV ECX,ESI
00401444 . FF15 BC214000 CALL DWORD PTR DS:[<&MFC71.#4109_?Mid@?$CStringT@DV?$StrTraitMFC>; MFC71.7C188D88 ;此处跟入可知Mid是用来找字符的
0040144A . 8BC8 MOV ECX,EAX
0040144C . FF15 B8214000 CALL DWORD PTR DS:[<&MFC71.#876_??B?$CSimpleStringT@D$00@ATL@@QB>; MFC71.7C158BCD
00401452 . 50 PUSH EAX ; /s
00401453 . FF15 B0224000 CALL DWORD PTR DS:[<&MSVCR71.atoi>] ; \atoi 这个函数用来把字符串转换成整型数
00401459 . 83C4 04 ADD ESP,4
0040145C . 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
00401460 . 8BE8 MOV EBP,EAX
00401462 . FF15 68204000 CALL DWORD PTR DS:[<&MFC71.#578_??1?$CStringT@DV?$StrTraitMFC_DL>; MFC71.7C1771B1
00401468 . 8B5C24 14 MOV EBX,DWORD PTR SS:[ESP+14]
0040146C . 03DD ADD EBX,EBP
0040146E . 8BCE MOV ECX,ESI
00401470 . 895C24 14 MOV DWORD PTR SS:[ESP+14],EBX
00401474 . 47 INC EDI
00401475 . FF15 C0214000 CALL DWORD PTR DS:[<&MFC71.#2902_?GetLength@?$CSimpleStringT@D$0>; MFC71.7C146AB0
0040147B . 3BF8 CMP EDI,EAX
0040147D .^ 7C B8 JL SHORT CRECKME_.00401437 ;如果edi<(输入注册码的长度)则继续循环
额….好吧…仔细跟了一段发现这个CM根本没什么算法,而是直接判断用户名是否合法,和注册码是否合法,如果两个都满足的话,就注册成功,我还想着分析出来算法,写注册机的,看来可以省了…
下面提供一组注册码:UserName:zzZENG Serial:570531
再说说规则,用户名必须包含ZENG 而且不能放在字符串的开头…
注册码第0位必须是5 第4 ,5两位 必须是3 和1,第二位=偶数位之和 第三位可以为任意数字….
至于具体的代码,大家可以根据我说的进行跟踪认证...
CM.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!