大家好~~~
记得几年前到书店买书,突然发现一本《加密与解密》,拿来一看,嗯,对内容挺感兴趣的,貌似看完后能做游戏的免CD补丁了!!
!。毫不犹豫,买了。拿回家仔细看了看,发现不大妙...好难啊...
还是学业要紧,学业第一~~~把书扔到箱子里...
好在现在轻松点了,前几天昨天翻出一看,嗯,还很新的...于是决心看一看,都是汇编啊~~~上网查查资料~~~不料来到了看雪论坛
,发现这本《加密与解密》与这个论坛有些关系!!!
段钢就是ID:kanxue吗?
然后看了看,看到了CrackMe,决定试一下,找了半天发现CrackMe斑竹的几个CrackMe,呵呵,找了找,选了第4个,为什么?因为我
看到Delphi了~~~
当时觉得很难,现在觉得简单~~~
就当时记录以下破解的第一次吧~~~
各位前辈见笑了~~~
下面开始:
打开KeyGenMe_04.exe,呃...Name~~~Serial~~~
用OllyDbg加载
先找找ASCII串吧。发现了~~~"Congratulations" "Good job,man!"
呵呵,我猜第一个肯定是标题,第二个是内容~
于是向上看一看,发现了RETN
00450046 59 POP ECX
00450047 5D POP EBP
00450048 C3 RETN ; 有个RETN
00450049 8D40 00 LEA EAX, DWORD PTR DS:[EAX]
0045004C 55 PUSH EBP ; [Check]后断的位置
0045004D 8BEC MOV EBP, ESP
0045004F 83C4 DC ADD ESP, -24
00450052 33C9 XOR ECX, ECX
00450054 894D F8 MOV DWORD PTR SS:[EBP-8], ECX
00450057 894D F4 MOV DWORD PTR SS:[EBP-C], ECX
0045005A 8955 E0 MOV DWORD PTR SS:[EBP-20], EDX
0045005D 8945 FC MOV DWORD PTR SS:[EBP-4], EAX
00450060 33C0 XOR EAX, EAX
00450062 55 PUSH EBP
00450063 68 8D014500 PUSH KeyGenMe.0045018D
00450068 64:FF30 PUSH DWORD PTR FS:[EAX]
0045006B 64:8920 MOV DWORD PTR FS:[EAX], ESP
0045006E 8D55 F8 LEA EDX, DWORD PTR SS:[EBP-8]
00450071 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
00450074 8B80 00030000 MOV EAX, DWORD PTR DS:[EAX+300]
0045007A E8 D9F2FDFF CALL KeyGenMe.0042F358 ; !!!取Name
0045007F 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-8] ; 将Name存入EAX
00450082 E8 4940FBFF CALL KeyGenMe.004040D0 ; 判断输入是否为空
00450087 8945 F0 MOV DWORD PTR SS:[EBP-10], EAX ; 将Name存入堆栈段
0045008A 837D F0 02 CMP DWORD PTR SS:[EBP-10], 2 ; 判断Name是否小于2
0045008E 0F8C DE000000 JL KeyGenMe.00450172
00450094 8D55 F4 LEA EDX, DWORD PTR SS:[EBP-C]
00450097 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
0045009A 8B80 08030000 MOV EAX, DWORD PTR DS:[EAX+308] ; "dlB"送EAX
004500A0 E8 B3F2FDFF CALL KeyGenMe.0042F358 ; !!!取Serial
004500A5 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; Serial存入EAX
004500A8 E8 2340FBFF CALL KeyGenMe.004040D0 ; 判断输入是否为空
004500AD 8945 EC MOV DWORD PTR SS:[EBP-14], EAX ; Serial的位数送堆栈
004500B0 837D EC 0A CMP DWORD PTR SS:[EBP-14], 0A ; 判断Serial是否为10位
004500B4 0F85 B8000000 JNZ KeyGenMe.00450172
004500BA 8B45 EC MOV EAX, DWORD PTR SS:[EBP-14]
004500BD 85C0 TEST EAX, EAX
004500BF 7E 34 JLE SHORT KeyGenMe.004500F5
004500C1 8945 E4 MOV DWORD PTR SS:[EBP-1C], EAX ; Serial的位数送堆栈
004500C4 C745 E8 0100000>MOV DWORD PTR SS:[EBP-18], 1
004500CB 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; Serial送EAX--判断每一位是否为数字
004500CE 8B55 E8 MOV EDX, DWORD PTR SS:[EBP-18] ; EDX=1,2,3,4,5,6,7,8,9,10
004500D1 807C10 FF 30 CMP BYTE PTR DS:[EAX+EDX-1], 30 ; 取1位,并判断是否小于0
004500D6 0F82 96000000 JB KeyGenMe.00450172
004500DC 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
004500DF 8B55 E8 MOV EDX, DWORD PTR SS:[EBP-18]
004500E2 807C10 FF 39 CMP BYTE PTR DS:[EAX+EDX-1], 39 ; 判断是否大于9
004500E7 0F87 85000000 JA KeyGenMe.00450172 ; 注册码只能是数字!!!
004500ED FF45 E8 INC DWORD PTR SS:[EBP-18]
004500F0 FF4D E4 DEC DWORD PTR SS:[EBP-1C]
004500F3 ^ 75 D6 JNZ SHORT KeyGenMe.004500CB ; 检测下一位
004500F5 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C] ; Serial送EAX
004500F8 0FB600 MOVZX EAX, BYTE PTR DS:[EAX]
004500FB 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C] ; Serial送EDX
004500FE 0FB652 05 MOVZX EDX, BYTE PTR DS:[EDX+5]
00450102 03C2 ADD EAX, EDX
00450104 83F8 6D CMP EAX, 6D ; 第1位和第6位的ASCII码相加为6DH
00450107 75 69 JNZ SHORT KeyGenMe.00450172
00450109 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
0045010C 0FB640 01 MOVZX EAX, BYTE PTR DS:[EAX+1]
00450110 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
00450113 0FB652 06 MOVZX EDX, BYTE PTR DS:[EDX+6]
00450117 03C2 ADD EAX, EDX
00450119 83F8 67 CMP EAX, 67 ; 第2位和第7位的ASCII码相加为67H
0045011C 75 54 JNZ SHORT KeyGenMe.00450172
0045011E 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
00450121 0FB640 02 MOVZX EAX, BYTE PTR DS:[EAX+2]
00450125 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
00450128 0FB652 07 MOVZX EDX, BYTE PTR DS:[EDX+7]
0045012C 03C2 ADD EAX, EDX
0045012E 83F8 69 CMP EAX, 69 ; 第3位和第8位的ASCII码相加为69H
00450131 75 3F JNZ SHORT KeyGenMe.00450172
00450133 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
00450136 0FB640 03 MOVZX EAX, BYTE PTR DS:[EAX+3]
0045013A 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
0045013D 0FB652 08 MOVZX EDX, BYTE PTR DS:[EDX+8]
00450141 03C2 ADD EAX, EDX
00450143 83F8 70 CMP EAX, 70 ; 第4位和第9位的ASCII码相加为70H
00450146 75 2A JNZ SHORT KeyGenMe.00450172
00450148 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-C]
0045014B 0FB640 04 MOVZX EAX, BYTE PTR DS:[EAX+4]
0045014F 8B55 F4 MOV EDX, DWORD PTR SS:[EBP-C]
00450152 0FB652 09 MOVZX EDX, BYTE PTR DS:[EDX+9]
00450156 F7EA IMUL EDX
00450158 3D 8C0A0000 CMP EAX, 0A8C ; 第5位和第10位的ASCII码相乘为0A8H
0045015D 75 13 JNZ SHORT KeyGenMe.00450172
0045015F 6A 40 PUSH 40
00450161 68 98014500 PUSH KeyGenMe.00450198 ; ASCII "Congratulations"
00450166 68 A8014500 PUSH KeyGenMe.004501A8 ; ASCII "Good job,man!"
0045016B 6A 00 PUSH 0
0045016D E8 2E63FBFF CALL <JMP.&user32.MessageBoxA>
在00450049处断点,可是在运行输入Name=yangyang和Serial=12345后按下[Check]无反应~~~
怎么办?把下面0045004C 0045004D都设断点!!!
再运行,输入Name和Serial后按下[Check],终于断下来了,在0045004C这个位置。
一直往下走,慢慢看,在0045007F处发现EAX为yangyang,看来是这里了...
指令的注释我依次写下了。
大致是这样:
Name不能小于2。Serial的位数必须为10,且都要是数字。
Name无所谓,Serial要满足以下条件:
1) 第1位和第6位的ASCII码相加为6DH
2) 第2位和第7位的ASCII码相加为67H
3) 第3位和第8位的ASCII码相加为69H
4) 第4位和第9位的ASCII码相加为70H
5) 第5位和第10位的ASCII码相乘为0A8H
就可以了。比如Serial=6667671392
最后感谢happytown ~~~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课