ClipNow v4.7 算法注册机
【破文标题】【第十二轮】【初级班第2课作业】ClipNow v4.7 算法注册机【破文作者】千千万是福朋友
【破解工具】OD
【破解平台】XP
【软件名称】ClipNow v4.7
【破解声明】仅限于技术交流,请勿用于商业用途【破解过程】
首先PEID查壳为UPX,不影响直接拖入OD分析
软件启动弹出注册对话框
输入任意用户名注册码点击Register,弹出"Invalid Reg Key"提示
首先还是使用最简单的方法,查找字符串
找了一圈发现没有什么特别敏感的字符串出现
那就换一种方法,按下F12暂停程序,点击ALT+K显示调用堆栈
调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0012CD88 77D19418 包含ntdll.KiFastSystemCallRet user32.77D19416 0012CDBC
0012CD8C 77D2770A user32.WaitMessage user32.77D27705 0012CDBC
0012CDC0 77D249C4 user32.77D2757B user32.77D249BF 0012CDBC
0012CDE8 77D3A956 user32.77D2490E user32.77D3A951 0012CDE4
0012D0A8 77D3A2BC user32.SoftModalMessageBox user32.77D3A2B7 0012D0A4
0012D1F8 77D663FD user32.77D3A147 user32.77D663F8 0012D1F4
0012D250 77D664A2 user32.MessageBoxTimeoutW user32.77D6649D 0012D24C
0012D284 77D50877 ? user32.MessageBoxTimeoutA user32.77D50872 0012D280
0012D2A4 77D5082F ? user32.MessageBoxExA user32.77D5082A 0012D2A0
0012D2A8 003A0126 hOwner = 003A0126 ('ClipNow V4.7-T
0012D2AC 004231A0 Text = "InValid Reg Key"
0012D2B0 004231C8 Title = "ClipNow-V4.7"
0012D2B4 00000000 Style = MB_OK|MB_APPLMODAL
0012D2B8 00000000 LanguageID = 0x0 (LANG_NEUTRAL)
0012D2C0 73D88411 ? user32.MessageBoxA mfc42.73D8840B 0012D2BC
0012D2C4 003A0126 hOwner = 003A0126 ('ClipNow V4.7-T
0012D2C8 004231A0 Text = "InValid Reg Key"
0012D2CC 004231C8 Title = "ClipNow-V4.7"
0012D2D0 00000000 Style = MB_OK|MB_APPLMODAL
0012D2D8 00403E52 ? clipnow.00417228 clipnow.00403E4D
发现0012D2D8 00403E52 ? clipnow.00417228 clipnow.00403E4D这里调用失败的弹窗提示,右击鼠标显示调用从显示的字符串可以看出这里应该的程序的关键判断位置
00403DEB 68 D8314200 PUSH clipnow.004231D8 ; ASCII "Picture.dll"
00403DF0 68 30324200 PUSH clipnow.00423230 ; ASCII "abc.xml"
00403DF5 FF96 CC000000 CALL NEAR DWORD PTR DS: ; KeyData.TestReg
00403DFB 83C4 08 ADD ESP, 0x8
00403DFE 3BC5 CMP EAX, EBP
00403E00 74 35 JE SHORT clipnow.00403E37 ; 关键跳
00403E02 8B4E 20 MOV ECX, DWORD PTR DS:
00403E05 6A 01 PUSH 0x1
00403E07 8981 FC000000 MOV DWORD PTR DS:, EAX
00403E0D 8B4E 20 MOV ECX, DWORD PTR DS:
00403E10 E8 3BC10000 CALL clipnow.0040FF50
00403E15 55 PUSH EBP
00403E16 68 C8314200 PUSH clipnow.004231C8 ; ASCII "ClipNow-V4.7"
00403E1B 68 B0314200 PUSH clipnow.004231B0 ; ASCII "Regisiter Successfully"
00403E20 8BCB MOV ECX, EBX
00403E22 E8 01340100 CALL clipnow.00417228 ; JMP 到 mfc42.#4224
00403E27 8B53 20 MOV EDX, DWORD PTR DS:
00403E2A 55 PUSH EBP
00403E2B 55 PUSH EBP
00403E2C 6A 10 PUSH 0x10
00403E2E 52 PUSH EDX
00403E2F FF15 CCA84100 CALL NEAR DWORD PTR DS: ; user32.PostMessageA
00403E35 EB 1B JMP SHORT clipnow.00403E52
00403E37 8B4E 20 MOV ECX, DWORD PTR DS:
00403E3A 55 PUSH EBP
00403E3B E8 10C10000 CALL clipnow.0040FF50
00403E40 55 PUSH EBP
00403E41 68 C8314200 PUSH clipnow.004231C8 ; ASCII "ClipNow-V4.7"
00403E46 68 A0314200 PUSH clipnow.004231A0 ; ASCII "InValid Reg Key"
00403E4B 8BCB MOV ECX, EBX
00403E4D E8 D6330100 CALL clipnow.00417228 ; JMP 到 mfc42.#4224
00403E52 8D4C24 2C LEA ECX, DWORD PTR SS:
00403E56 C68424 70040000>MOV BYTE PTR SS:, 0x0
00403E5E E8 8D070000 CALL clipnow.004045F0
00403E63 8D4C24 14 LEA ECX, DWORD PTR SS:
00403E67 C78424 70040000>MOV DWORD PTR SS:, -0x1
00403E72 E8 49030000 CALL clipnow.004041C0
00403E77 8B8C24 68040000 MOV ECX, DWORD PTR SS:
00403E7E 5F POP EDI
00403E7F 5E POP ESI
00403E80 5D POP EBP
00403E81 64:890D 0000000>MOV DWORD PTR FS:, ECX
00403E88 5B POP EBX
00403E89 81C4 64040000 ADD ESP, 0x464
00403E8F C3 RETN
这里00403E00 /74 35 JE SHORT clipnow.00403E37 ; 关键跳的关键跳跳过了成功提示
爆破的话只要NOP这个跳转应该就可以了,这次研究的更深入一点,看看能不能找到真码
一般关键跳往上就是关键CALL,从call的名字TestReg也可以看出这里是测试注册信息是否正确的地方
00403DF5 FF96 CC000000 CALL NEAR DWORD PTR DS: ; KeyData.TestReg
我们直接双击关键跳上面的CALL看看做了什么
好吧,发现双击不进去,我们在这一行下好断,再点击Register,程序再次断下
这回可以F7跟进去看个明白了
100010D0 >81EC 04040000 SUB ESP, 0x404
100010D6 8D4C24 00 LEA ECX, DWORD PTR SS:
100010DA 56 PUSH ESI
100010DB E8 803B0000 CALL KeyData.10004C60
100010E0 8B8424 10040000 MOV EAX, DWORD PTR SS:
100010E7 8B8C24 0C040000 MOV ECX, DWORD PTR SS:
100010EE 50 PUSH EAX ; Picture.dll
100010EF 51 PUSH ECX ; abc.xml
100010F0 8D4C24 0C LEA ECX, DWORD PTR SS:
100010F4 E8 073D0000 CALL KeyData.10004E00
100010F9 8D4C24 04 LEA ECX, DWORD PTR SS:
100010FD 8BF0 MOV ESI, EAX ; 0
100010FF E8 FC3B0000 CALL KeyData.10004D00
进来发现这个CALL很短,也没有什么算法,关键位置应该还在下一层
这个CALL又调用了3个CALL,既然不知道哪个是关键CALL那就一个一个看吧
10004C60 83EC 0C SUB ESP, 0xC
10004C63 56 PUSH ESI
10004C64 8BF1 MOV ESI, ECX
10004C66 8D4424 0C LEA EAX, DWORD PTR SS:
10004C6A 8D4C24 04 LEA ECX, DWORD PTR SS:
10004C6E 50 PUSH EAX
10004C6F 51 PUSH ECX
10004C70 51 PUSH ECX
10004C71 C706 14730010 MOV DWORD PTR DS:, KeyData.10007314
10004C77 8BCC MOV ECX, ESP
10004C79 896424 18 MOV DWORD PTR SS:, ESP
10004C7D 68 C0830010 PUSH KeyData.100083C0 ; ASCII "DiskID32.dll"
10004C82 C74424 14 00000>MOV DWORD PTR SS:, 0x0
10004C8A E8 610A0000 CALL KeyData.100056F0 ; JMP 到 mfc42.#537
10004C8F 8BCE MOV ECX, ESI
10004C91 E8 3A060000 CALL KeyData.100052D0
10004C96 8B5424 04 MOV EDX, DWORD PTR SS:
10004C9A 8B4C24 0C MOV ECX, DWORD PTR SS:
10004C9E 52 PUSH EDX
10004C9F 03C8 ADD ECX, EAX
10004CA1 8D5424 0C LEA EDX, DWORD PTR SS:
10004CA5 51 PUSH ECX
10004CA6 52 PUSH EDX
10004CA7 8BCE MOV ECX, ESI
10004CA9 E8 02050000 CALL KeyData.100051B0
10004CAE 8B4424 08 MOV EAX, DWORD PTR SS:
10004CB2 68 B4830010 PUSH KeyData.100083B4 ; ASCII "AE8E448F"
10004CB7 50 PUSH EAX
10004CB8 FF15 8C710010 CALL NEAR DWORD PTR DS: ; msvcrt._mbscmp
10004CBE 83C4 08 ADD ESP, 0x8
10004CC1 85C0 TEST EAX, EAX
10004CC3 74 08 JE SHORT KeyData.10004CCD
10004CC5 6A 02 PUSH 0x2
10004CC7 FF15 C8710010 CALL NEAR DWORD PTR DS: ; msvcrt.exit
10004CCD 8D4C24 08 LEA ECX, DWORD PTR SS:
10004CD1 E8 EA090000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004CD6 8BC6 MOV EAX, ESI
10004CD8 5E POP ESI
10004CD9 83C4 0C ADD ESP, 0xC
10004CDC C3 RETN
发现第一个CALL100010DB E8 803B0000 CALL KeyData.10004C60比较短,进去的开头前面几行有100083C0=KeyData.100083C0 (ASCII "DiskID32.dll")
又继续往下跟,出现一个关键字符串100083B4=KeyData.100083B4 (ASCII "AE8E448F")也不知道是什么东西,先记下可能有用
拿到注册码那里填进去,发现还是失败。说明这第一个CALL不是真码的位置,应该是验证DiskID32.dll文件的完整性(是不是就不清楚了,猜的)
我们继续跟到下一个CALL 100010F4 E8 073D0000 CALL KeyData.10004E00来看看这里面有什么
10004E00 6A FF PUSH -0x1 ; 验证CALL
10004E02 68 30610010 PUSH KeyData.10006130
10004E07 64:A1 00000000MOV EAX, DWORD PTR FS:
10004E0D 50 PUSH EAX
10004E0E 64:8925 0000000>MOV DWORD PTR FS:, ESP
10004E15 83EC 4C SUB ESP, 0x4C
10004E18 53 PUSH EBX
10004E19 56 PUSH ESI
10004E1A 57 PUSH EDI
10004E1B 8BF9 MOV EDI, ECX
10004E1D 8D4C24 1C LEA ECX, DWORD PTR SS:
10004E21 E8 A6080000 CALL KeyData.100056CC ; JMP 到 mfc42.#540
10004E26 33DB XOR EBX, EBX
10004E28 8D4C24 20 LEA ECX, DWORD PTR SS:
10004E2C 895C24 60 MOV DWORD PTR SS:, EBX
10004E30 E8 97080000 CALL KeyData.100056CC ; JMP 到 mfc42.#540
10004E35 895C24 48 MOV DWORD PTR SS:, EBX
10004E39 895C24 54 MOV DWORD PTR SS:, EBX
10004E3D 895C24 50 MOV DWORD PTR SS:, EBX
10004E41 895C24 4C MOV DWORD PTR SS:, EBX
10004E45 53 PUSH EBX
10004E46 8D4C24 20 LEA ECX, DWORD PTR SS:
10004E4A C64424 64 03 MOV BYTE PTR SS:, 0x3
10004E4F E8 8CC3FFFF CALL KeyData.100011E0
10004E54 895C24 44 MOV DWORD PTR SS:, EBX
10004E58 51 PUSH ECX
10004E59 8B4C24 6C MOV ECX, DWORD PTR SS:
10004E5D 8BC4 MOV EAX, ESP
10004E5F C74424 64 04000>MOV DWORD PTR SS:, 0x4
10004E67 896424 1C MOV DWORD PTR SS:, ESP
10004E6B 8908 MOV DWORD PTR DS:, ECX
10004E6D 8D4C24 20 LEA ECX, DWORD PTR SS:
10004E71 E8 EAC3FFFF CALL KeyData.10001260
10004E76 25 FF000000 AND EAX, 0xFF
10004E7B 894424 68 MOV DWORD PTR SS:, EAX
10004E7F 75 35 JNZ SHORT KeyData.10004EB6
10004E81 8D4C24 4C LEA ECX, DWORD PTR SS:
10004E85 C74424 60 07000>MOV DWORD PTR SS:, 0x7
10004E8D E8 FECEFFFF CALL KeyData.10001D90
10004E92 8B4424 48 MOV EAX, DWORD PTR SS:
10004E96 C64424 60 06 MOV BYTE PTR SS:, 0x6
10004E9B 3BC3 CMP EAX, EBX
10004E9D 74 09 JE SHORT KeyData.10004EA8
10004E9F 8D4C24 48 LEA ECX, DWORD PTR SS:
10004EA3 E8 08D6FFFF CALL KeyData.100024B0
10004EA8 895C24 48 MOV DWORD PTR SS:, EBX
10004EAC C64424 60 05 MOV BYTE PTR SS:, 0x5
10004EB1 E9 47020000 JMP KeyData.100050FD
10004EB6 8D4C24 0C LEA ECX, DWORD PTR SS:
10004EBA E8 0D080000 CALL KeyData.100056CC ; JMP 到 mfc42.#540
10004EBF 8D4C24 10 LEA ECX, DWORD PTR SS:
10004EC3 C64424 60 08 MOV BYTE PTR SS:, 0x8
10004EC8 E8 FF070000 CALL KeyData.100056CC ; JMP 到 mfc42.#540
10004ECD 51 PUSH ECX
10004ECE 8D4C24 20 LEA ECX, DWORD PTR SS:
10004ED2 8BC4 MOV EAX, ESP
10004ED4 C64424 64 09 MOV BYTE PTR SS:, 0x9
10004ED9 896424 6C MOV DWORD PTR SS:, ESP
10004EDD C700 F8830010 MOV DWORD PTR DS:, KeyData.100083F8 ; ASCII "UserName"
10004EE3 E8 48C6FFFF CALL KeyData.10001530
10004EE8 3AC3 CMP AL, BL
10004EEA 74 2B JE SHORT KeyData.10004F17
10004EEC 8D5424 68 LEA EDX, DWORD PTR SS:
10004EF0 8D4C24 1C LEA ECX, DWORD PTR SS:
10004EF4 52 PUSH EDX
10004EF5 E8 36020000 CALL KeyData.10005130
10004EFA 50 PUSH EAX
10004EFB 8D4C24 10 LEA ECX, DWORD PTR SS:
10004EFF C64424 64 0A MOV BYTE PTR SS:, 0xA
10004F04 E8 BD070000 CALL KeyData.100056C6 ; JMP 到 mfc42.#858
10004F09 8D4C24 68 LEA ECX, DWORD PTR SS:
10004F0D C64424 60 09 MOV BYTE PTR SS:, 0x9
10004F12 E8 A9070000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004F17 53 PUSH EBX
10004F18 53 PUSH EBX
10004F19 53 PUSH EBX
10004F1A 8D4C24 28 LEA ECX, DWORD PTR SS:
10004F1E E8 2D020000 CALL KeyData.10005150
10004F23 51 PUSH ECX
10004F24 8D4C24 20 LEA ECX, DWORD PTR SS:
10004F28 8BC4 MOV EAX, ESP
10004F2A 896424 6C MOV DWORD PTR SS:, ESP
10004F2E C700 F0830010 MOV DWORD PTR DS:, KeyData.100083F0 ; ASCII "SerNo"
10004F34 E8 F7C5FFFF CALL KeyData.10001530
10004F39 3AC3 CMP AL, BL
10004F3B 74 2B JE SHORT KeyData.10004F68
10004F3D 8D4424 68 LEA EAX, DWORD PTR SS:
10004F41 8D4C24 1C LEA ECX, DWORD PTR SS:
10004F45 50 PUSH EAX
10004F46 E8 E5010000 CALL KeyData.10005130
10004F4B 50 PUSH EAX
10004F4C 8D4C24 14 LEA ECX, DWORD PTR SS:
10004F50 C64424 64 0B MOV BYTE PTR SS:, 0xB
10004F55 E8 6C070000 CALL KeyData.100056C6 ; JMP 到 mfc42.#858
10004F5A 8D4C24 68 LEA ECX, DWORD PTR SS:
10004F5E C64424 60 09 MOV BYTE PTR SS:, 0x9
10004F63 E8 58070000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004F68 8B4C24 0C MOV ECX, DWORD PTR SS: ; 用户名
10004F6C 8B35 8C710010 MOV ESI, DWORD PTR DS: ; msvcrt._mbscmp
10004F72 68 80850010 PUSH KeyData.10008580
10004F77 51 PUSH ECX
10004F78 FFD6 CALL NEAR ESI
10004F7A 83C4 08 ADD ESP, 0x8
10004F7D 85C0 TEST EAX, EAX
10004F7F 0F84 2C010000 JE KeyData.100050B1
10004F85 8B5424 10 MOV EDX, DWORD PTR SS: ; 假码
10004F89 68 80850010 PUSH KeyData.10008580
10004F8E 52 PUSH EDX
10004F8F FFD6 CALL NEAR ESI
10004F91 83C4 08 ADD ESP, 0x8
10004F94 85C0 TEST EAX, EAX
10004F96 0F84 15010000 JE KeyData.100050B1
10004F9C 8B4424 0C MOV EAX, DWORD PTR SS:
10004FA0 8D4C24 0C LEA ECX, DWORD PTR SS:
10004FA4 8B40 F8 MOV EAX, DWORD PTR DS: ; 用户名长度
10004FA7 50 PUSH EAX
10004FA8 E8 3D070000 CALL KeyData.100056EA ; JMP 到 mfc42.#2915
10004FAD 8D4C24 14 LEA ECX, DWORD PTR SS:
10004FB1 50 PUSH EAX
10004FB2 51 PUSH ECX
10004FB3 8BCF MOV ECX, EDI
10004FB5 E8 66040000 CALL KeyData.10005420 ; 计算真码
10004FBA 8B5424 10 MOV EDX, DWORD PTR SS: ; 假码
10004FBE 8B4424 14 MOV EAX, DWORD PTR SS: ; 真码
10004FC2 52 PUSH EDX ; 假码
10004FC3 50 PUSH EAX ; 真码
10004FC4 FFD6 CALL NEAR ESI
10004FC6 83C4 08 ADD ESP, 0x8
10004FC9 C64424 60 09 MOV BYTE PTR SS:, 0x9
10004FCE 85C0 TEST EAX, EAX
10004FD0 8D4C24 14 LEA ECX, DWORD PTR SS:
10004FD4 0F85 84000000 JNZ KeyData.1000505E
10004FDA E8 E1060000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004FDF 8D4C24 10 LEA ECX, DWORD PTR SS:
10004FE3 C64424 60 08 MOV BYTE PTR SS:, 0x8
10004FE8 E8 D3060000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004FED 8D4C24 0C LEA ECX, DWORD PTR SS:
10004FF1 C64424 60 04 MOV BYTE PTR SS:, 0x4
10004FF6 E8 C5060000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10004FFB 8D4C24 4C LEA ECX, DWORD PTR SS:
10004FFF C74424 60 12000>MOV DWORD PTR SS:, 0x12
10005007 E8 84CDFFFF CALL KeyData.10001D90
1000500C 8B4424 48 MOV EAX, DWORD PTR SS:
10005010 C64424 60 11 MOV BYTE PTR SS:, 0x11
10005015 3BC3 CMP EAX, EBX
10005017 74 09 JE SHORT KeyData.10005022
10005019 8D4C24 48 LEA ECX, DWORD PTR SS:
1000501D E8 8ED4FFFF CALL KeyData.100024B0
10005022 8D4C24 20 LEA ECX, DWORD PTR SS:
10005026 895C24 48 MOV DWORD PTR SS:, EBX
1000502A C64424 60 10 MOV BYTE PTR SS:, 0x10
1000502F E8 8C060000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10005034 8D4C24 1C LEA ECX, DWORD PTR SS:
10005038 C74424 60 FFFFF>MOV DWORD PTR SS:, -0x1
10005040 E8 7B060000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10005045 B8 01000000 MOV EAX, 0x1
1000504A 8B4C24 58 MOV ECX, DWORD PTR SS:
1000504E 64:890D 0000000>MOV DWORD PTR FS:, ECX
10005055 5F POP EDI
10005056 5E POP ESI
10005057 5B POP EBX
10005058 83C4 58 ADD ESP, 0x58
1000505B C2 0800 RETN 0x8
这个CALL有点长,有点像是关键验证CALL,经过多次跟踪发现
10004FBA 8B5424 10 MOV EDX, DWORD PTR SS: ; 假码
10004FBE 8B4424 14 MOV EAX, DWORD PTR SS: ; 真码
10004FC2 52 PUSH EDX ; 假码
10004FC3 50 PUSH EAX ; 真码
10004FC4 FFD6 CALL NEAR ESI
这里出来了真码和假码的对比,这里的真码出现,那么上面的几个CALL应该有计算真码的CALL
到这里真码也找到了,继续看上面的几个CALL看看能不能找出算法部分
再次分析发现上面的这个CALL就是计算真码用的
10004FB5 E8 66040000 CALL KeyData.10005420 ; 计算真码
双击跟进去看一下到底是怎么算出真码的,(注:我用的用户名是“千千万是福朋友”)
10005420 6A FF PUSH -0x1
10005422 68 E1610010 PUSH KeyData.100061E1
10005427 64:A1 00000000MOV EAX, DWORD PTR FS:
1000542D 50 PUSH EAX
1000542E 64:8925 0000000>MOV DWORD PTR FS:, ESP
10005435 81EC F4030000 SUB ESP, 0x3F4
1000543B 56 PUSH ESI
1000543C 8BF1 MOV ESI, ECX
1000543E 57 PUSH EDI
1000543F 8D8C24 14020000 LEA ECX, DWORD PTR SS:
10005446 C74424 10 00000>MOV DWORD PTR SS:, 0x0
1000544E E8 0DEAFFFF CALL KeyData.10003E60
10005453 8B8424 10040000 MOV EAX, DWORD PTR SS: ; 用户名
1000545A 8D8C24 14020000 LEA ECX, DWORD PTR SS:
10005461 50 PUSH EAX
10005462 C78424 08040000>MOV DWORD PTR SS:, 0x1
1000546D E8 9EEAFFFF CALL KeyData.10003F10
10005472 8D8C24 14020000 LEA ECX, DWORD PTR SS:
10005479 E8 42F6FFFF CALL KeyData.10004AC0 ; 用户名MD5
1000547E 33C9 XOR ECX, ECX ; EAX=0012CE26, (ASCII "2749525809be1ef30c1afd46807d5a98")
10005480 8BF8 MOV EDI, EAX
10005482 894C24 19 MOV DWORD PTR SS:, ECX
10005486 C64424 18 00 MOV BYTE PTR SS:, 0x0
1000548B 894C24 1D MOV DWORD PTR SS:, ECX
1000548F 894C24 21 MOV DWORD PTR SS:, ECX
10005493 894C24 25 MOV DWORD PTR SS:, ECX
10005497 8BD1 MOV EDX, ECX
10005499 81E2 01000080 AND EDX, 0x80000001
1000549F 79 05 JNS SHORT KeyData.100054A6
100054A1 4A DEC EDX
100054A2 83CA FE OR EDX, 0xFFFFFFFE
100054A5 42 INC EDX
100054A6 75 0E JNZ SHORT KeyData.100054B6
100054A8 8BC1 MOV EAX, ECX
100054AA 99 CDQ
100054AB 2BC2 SUB EAX, EDX
100054AD 8A1439 MOV DL, BYTE PTR DS:
100054B0 D1F8 SAR EAX, 1
100054B2 885404 18 MOV BYTE PTR SS:, DL
100054B6 41 INC ECX
100054B7 83F9 20 CMP ECX, 0x20
100054BA^ 7C DB JL SHORT KeyData.10005497
100054BC 8D4424 18 LEA EAX, DWORD PTR SS: ; 堆栈地址=0012CA68, (ASCII "24550b1f01f48759")
100054C0 6A 10 PUSH 0x10
100054C2 8D4C24 10 LEA ECX, DWORD PTR SS:
100054C6 50 PUSH EAX
100054C7 51 PUSH ECX
100054C8 8BCE MOV ECX, ESI
100054CA E8 E1FCFFFF CALL KeyData.100051B0 ; 587F528
100054CF 8D4C24 2C LEA ECX, DWORD PTR SS:
100054D3 C68424 04040000>MOV BYTE PTR SS:, 0x2
100054DB E8 80E9FFFF CALL KeyData.10003E60
100054E0 8B5424 0C MOV EDX, DWORD PTR SS: ; 堆栈 SS:=00BB6DD8, (ASCII "B578F528")
100054E4 8D4C24 2C LEA ECX, DWORD PTR SS:
100054E8 52 PUSH EDX
100054E9 C68424 08040000>MOV BYTE PTR SS:, 0x3
100054F1 E8 1AEAFFFF CALL KeyData.10003F10
100054F6 8D4C24 2C LEA ECX, DWORD PTR SS:
100054FA E8 C1F5FFFF CALL KeyData.10004AC0 ; 取MD5
100054FF 50 PUSH EAX ; EAX=0012CC3E, (ASCII "1619457074b437461336c80a531ccd67")
10005500 8D4C24 0C LEA ECX, DWORD PTR SS:
10005504 E8 E7010000 CALL KeyData.100056F0 ; JMP 到 mfc42.#537
10005509 8D4424 14 LEA EAX, DWORD PTR SS:
1000550D 6A 08 PUSH 0x8
1000550F 50 PUSH EAX
10005510 8D4C24 10 LEA ECX, DWORD PTR SS:
10005514 C68424 0C040000>MOV BYTE PTR SS:, 0x4
1000551C E8 23020000 CALL KeyData.10005744 ; JMP 到 mfc42.#4129
10005521 50 PUSH EAX ; 取前8 “16194570”
10005522 8D4C24 0C LEA ECX, DWORD PTR SS:
10005526 C68424 08040000>MOV BYTE PTR SS:, 0x5
1000552E E8 93010000 CALL KeyData.100056C6 ; JMP 到 mfc42.#858
10005533 8D4C24 14 LEA ECX, DWORD PTR SS:
10005537 C68424 04040000>MOV BYTE PTR SS:, 0x4
1000553F E8 7C010000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10005544 8D4C24 08 LEA ECX, DWORD PTR SS:
10005548 E8 F1010000 CALL KeyData.1000573E ; JMP 到 mfc42.#4204
1000554D 8BB424 0C040000 MOV ESI, DWORD PTR SS:
10005554 8D4C24 08 LEA ECX, DWORD PTR SS: ; 到大写 6DD95E07
10005558 51 PUSH ECX
10005559 8BCE MOV ECX, ESI
1000555B E8 96010000 CALL KeyData.100056F6 ; JMP 到 mfc42.#535
10005560 C74424 10 01000>MOV DWORD PTR SS:, 0x1
10005568 8D4C24 08 LEA ECX, DWORD PTR SS:
1000556C C68424 04040000>MOV BYTE PTR SS:, 0x3
10005574 E8 47010000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
10005579 8D4C24 2C LEA ECX, DWORD PTR SS:
1000557D C68424 04040000>MOV BYTE PTR SS:, 0x2
10005585 E8 06E9FFFF CALL KeyData.10003E90
1000558A 8D4C24 0C LEA ECX, DWORD PTR SS:
1000558E C68424 04040000>MOV BYTE PTR SS:, 0x1
10005596 E8 25010000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
1000559B 8D8C24 14020000 LEA ECX, DWORD PTR SS:
100055A2 C68424 04040000>MOV BYTE PTR SS:, 0x0
100055AA E8 E1E8FFFF CALL KeyData.10003E90
100055AF 8B8C24 FC030000 MOV ECX, DWORD PTR SS:
100055B6 8BC6 MOV EAX, ESI
100055B8 5F POP EDI
100055B9 5E POP ESI
100055BA 64:890D 0000000>MOV DWORD PTR FS:, ECX
100055C1 81C4 00040000 ADD ESP, 0x400
100055C7 C2 0800 RETN 0x8
多次跟踪发现这里出现了几个比较敏感的字符串
类似MD5的字符串1000547E 33C9 XOR ECX, ECX ; EAX=0012CE26, (ASCII "2749525809be1ef30c1afd46807d5a98")
100054BC 8D4424 18 LEA EAX, DWORD PTR SS: ; 堆栈地址=0012CA68, (ASCII "24550b1f01f48759")
100054E0 8B5424 0C MOV EDX, DWORD PTR SS: ; 堆栈 SS:=00BB6DD8, (ASCII "B578F528")
100054FF 50 PUSH EAX ; EAX=0012CC3E, (ASCII "1619457074b437461336c80a531ccd67")
10005521 50 PUSH EAX ; 取前8 “16194570”,也就是真码
使用MD5计算器计算下用户名“千千万是福朋友”的MD5值,刚好就是第一个关键字符串“2749525809be1ef30c1afd46807d5a98”
第二个字符串一看还看不出来,但和第一个对比看一下,发现刚好是第一个字符串中取出奇数位的字符(第1、3、5、7、9、11、13、15、17、19、21、23、25、27、29、31)组合"24550b1f01f48759"
第三个字符串“B578F528”怎么也猜不出来是什么东西,那就先不管了
看看第四个也有点像MD5,再计算下“B578F528”的MD5,哈哈刚好就是"1619457074b437461336c80a531ccd67"
第五个字符串就很简单了,用眼睛一看就知道取的是“B578F528”的MD5前8位数
现在问题就只剩一个了:这个“B578F528”到底是怎么得出来的??
跟到这个字符串的上一个CALL进去看看能不能找到什么东西
100051B0 6A FF PUSH -0x1
100051B2 68 5F610010 PUSH KeyData.1000615F
100051B7 64:A1 00000000MOV EAX, DWORD PTR FS:
100051BD 50 PUSH EAX
100051BE 64:8925 0000000>MOV DWORD PTR FS:, ESP
100051C5 83EC 14 SUB ESP, 0x14
100051C8 55 PUSH EBP
100051C9 56 PUSH ESI
100051CA 57 PUSH EDI ; 用户名MD5
100051CB 8BF1 MOV ESI, ECX
100051CD C74424 10 00000>MOV DWORD PTR SS:, 0x0
100051D5 E8 A6FFFFFF CALL KeyData.10005180
100051DA 8B7C24 38 MOV EDI, DWORD PTR SS: ; 位数
100051DE 8B4C24 34 MOV ECX, DWORD PTR SS: ; 真码MD5取奇数位
100051E2 83C8 FF OR EAX, 0xFFFFFFFF
100051E5 85FF TEST EDI, EDI
100051E7 7E 1B JLE SHORT KeyData.10005204
100051E9 8BE8 MOV EBP, EAX
100051EB 33D2 XOR EDX, EDX
100051ED 8A11 MOV DL, BYTE PTR DS:
100051EF 81E5 FF000000 AND EBP, 0xFF
100051F5 33EA XOR EBP, EDX
100051F7 C1E8 08 SHR EAX, 0x8
100051FA 8B54AE 04 MOV EDX, DWORD PTR DS:
100051FE 33C2 XOR EAX, EDX
10005200 41 INC ECX
10005201 4F DEC EDI
10005202^ 75 E5 JNZ SHORT KeyData.100051E9
10005204 33C9 XOR ECX, ECX
10005206 8D5424 14 LEA EDX, DWORD PTR SS:
1000520A 894C24 15 MOV DWORD PTR SS:, ECX
1000520E 6A 10 PUSH 0x10
10005210 F7D0 NOT EAX
10005212 894C24 1D MOV DWORD PTR SS:, ECX
10005216 52 PUSH EDX
10005217 50 PUSH EAX
10005218 C64424 20 00 MOV BYTE PTR SS:, 0x0
1000521D 884C24 29 MOV BYTE PTR SS:, CL
10005221 FF15 00720010 CALL NEAR DWORD PTR DS: ; msvcrt._itoa
10005227 8D7C24 20 LEA EDI, DWORD PTR SS: ; 堆栈地址=0012CA28, (ASCII "b578f528")
1000522B 83C9 FF OR ECX, 0xFFFFFFFF
1000522E 33C0 XOR EAX, EAX
10005230 83C4 0C ADD ESP, 0xC
10005233 33F6 XOR ESI, ESI
10005235 F2:AE REPNE SCAS BYTE PTR ES:
10005237 F7D1 NOT ECX
10005239 49 DEC ECX
1000523A 74 28 JE SHORT KeyData.10005264
1000523C 8B2D C4710010 MOV EBP, DWORD PTR DS: ; msvcrt.toupper
10005242 0FBE4434 14 MOVSX EAX, BYTE PTR SS:
10005247 50 PUSH EAX
10005248 FFD5 CALL NEAR EBP
1000524A 884434 18 MOV BYTE PTR SS:, AL
1000524E 83C4 04 ADD ESP, 0x4
10005251 8D7C24 14 LEA EDI, DWORD PTR SS:
10005255 83C9 FF OR ECX, 0xFFFFFFFF
10005258 33C0 XOR EAX, EAX
1000525A 46 INC ESI
1000525B F2:AE REPNE SCAS BYTE PTR ES:
1000525D F7D1 NOT ECX
1000525F 49 DEC ECX
10005260 3BF1 CMP ESI, ECX
10005262^ 72 DE JB SHORT KeyData.10005242
10005264 8D4C24 0C LEA ECX, DWORD PTR SS: ; 堆栈地址=0012CA20, (ASCII "5a98")
10005268 E8 5F040000 CALL KeyData.100056CC ; JMP 到 mfc42.#540
1000526D 8D4C24 14 LEA ECX, DWORD PTR SS: ; 堆栈地址=0012CA28, (ASCII "B578F528")
10005271 8D5424 0C LEA EDX, DWORD PTR SS:
10005275 51 PUSH ECX
10005276 BF 01000000 MOV EDI, 0x1
1000527B 68 04840010 PUSH KeyData.10008404 ; ASCII "%s"
10005280 52 PUSH EDX
10005281 897C24 34 MOV DWORD PTR SS:, EDI
10005285 E8 A8040000 CALL KeyData.10005732 ; JMP 到 mfc42.#2818
1000528A 8B7424 3C MOV ESI, DWORD PTR SS:
1000528E 83C4 0C ADD ESP, 0xC
10005291 8D4424 0C LEA EAX, DWORD PTR SS:
10005295 8BCE MOV ECX, ESI
10005297 50 PUSH EAX
10005298 E8 59040000 CALL KeyData.100056F6 ; JMP 到 mfc42.#535
1000529D 897C24 10 MOV DWORD PTR SS:, EDI
100052A1 8D4C24 0C LEA ECX, DWORD PTR SS:
100052A5 C64424 28 00 MOV BYTE PTR SS:, 0x0
100052AA E8 11040000 CALL KeyData.100056C0 ; JMP 到 mfc42.#800
100052AF 8B4C24 20 MOV ECX, DWORD PTR SS:
100052B3 8BC6 MOV EAX, ESI
100052B5 5F POP EDI
100052B6 5E POP ESI
100052B7 5D POP EBP
100052B8 64:890D 0000000>MOV DWORD PTR FS:, ECX
100052BF 83C4 20 ADD ESP, 0x20
100052C2 C2 0C00 RETN 0xC
发现上面的第三个关键字符串是从10005227 8D7C24 20 LEA EDI, DWORD PTR SS: ; 堆栈地址=0012CA28, (ASCII "b578f528")这里算出来的
100051DA 8B7C24 38 MOV EDI, DWORD PTR SS: ; 位数
100051DE 8B4C24 34 MOV ECX, DWORD PTR SS: ; 真码MD5取奇数位
100051E2 83C8 FF OR EAX, 0xFFFFFFFF ;初始为0xFFFFFFFF
100051E5 85FF TEST EDI, EDI
100051E7 7E 1B JLE SHORT KeyData.10005204
100051E9 8BE8 MOV EBP, EAX ; ebp = eax
100051EB 33D2 XOR EDX, EDX
100051ED 8A11 MOV DL, BYTE PTR DS: ;依次循环取真码奇数位MD5的ASCII码
100051EF 81E5 FF000000 AND EBP, 0xFF; ebp 和 0xff 进行与运算
100051F5 33EA XOR EBP, EDX ; EBP 和 EDX 异或运算
100051F7 C1E8 08 SHR EAX, 0x8 ; EAX 右移8位
100051FA 8B54AE 04 MOV EDX, DWORD PTR DS: ; ESI = 0012CED8 计算 地址查取数据
100051FE 33C2 XOR EAX, EDX
10005200 41 INC ECX
10005201 4F DEC EDI
10005202^ 75 E5 JNZ SHORT KeyData.100051E9
10005204 33C9 XOR ECX, ECX
10005206 8D5424 14 LEA EDX, DWORD PTR SS:
1000520A 894C24 15 MOV DWORD PTR SS:, ECX
1000520E 6A 10 PUSH 0x10
10005210 F7D0 NOT EAX ; EAX 按位取反
10005212 894C24 1D MOV DWORD PTR SS:, ECX
10005216 52 PUSH EDX
10005217 50 PUSH EAX
10005218 C64424 20 00 MOV BYTE PTR SS:, 0x0
1000521D 884C24 29 MOV BYTE PTR SS:, CL
10005221 FF15 00720010 CALL NEAR DWORD PTR DS: ; msvcrt._itoa
10005227 8D7C24 20 LEA EDI, DWORD PTR SS: ; 堆栈地址=0012CA28, (ASCII "b578f528")
发现ASCII "b578f528"上面也没有调用其他什么CALL了,那这上面的这些汇编就是算法部分了
这里也不需要看懂怎么算的(因为我看着也有点复杂),只要把代码照搬到注册机中就行,还需要把 0012CED8 地址的数据(大小0x400)烤出来一份用于计算
00 00 00 00 96 30 07 77 2C 61 0E EE BA 51 09 99 19 C4 6D 07 8F F4 6A 70 35 A5 63 E9 A3 95 64 9E
32 88 DB 0E A4 B8 DC 79 1E E9 D5 E0 88 D9 D2 97 2B 4C B6 09 BD 7C B1 7E 07 2D B8 E7 91 1D BF 90
64 10 B7 1D F2 20 B0 6A 48 71 B9 F3 DE 41 BE 84 7D D4 DA 1A EB E4 DD 6D 51 B5 D4 F4 C7 85 D3 83
56 98 6C 13 C0 A8 6B 64 7A F9 62 FD EC C9 65 8A 4F 5C 01 14 D9 6C 06 63 63 3D 0F FA F5 0D 08 8D
C8 20 6E 3B 5E 10 69 4C E4 41 60 D5 72 71 67 A2 D1 E4 03 3C 47 D4 04 4B FD 85 0D D2 6B B5 0A A5
FA A8 B5 35 6C 98 B2 42 D6 C9 BB DB 40 F9 BC AC E3 6C D8 32 75 5C DF 45 CF 0D D6 DC 59 3D D1 AB
AC 30 D9 26 3A 00 DE 51 80 51 D7 C8 16 61 D0 BF B5 F4 B4 21 23 C4 B3 56 99 95 BA CF 0F A5 BD B8
9E B8 02 28 08 88 05 5F B2 D9 0C C6 24 E9 0B B1 87 7C 6F 2F 11 4C 68 58 AB 1D 61 C1 3D 2D 66 B6
90 41 DC 76 06 71 DB 01 BC 20 D2 98 2A 10 D5 EF 89 85 B1 71 1F B5 B6 06 A5 E4 BF 9F 33 D4 B8 E8
A2 C9 07 78 34 F9 00 0F 8E A8 09 96 18 98 0E E1 BB 0D 6A 7F 2D 3D 6D 08 97 6C 64 91 01 5C 63 E6
F4 51 6B 6B 62 61 6C 1C D8 30 65 85 4E 00 62 F2 ED 95 06 6C 7B A5 01 1B C1 F4 08 82 57 C4 0F F5
C6 D9 B0 65 50 E9 B7 12 EA B8 BE 8B 7C 88 B9 FC DF 1D DD 62 49 2D DA 15 F3 7C D3 8C 65 4C D4 FB
58 61 B2 4D CE 51 B5 3A 74 00 BC A3 E2 30 BB D4 41 A5 DF 4A D7 95 D8 3D 6D C4 D1 A4 FB F4 D6 D3
6A E9 69 43 FC D9 6E 34 46 88 67 AD D0 B8 60 DA 73 2D 04 44 E5 1D 03 33 5F 4C 0A AA C9 7C 0D DD
3C 71 05 50 AA 41 02 27 10 10 0B BE 86 20 0C C9 25 B5 68 57 B3 85 6F 20 09 D4 66 B9 9F E4 61 CE
0E F9 DE 5E 98 C9 D9 29 22 98 D0 B0 B4 A8 D7 C7 17 3D B3 59 81 0D B4 2E 3B 5C BD B7 AD 6C BA C0
20 83 B8 ED B6 B3 BF 9A 0C E2 B6 03 9A D2 B1 74 39 47 D5 EA AF 77 D2 9D 15 26 DB 04 83 16 DC 73
12 0B 63 E3 84 3B 64 94 3E 6A 6D 0D A8 5A 6A 7A 0B CF 0E E4 9D FF 09 93 27 AE 00 0A B1 9E 07 7D
44 93 0F F0 D2 A3 08 87 68 F2 01 1E FE C2 06 69 5D 57 62 F7 CB 67 65 80 71 36 6C 19 E7 06 6B 6E
76 1B D4 FE E0 2B D3 89 5A 7A DA 10 CC 4A DD 67 6F DF B9 F9 F9 EF BE 8E 43 BE B7 17 D5 8E B0 60
E8 A3 D6 D6 7E 93 D1 A1 C4 C2 D8 38 52 F2 DF 4F F1 67 BB D1 67 57 BC A6 DD 06 B5 3F 4B 36 B2 48
DA 2B 0D D8 4C 1B 0A AF F6 4A 03 36 60 7A 04 41 C3 EF 60 DF 55 DF 67 A8 EF 8E 6E 31 79 BE 69 46
8C B3 61 CB 1A 83 66 BC A0 D2 6F 25 36 E2 68 52 95 77 0C CC 03 47 0B BB B9 16 02 22 2F 26 05 55
BE 3B BA C5 28 0B BD B2 92 5A B4 2B 04 6A B3 5C A7 FF D7 C2 31 CF D0 B5 8B 9E D9 2C 1D AE DE 5B
B0 C2 64 9B 26 F2 63 EC 9C A3 6A 75 0A 93 6D 02 A9 06 09 9C 3F 36 0E EB 85 67 07 72 13 57 00 05
82 4A BF 95 14 7A B8 E2 AE 2B B1 7B 38 1B B6 0C 9B 8E D2 92 0D BE D5 E5 B7 EF DC 7C 21 DF DB 0B
D4 D2 D3 86 42 E2 D4 F1 F8 B3 DD 68 6E 83 DA 1F CD 16 BE 81 5B 26 B9 F6 E1 77 B0 6F 77 47 B7 18
E6 5A 08 88 70 6A 0F FF CA 3B 06 66 5C 0B 01 11 FF 9E 65 8F 69 AE 62 F8 D3 FF 6B 61 45 CF 6C 16
78 E2 0A A0 EE D2 0D D7 54 83 04 4E C2 B3 03 39 61 26 67 A7 F7 16 60 D0 4D 47 69 49 DB 77 6E 3E
4A 6A D1 AE DC 5A D6 D9 66 0B DF 40 F0 3B D8 37 53 AE BC A9 C5 9E BB DE 7F CF B2 47 E9 FF B5 30
1C F2 BD BD 8A C2 BA CA 30 93 B3 53 A6 A3 B4 24 05 36 D0 BA 93 06 D7 CD 29 57 DE 54 BF 67 D9 23
2E 7A 66 B3 B8 4A 61 C4 02 1B 68 5D 94 2B 6F 2A 37 BE 0B B4 A1 8E 0C C3 1B DF 05 5A 8D EF 02 2D
下面附上注册机
厉害!
下面是码表,其实是标准的CrC32运算!
赞一个~ 分析很精辟,赞一下。 GGLHY 发表于 2015-5-10 08:12
厉害!
下面是码表,其实是标准的CrC32运算!
现在知道了,感谢G大指点
论坛高人辈出,顶一下 学校学习了一下。 感谢楼主 学校学习了一下。 感谢楼主 感谢楼主破解分享,貌似有人也爆破过,非注册机算法类。
感谢楼主的破文。
页:
[1]