前言
成功第二天继续做这个,一会把写的python项目也发博客吧,这样一天发两个博客。继续努力。
正文
几种方法的开头都一样,就一起说了。
首先,拖进Exeinfo查查,没壳,用VB写的。
直接拖进OD,搜一下错误字符串
直接来到程序处。就这里关键。从这里方法开始分支。
暴力1
和上一个一样,往上找找,有两个跳转,第一个跳转跳过第二个跳转,而第二个无条件跳转会跳过错误信息。
所以我们把上面那个跳转改了,让它没法跳过这个跳转,错误信息自然跳过。OK
暴力2
这次不nop掉第一个跳转,我们在往上看,这个条件肯定是由某个函数出来的结果,
可以确定是这个函数的结果,在这下个断点,重新运行。第二次跟进这个函数。
F8单步,遇到跳转不管,遇到函数我们跟进,渐渐的,我们能在右边的寄存器窗口看到我们输入的key(我这里输入的1111111),他下面还有一个字符串,有理由相信,应该是用来比较的字符串。
重新运行,将key值改成这个,成了。
分析算法
由上一步我们可以知道,他会将我们输入的key与一个正确的字符串相比较,那么这个字符串是固定的吗,我们换个name试试。
可以看到,name换了后,key值不一样了,所以我们猜测,这个key是由name动态生成的。
从刚才那个比较函数往上找,可以发现有个地方取了name,从这里开始,对name进行了处理,
再往下找,发现一个循环,在循环里看,有三个函数比较关键,第一个函数,从name里取一个字符,第二个将字符转化为ASCII码,第三个函数将转化出来的ASCII码加起来,整个循环一起实现了将name的每个字母取出相加的功能。
跳出循环以后,该函数将上面的和与0x499623D2相乘。
该函数,将上面乘积的第4个字符换成“-”,
该函数,将乘积的第九个字符换成“-”,
以上就是全部的算法。
注册机
继续用python写,也不要图形界面了(我好懒)
s='zxzzxy'
m=0
for i in s:
m+=ord(i)
m=m*0x499602D2
str_m=list(str(m))
str_m[3]='-'
str_m[8]='-'
str_m="".join(str_m)
print(str_m)