-
-
[原创]新手练习破解
-
发表于:
2011-2-6 21:05
4856
-
最近结束了编程方面什么都想试一下的习惯,开始静下心来研究底层了,听从计算机专业一位老师的建议看看破解、调试有好处,于是猛看了几天破解,拿了一个练习题试了一下,熬了两天,基本也算完成了。。这个题可能很多人做过,但是我破解的时候完全不知道这道题,也算原创吧?呵呵
一、程序截图
输入用户名和密码没有反应
二、用PEID查看,没有加壳,现在我还只会用工具脱壳
三、放进OD
选择命令--查找--当前模块中的名称,如图
在GetDlgItemTextA上设下断点,设置了三个断点,按下F9让程序跑起来,输入futosky 123321,按下OK之后,断在下面这个地方
可以看到最后调用了MessageBoxA,往上找有几句
CALL r0YALaCC.00401141
CMP EAX,1
可见调用这里得进行比较并存入EAX最后结果,跟1比较,如果为1,则认证失败,如果用爆破,只需要将JNZ处改为NOP即可,如果要写注册机,看来得分析调用的函数了。
在CALL r0YALaCC.00401141按F2设下断点,取消其余几个断点,按F7跟进比较函数。如图:
后面就是一串痛苦的分析:
时间比较久了,放假前分析的,要是一步步再分析写下去,就得长篇大论了。
偷个懒不知道行不行:
当时记录的得到的结论:
1、将用户名进行运算得到结果A,再对A进行运算,得到注册码
2、序列号格式:*****-RAC
3、*****进行运算与用户名运算结果比较,*必须是A-Z的字母
4、用户名长度大于等于5且小于等于20
一开始还想,没学过算法啊,怎么办,后来发现只要将用户名运算结果倒着算回来就可以了,不必先对输入的注册码进行运算再比较用户名运算结果。
结果要用汇编进行运算,用C老计算不对,对比OD里的寄存器对比了很久,郁闷
注册机部分代码:
_asm
{
NOT temp
ROR temp,7
}
//第一步运算完毕
EBX=0;
///////////////生成KEY
char zifu[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
printf("%s","注册码:");
while(1)
{
if(temp%26==0)
{
temp=temp/26;
}
else
{
printf("%c",zifu[temp%26]);
temp-=temp%26;
}
if(temp<=0)
break;
}
printf("%s\n","-RAC");
PS: ROR temp,7
这里算是个BUG吧,因为用变量代替7老是编译不过,我的汇编也不好。后来因为考试就到这里了,不知道能不能得个邀请码,呵呵,没啥技术含量,得不到也没关系,啥时候自己的驱动学的好了,再给大家贡献自己的一份力量,加油!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)