爆破vcrkme01(已补上注册机)
2016-04-13 20:31
211 查看
系统 : Windows xp
程序 : vcrkme01
程序下载地址 :http://pan.baidu.com/s/1mh1n33y
要求 : 爆破
使用工具 :OD
可在“PEDIY CrackMe 2007”中查找关于此程序的破文,标题为“标志位法爆破实例”。
OD载入程序根据字串提示找出关键算法:
这里F7进入标志eax的子程序:
程序最后对eax的值进行了设置,我们也在最后将赋值的指令(地址401198)改成:
inc eax
效果如下:
![](http://images2015.cnblogs.com/blog/842655/201601/842655-20160122163047422-1961058866.png)
-------------------------------------------------------------------------------------------------------------------
分析标志eax的子程序:
那么长的代码段实现的功能却是很简单,我们动手实现一下注册机。
我们直接打开之前搭建的框架,并修改OnBtnDecrypt函数如下:
再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("wind-vcrkme01_Keygen"));
运行效果:
程序 : vcrkme01
程序下载地址 :http://pan.baidu.com/s/1mh1n33y
要求 : 爆破
使用工具 :OD
可在“PEDIY CrackMe 2007”中查找关于此程序的破文,标题为“标志位法爆破实例”。
OD载入程序根据字串提示找出关键算法:
00401223 . 68 FF000000 push 0FF ; /Count = FF (255.) 00401228 . 68 30694000 push 00406930 ; |Buffer = vcrkme01.00406930 0040122D . 68 E8030000 push 3E8 ; |ControlID = 3E8 (1000.) 00401232 . 50 push eax ; |hWnd => 00490736 ('[v0!d] Crackme - v0.01',class='#32770') 00401233 . FFD6 call esi ; \GetDlgItemTextA 00401235 . 8B0D 28694000 mov ecx, dword ptr [406928] 0040123B . 68 FF000000 push 0FF ; /Count = FF (255.) 00401240 . 68 306A4000 push 00406A30 ; |Buffer = vcrkme01.00406A30 00401245 . 68 EA030000 push 3EA ; |ControlID = 3EA (1002.) 0040124A . 51 push ecx ; |hWnd => 00490736 ('[v0!d] Crackme - v0.01',class='#32770') 0040124B . FFD6 call esi ; \GetDlgItemTextA 0040124D . 68 306A4000 push 00406A30 00401252 . 68 30694000 push 00406930 00401257 . E8 A4FDFFFF call 00401000 0040125C . 83C4 08 add esp, 8 0040125F . 83F8 01 cmp eax, 1 ; eax 是否为1? 00401262 . A3 646C4000 mov dword ptr [406C64], eax 00401267 75 65 jnz short 004012CE ; 不是则跳转出错 00401269 . 8B15 28694000 mov edx, dword ptr [406928] 0040126F . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL 00401271 . 68 80604000 push 00406080 ; |good job! - cracked! 00401276 . 68 50604000 push 00406050 ; |send your solution to : v0id2k1@hotmail.com 0040127B . 52 push edx ; |hOwner => 00490736 ('[v0!d] Crackme - v0.01',class='#32770') 0040127C . FF15 C4504000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
这里F7进入标志eax的子程序:
00401183 8B5424 14 mov edx, dword ptr [esp+14] ; 对edx的最后一次赋值 00401187 B9 40000000 mov ecx, 40 0040118C |. 33C0 xor eax, eax 0040118E |. BF 446B4000 mov edi, 00406B44 00401193 |. F3:AB rep stos dword ptr es:[edi] 00401195 |. 5F pop edi 00401196 |. 5E pop esi 00401197 |. 5D pop ebp 00401198 8BC2 mov eax, edx ; 最后将edx的值传入标志eax 0040119A 5B pop ebx 0040119B C3 retn
程序最后对eax的值进行了设置,我们也在最后将赋值的指令(地址401198)改成:
inc eax
效果如下:
![](http://images2015.cnblogs.com/blog/842655/201601/842655-20160122163047422-1961058866.png)
-------------------------------------------------------------------------------------------------------------------
分析标志eax的子程序:
00401000 /$ 53 push ebx 00401001 |. 8B5C24 0C mov ebx, dword ptr [esp+C] 00401005 |. 55 push ebp 00401006 |. 56 push esi 00401007 |. 8B7424 10 mov esi, dword ptr [esp+10] 0040100B |. 8A0B mov cl, byte ptr [ebx] ; 取出密钥首字符 0040100D |. 33ED xor ebp, ebp 0040100F |. 57 push edi 00401010 |. 8A06 mov al, byte ptr [esi] ; 取出用户名首字符 00401012 |. 3AC1 cmp al, cl ; 首字符是否相同? 00401014 |. 0F85 69010000 jnz 00401183 ; 不同则注册失败 0040101A |. 8BFE mov edi, esi 0040101C |. 83C9 FF or ecx, FFFFFFFF 0040101F |. 33C0 xor eax, eax 00401021 |. F2:AE repne scas byte ptr es:[edi] 00401023 |. F7D1 not ecx 00401025 |. 49 dec ecx ; 求用户名子串长度 00401026 |. 83F9 05 cmp ecx, 5 ; 长度低于5? 00401029 |. 0F82 54010000 jb 00401183 ; 低于则注册失败 0040102F |. 807B 01 2D cmp byte ptr [ebx+1], 2D ; 密钥第二个字符是-吗? 00401033 |. 0F85 4A010000 jnz 00401183 ; 不是则注册失败 00401039 |. 8BFE mov edi, esi 0040103B |. 83C9 FF or ecx, FFFFFFFF 0040103E |. 33C0 xor eax, eax 00401040 |. 33D2 xor edx, edx 00401042 |. F2:AE repne scas byte ptr es:[edi] 00401044 |. F7D1 not ecx 00401046 |. 49 dec ecx ; 求用户名子串长度 00401047 |. 74 17 je short 00401060 ; 并没有什么卵用的jump 00401049 |> 0FBE0C32 /movsx ecx, byte ptr [edx+esi] ; 循环迭代用户名字符串 0040104D |. 03E9 |add ebp, ecx ; 累加 0040104F |. 8BFE |mov edi, esi 00401051 |. 83C9 FF |or ecx, FFFFFFFF 00401054 |. 33C0 |xor eax, eax 00401056 |. 42 |inc edx ; 循环变量自增 00401057 |. F2:AE |repne scas byte ptr es:[edi] 00401059 |. F7D1 |not ecx 0040105B |. 49 |dec ecx ; 求用户名子串长度 0040105C |. 3BD1 |cmp edx, ecx ; 是否迭代完毕? 0040105E |.^ 72 E9 \jb short 00401049 00401060 |> 81C5 64600000 add ebp, 6064 ; 累加结果加上0x6064 00401066 |. 55 push ebp 00401067 |. 68 34604000 push 00406034 ; ASCII "%lu" 0040106C |. 68 306B4000 push 00406B30 ; ASCII "25215" 00401071 |. E8 B6030000 call 0040142C ; 将数值转换成 对应的无符号长整形 ”字符串“ 00401076 |. 8A16 mov dl, byte ptr [esi] ; 取出用户名首字符 00401078 |. 8BFE mov edi, esi 0040107A |. 83C9 FF or ecx, FFFFFFFF 0040107D |. 33C0 xor eax, eax 0040107F |. 8815 446B4000 mov byte ptr [406B44], dl ; 保存用户名首字符 00401085 |. C605 456B4000>mov byte ptr [406B45], 2D ; 添上-字符 0040108C |. F2:AE repne scas byte ptr es:[edi] 0040108E |. F7D1 not ecx 00401090 |. 49 dec ecx ; 求用户名子串长度 00401091 |. 0FBE4431 FF movsx eax, byte ptr [ecx+esi-1] ; 取用户名子串尾字符 00401096 |. 50 push eax ; 入栈 00401097 |. E8 C4020000 call 00401360 ; 小写转大写 0040109C |. A2 466B4000 mov byte ptr [406B46], al ; 添入大写字符 004010A1 |. BF 306B4000 mov edi, 00406B30 ; ASCII "25215" 004010A6 |. 83C9 FF or ecx, FFFFFFFF 004010A9 |. 33C0 xor eax, eax 004010AB |. F2:AE repne scas byte ptr es:[edi] 004010AD |. F7D1 not ecx 004010AF |. 2BF9 sub edi, ecx 004010B1 |. 81C5 64600000 add ebp, 6064 ; 循环结果再加上0x6064 004010B7 |. 8BF7 mov esi, edi 004010B9 |. 8BD1 mov edx, ecx 004010BB |. BF 446B4000 mov edi, 00406B44 ; ASCII "p-" 004010C0 |. 83C9 FF or ecx, FFFFFFFF 004010C3 |. F2:AE repne scas byte ptr es:[edi] 004010C5 |. 8BCA mov ecx, edx 004010C7 |. 4F dec edi 004010C8 |. C1E9 02 shr ecx, 2 ; 逻辑右边移动两位 004010CB |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] ; 添上长整形字符串1 004010CD |. 8BCA mov ecx, edx 004010CF |. 55 push ebp 004010D0 |. 83E1 03 and ecx, 3 004010D3 |. 68 34604000 push 00406034 ; ASCII "%lu" 004010D8 |. F3:A4 rep movs byte ptr es:[edi], byte ptr [esi] ; 添上长整形字符串2 004010DA |. BF 30604000 mov edi, 00406030 004010DF |. 83C9 FF or ecx, FFFFFFFF 004010E2 |. F2:AE repne scas byte ptr es:[edi] 004010E4 |. F7D1 not ecx 004010E6 |. 2BF9 sub edi, ecx 004010E8 |. 68 306B4000 push 00406B30 ; ASCII "25215" 004010ED |. 8BF7 mov esi, edi 004010EF |. 8BD1 mov edx, ecx 004010F1 |. BF 446B4000 mov edi, 00406B44 ; ASCII "p-" 004010F6 |. 83C9 FF or ecx, FFFFFFFF 004010F9 |. F2:AE repne scas byte ptr es:[edi] ; 求贴好的序列号子串长度 004010FB |. 8BCA mov ecx, edx 004010FD |. 4F dec edi 004010FE |. C1E9 02 shr ecx, 2 00401101 |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] 00401103 |. 8BCA mov ecx, edx 00401105 |. 83E1 03 and ecx, 3 00401108 |. F3:A4 rep movs byte ptr es:[edi], byte ptr [esi] 0040110A |. E8 1D030000 call 0040142C ; 将数值转换成 对应的无符号长整形 ”字符串“ 0040110F |. BF 306B4000 mov edi, 00406B30 ; ASCII "25215" 00401114 |. 83C9 FF or ecx, FFFFFFFF 00401117 |. 33C0 xor eax, eax 00401119 |. 83C4 1C add esp, 1C 0040111C |. F2:AE repne scas byte ptr es:[edi] 0040111E |. F7D1 not ecx 00401120 |. 2BF9 sub edi, ecx 00401122 |. 8BF7 mov esi, edi 00401124 |. 8BD1 mov edx, ecx 00401126 |. BF 446B4000 mov edi, 00406B44 ; ASCII "p-" 0040112B |. 83C9 FF or ecx, FFFFFFFF 0040112E |. F2:AE repne scas byte ptr es:[edi] 00401130 |. 8BCA mov ecx, edx 00401132 |. 4F dec edi 00401133 |. C1E9 02 shr ecx, 2 00401136 |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] ; 添上长整形字符串3 00401138 |. 8BCA mov ecx, edx 0040113A |. 8BC3 mov eax, ebx 0040113C |. 83E1 03 and ecx, 3 0040113F |. F3:A4 rep movs byte ptr es:[edi], byte ptr [esi] ; 添上长整形字符串4 00401141 |. BE 446B4000 mov esi, 00406B44 ; ASCII "p-" 00401146 |> 8A10 /mov dl, byte ptr [eax] ; 循环迭代密钥 00401148 |. 8A1E |mov bl, byte ptr [esi] ; 循环迭代序列号 0040114A |. 8ACA |mov cl, dl 0040114C |. 3AD3 |cmp dl, bl ; 是否相同? 0040114E |. 75 25 |jnz short 00401175 00401150 |. 84C9 |test cl, cl ; 是否为0? 00401152 |. 74 16 |je short 0040116A ; 是则结束循环 00401154 |. 8A50 01 |mov dl, byte ptr [eax+1] ; 循环迭代密钥 00401157 |. 8A5E 01 |mov bl, byte ptr [esi+1] ; 循环迭代序列号 0040115A |. 8ACA |mov cl, dl 0040115C |. 3AD3 |cmp dl, bl ; 是否相同? 0040115E |. 75 15 |jnz short 00401175 00401160 |. 83C0 02 |add eax, 2 00401163 |. 83C6 02 |add esi, 2 00401166 |. 84C9 |test cl, cl 00401168 |.^ 75 DC \jnz short 00401146 0040116A |> 33C0 xor eax, eax ; 清空eax 0040116C |. 33D2 xor edx, edx ; 清空edx 0040116E |. 85C0 test eax, eax 00401170 |. 0F94C2 sete dl ; dl为1 00401173 |. EB 12 jmp short 00401187 00401175 |> 1BC0 sbb eax, eax ; eax=ffffffff 00401177 |. 83D8 FF sbb eax, -1 0040117A |. 33D2 xor edx, edx 0040117C |. 85C0 test eax, eax 0040117E |. 0F94C2 sete dl ; dl为0 00401181 |. EB 04 jmp short 00401187 00401183 |> 8B5424 14 mov edx, dword ptr [esp+14] 00401187 |> B9 40000000 mov ecx, 40 0040118C |. 33C0 xor eax, eax 0040118E |. BF 446B4000 mov edi, 00406B44 ; ASCII "p-" 00401193 |. F3:AB rep stos dword ptr es:[edi] ; 清空序列号 00401195 |. 5F pop edi 00401196 |. 5E pop esi 00401197 |. 5D pop ebp 00401198 |. 8BC2 mov eax, edx ; eax取edx的值 0040119A |. 5B pop ebx 0040119B \. C3 retn
那么长的代码段实现的功能却是很简单,我们动手实现一下注册机。
我们直接打开之前搭建的框架,并修改OnBtnDecrypt函数如下:
void CKengen_TemplateDlg::OnBtnDecrypt() { // TODO: Add your control notification handler code here CString str; GetDlgItemText( IDC_EDIT_NAME,str ); //获取用户名字串基本信息。 int len = str.GetLength(); if ( len != 0 ){ //格式控制。 unsigned int sum = 0; for ( int i = 0 ; i != len ; i++ ) //循环累加 sum += str[i]; sum += 0x6064; //转化大小写 if ( (str[len-1] >= 0x61) && (str[len-1] <= 0x7A) ) str.SetAt( len-1,str[len-1] - 0x20 ); CString PassWord; PassWord.Format( "%c-%c%lu-%lu",str[0],str[len-1],sum,sum+0x6064 ); SetDlgItemText( IDC_EDIT_PASSWORD,PassWord ); } else MessageBox( "用户名格式错误!" ); }
再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("wind-vcrkme01_Keygen"));
运行效果:
![](http://images2015.cnblogs.com/blog/842655/201604/842655-20160413203007301-341463304.png)
相关文章推荐
- 关于项目中上传图片时图片尺寸和大小的判断问题
- S5PV210的SD卡启动详解2
- StringBuffer的常用方法与操作
- C语言入门之指针用法教程
- leetcode之Merge Sorted Array
- node版本的切换(转)
- RSA算法-java
- java 中的Exception RuntimeException 区别
- 微信支付--网页版-V3-(2)
- lightoj 1192 - Left Right Nim博弈
- hiho一下第一周#1032 : 最长回文子串
- 【HNOI模拟】 K小数查询
- Android实现横屏以及全屏的小技巧
- Android实现横屏以及全屏的小技巧
- 数据结构中八大排序算法
- 关于64位CentOS上ptrace报<linux/user.h> no such file 错误的解决方法
- bzoj 1008 [HNOI2008]越狱
- Spring Notes
- 12.NFS搭建配置
- 11.安装KVM虚拟机