本人刚学破解不久,看到看雪这么好的论坛~想进来学习更多的知识可惜没有邀请码。不多废话~0蛋级别看的破文,大牛就别看了。
1.打开VC新建一个win32程序 输入代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string code;
cout<<"密码:";
cin>>code;
if(code.size()>10)
cout<<"密码正确\n";
else
cout<<"密码错误\n";
system("pause");
}
2.生成exe
3.导入OD
4.查找字符串“密码正确”
5.00401620 > \55 push ebp ;在这F2下断点,然后F8一直走到不能走后输入假码,我这就输入“123456”
6.开始分析吧:
00401676 . 68 40CF4700 push 0047CF40
0040167B . E8 E4F9FFFF call 00401064
00401680 . 83C4 08 add esp, 8
00401683 . 8D4D E4 lea ecx, dword ptr [ebp-1C]
00401686 . E8 14FBFFFF call 0040119F
0040168B . 83F8 0A cmp eax, 0A ;
注意!这里是关键
0040168E . 76 14 jbe short 004016A4
00401690 . 68 30F04600 push 0046F030 ; 密码正确\n
00401695 . 68 B0CE4700 push 0047CEB0
0040169A . E8 2DFBFFFF call 004011CC
0040169F . 83C4 08 add esp, 8
004016A2 . EB 12 jmp short 004016B6
004016A4 > 68 24F04600 push 0046F024 ; 密码错误\n
我们停在这
0040168B . 83F8 0A cmp eax, 0A
看一下寄存器,红色那
00000006表示eax的值为6 //其实这个6就是我们输入假码的长度
继续看这
0040168B . 83F8 0A cmp eax, 0A
那OA是什么呢?打开计算器将0A转成10进制,显示值为10。
到这大家应该明白了吧?cmp是比较指令,也就是eax与OA比较,eax是6,OA是10
这样比较是干什么的呢?往下看。。。
0040168E . /76 14 jbe short 004016A4
这里的jbe是小于或等于则跳转的意思,它跳向的是失败。
到这大家应该明白了吧?cmp进行比较,如果eax比0A小于或等于的话,就通过jbe跳向失败。要想成功,就必须输入一个长度大于10的数
此教程献给我伟大的看雪妈妈。
BY:明次
第一次写破文,菜鸟级看的,写的不好请见谅。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)