【文章标题】: KeygenMe_1_by_boonz的破解
【文章作者】: jdxyw
【作者邮箱】: jdxyw2004@163.com
【软件名称】: KeygenMe_1_by_boonz
【软件大小】: 288KB
【下载地址】: http://www.crackmes.de/users/boonz/keygenme_1_by_boonz/
【编写语言】: MASM32
【使用工具】: Peid OD
【操作平台】: WinXP
【软件介绍】: 这个crack很简单。
【作者声明】: 我不知道这个以前有没有人破过,如有重复请原谅,也请大家多提宝贵意见
--------------------------------------------------------------------------------
【详细过程】
首先,用Peid查看,发现这是一个无壳的crack
接着,运行这个crack。输入用户和序列号,注册时,在原先的输入序列号的地方出现了“Hello, Mr. Badboy!”的字符串。
看来我们可以考虑从字符串下手。(我在破解中输入的用户名是 “yutou” 序列号是“123456”
运行OD,将其载入,先查看其字符串参考,接着往上看,发现以下代码
我在 004010E9设置断点 ,按F9 运行后输入用户名和序列号后来到这里
004010E9 |. 6A 28 PUSH 28 ; /Count = 28 (40.) 取用户名
004010EB |. 68 F8DC4000 PUSH keygenme.0040DCF8 ; |Buffer = keygenme.0040DCF8
004010F0 |. 68 EE030000 PUSH 3EE ; |ControlID = 3EE (1006.)
004010F5 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004010F8 |. E8 B3020000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
004010FD |. 6A 28 PUSH 28 ; /Count = 28 (40.) 取序列号
004010FF |. 68 F8DE4000 PUSH keygenme.0040DEF8 ; |Buffer = keygenme.0040DEF8
00401104 |. 68 EF030000 PUSH 3EF ; |ControlID = 3EF (1007.)
00401109 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040110C |. E8 9F020000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00401111 |. E8 F2000000 CALL keygenme.00401208 这是个关键,是序列号的生成代码,要跟进
以下是序列号的生成代码
00401208 /$ 68 F8DC4000 PUSH keygenme.0040DCF8 ; /String = "yutou"
0040120D |. E8 80010000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA
00401212 |. A3 86DC4000 MOV DWORD PTR DS:[40DC86],EAX 将用户名的长度送入DS:[40DC86]
00401217 |. 833D 86DC4000 >CMP DWORD PTR DS:[40DC86],4 比较,用户名的长度小于4则完蛋
0040121E |. 0F8C 29010000 JL keygenme.0040134D
00401224 |. 833D 86DC4000 >CMP DWORD PTR DS:[40DC86],32 比较,用户名的长度大于50则完蛋
0040122B |. 0F8F 1C010000 JG keygenme.0040134D
00401231 |. 33C0 XOR EAX,EAX
00401233 |. 33DB XOR EBX,EBX
00401235 |. 33C9 XOR ECX,ECX
00401237 |. BF F8DC4000 MOV EDI,keygenme.0040DCF8 ; ASCII "yutou"
0040123C |. 8B15 86DC4000 MOV EDX,DWORD PTR DS:[40DC86] 将用户名的长度送入EDX
00401242 |> 0FB60439 /MOVZX EAX,BYTE PTR DS:[ECX+EDI] 取用户名的第一个字符送入EAX
00401246 |. 83E8 19 |SUB EAX,19 将第一个字符减去19
00401249 |. 2BD8 |SUB EBX,EAX EBX-EAX
0040124B |. 41 |INC ECX ECX自增,做为循环计数
0040124C |. 3BCA |CMP ECX,EDX 看循环是否结束了
0040124E |.^75 F2 \JNZ SHORT keygenme.00401242
00401250 |. 53 PUSH EBX ; /<%lX> 这个函数是用作字符串格式化,
是将EBX中的内容格式化存入keygenme.0040E0F8,下面有用
00401251 |. 68 F8DB4000 PUSH keygenme.0040DBF8 ; |Format = "%lX"
00401256 |. 68 F8E04000 PUSH keygenme.0040E0F8 ; |s = keygenme.0040E0F8
0040125B |. E8 38010000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
00401260 |. 83C4 0C ADD ESP,0C
00401263 |. 33C0 XOR EAX,EAX
00401265 |. 33D2 XOR EDX,EDX
00401267 |. 33C9 XOR ECX,ECX
00401269 |. 03C3 ADD EAX,EBX
0040126B |. 0FAFC3 IMUL EAX,EBX
0040126E |. 03C8 ADD ECX,EAX
00401270 |. 2BD3 SUB EDX,EBX
00401272 |. 33D0 XOR EDX,EAX
00401274 |. 0FAFD8 IMUL EBX,EAX 以上几步同样是对原先几个寄存起中的数据进行计算,将计算的结果
存入EBX,并用格式化函数格式化存入keygenme.0040E1F8,下面
也将会用到
00401277 |. 53 PUSH EBX ; /<%lX>
00401278 |. 68 F8DB4000 PUSH keygenme.0040DBF8 ; |Format = "%lX"
0040127D |. 68 F8E14000 PUSH keygenme.0040E1F8 ; |s = keygenme.0040E1F8
00401282 |. E8 11010000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
00401287 |. 83C4 0C ADD ESP,0C
0040128A |. 33C0 XOR EAX,EAX
0040128C |. 33DB XOR EBX,EBX
0040128E |. 33D2 XOR EDX,EDX
00401290 |. 33C9 XOR ECX,ECX 此处的ASCII "FFFFFE37",就是第一个格式化函数保存的数据
00401292 |. B8 F8E04000 MOV EAX,keygenme.0040E0F8 ; ASCII "FFFFFE37"
00401297 |. 03D8 ADD EBX,EAX EBX+EAX
00401299 |. 33CB XOR ECX,EBX ECX与EBX异或
0040129B |. 0FAFCB IMUL ECX,EBX ECX=ECX *EAX
0040129E |. 2BC8 SUB ECX,EAX ECX=ECX-EAX
004012A0 |. 51 PUSH ECX ; /<%lX>同样将生成的数据格式化保存到keygenme.0040E2F8
004012A1 |. 68 F8DB4000 PUSH keygenme.0040DBF8 ; |Format = "%lX"
004012A6 |. 68 F8E24000 PUSH keygenme.0040E2F8 ; |s = keygenme.0040E2F8
004012AB |. E8 E8000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
004012B0 |. 83C4 0C ADD ESP,0C
004012B3 |. 68 FCDB4000 PUSH keygenme.0040DBFC ; /Format = "Bon-"格式化一个字符串"Bon-"保存到keygenme.0040DDF8
004012B8 |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |s = keygenme.0040DDF8
004012BD |. E8 D6000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
004012C2 |. 83C4 08 ADD ESP,8 字符串连接,将"FFFFFE37"连接到"Bon-"后面
004012C5 |. 68 F8E04000 PUSH keygenme.0040E0F8 ; /StringToAdd = "FFFFFE37"
004012CA |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |ConcatString = "Bon-
004012CF |. E8 B2000000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
004012D4 |. 68 01DC4000 PUSH keygenme.0040DC01 ; /StringToAdd = "-" 将"-"连接到"Bon-FFFFFE37"后面
004012D9 |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |ConcatString = "Bon-FFFFFE37"
004012DE |. E8 A3000000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
004012E3 |. 68 F8E14000 PUSH keygenme.0040E1F8 ; /StringToAdd = "FA4FA3E7" 将"FA4FA3E7"连接到"Bon-FFFFFE37-"后面
004012E8 |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |ConcatString = "Bon-FFFFFE37-"
004012ED |. E8 94000000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
004012F2 |. 68 01DC4000 PUSH keygenme.0040DC01 ; /StringToAdd = "-" 将"-"连接到"Bon-FFFFFE37-FA4FA3E"后面
004012F7 |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |ConcatString = "Bon-FFFFFE37-FA4FA3E7"
004012FC |. E8 85000000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
00401301 |. 68 F8E24000 PUSH keygenme.0040E2F8 ; /StringToAdd = "41720F48" 将"41720F48"连接到"Bon-FFFFFE37-FA4FA3E7-"后面
00401306 |. 68 F8DD4000 PUSH keygenme.0040DDF8 ; |ConcatString = "Bon-FFFFFE37-FA4FA3E7-"
0040130B |. E8 76000000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
00401310 |. B8 F8DD4000 MOV EAX,keygenme.0040DDF8 ; ASCII "Bon-FFFFFE37-FA4FA3E7-41720F48"
00401315 |. BB F8DE4000 MOV EBX,keygenme.0040DEF8 ; ASCII "123456"
0040131A |. 53 PUSH EBX ; /String2 => "123456" 假序列号
0040131B |. 50 PUSH EAX ; |String1 => "Bon-FFFFFE37-FA4FA3E7-41720F48" 真序列号
0040131C |. E8 6B000000 CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA
00401321 |. 74 15 JE SHORT keygenme.00401338
00401323 |. 68 17DC4000 PUSH keygenme.0040DC17 ; /Format = "Hello, Mr. Badboy!"
00401328 |. 68 F8DF4000 PUSH keygenme.0040DFF8 ; |s = keygenme.0040DFF8
0040132D |. E8 66000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
00401332 |. 83C4 08 ADD ESP,8
00401335 |. 33C0 XOR EAX,EAX
00401337 |. C3 RETN
00401338 |> 68 03DC4000 PUSH keygenme.0040DC03 ; /Format = "Hello, Mr. Goodboy!"
0040133D |. 68 F8DF4000 PUSH keygenme.0040DFF8 ; |s = keygenme.0040DFF8
00401342 |. E8 51000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月04日 19:53:52
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!