同样用三个方法破解某双重验证(网络验证+注册表重启)
本帖最后由 520Kelly 于 2016-6-18 00:04 编辑本教程由热情洋溢的木木不哭赞助播出(“哎呀我摔倒了要漂亮姐姐亲亲才能起来{:5_187:}”)
逆向前言:
同样是一个非常简单的重启验证,但是我们要有多个思路去分析,不要觉得软件简单,有可能你会发现一些不一样的东西,,,这个过程是值得高兴的
所以新手在学习的过程中,我们强调的不是一味地问别人要思路,是要自己去思考,,别人的思路也是想出来的,为什么你就不能动手去看看去想想呢?连手都不想动,
那你逆向这个程序还有那份成就感吗?
逆向分析:
这个程序我是从某资源站拿出来的,也是一个新手通过搜索字符串逆向出来的,而我不用这个方法,为什么?同样的思路玩两遍就没有意思了,,,
所以我拿到程序,直接搜字符串,我搜的字符串不是注册成功也不是注册失败,而是这个
这是一段功能代码,其实也跟注册成功和注册失败一样,所以这个程序假设功能不是很多,也可以进行功能爆破,这样注册不注册成功就没多大实际意义了,这里我略提一下
然后我们又发现一个地址常量
01208A1B 393D 60992801 cmp dword ptr , edi
01208A21 75 59 jnz short 01208A7C
之前那篇帖子我已经说过了重启验证要特别关注这种地址常量,所以我们直接查赋值这个地址常量的值的代码,右键--查找参考-地址常量
对于所有mov语句,全部下断点,然后我们重启运行即可
方法1:赋值法
通过上述操作,我们重新运行以后,会发现程序断在这么一个地方
此时eax的值为0,所以我们直接改1,尝试一下,注意我这里的用词是尝试,不懂为什么我要改1的同学不要再问为什么了,
因为逆向不可能一击必中,什么叫分析?就是一步一步猜测,那叫分析,,所以这里我们直接改1,运行以后发现,程序是注册成功的
这时候,我们可以再去看注册成功字符串所在的代码
这里这个比较很明显就看得出,是比较这个地址常量的值是否为0,jnz代表如果为0则不跳,如果非0,则跳
所以这个方法我们就成功了,接下来我们进行第二个方法
方法2:注册表赋值
通过刚才的注册成功,我直接把软件删除了,为什么?因为我想要知道他把注册码放到什么地方了,所以如果他把注册码放在程序本身的目录下,我删除了等我再安装是未注册的
但是很可惜我这样做并没有改变我刚刚已经注册成功的结果,所以我直接猜测是注册表验证,这时候我就要去找他到底放到了哪里
通过刚才的地址常量的下断,我把所有的跟这个地址常量的代码都下了断,发现我点注册以后会断在这里,根据经验这里应该是写入注册码的地方
所以这里应该也是判断软件注册的地方,上面那张注册成功与注册失败的图,我们如果去改那个跳,那么我们也许会注册成功,但是我们每次启动软件都要注册,这样很麻烦的
但是这里不一样,这里虽然也是判断注册成功与否的地方,这里是会直接把值写入注册表,我们一开始的方法,是改了读取注册表判断是否注册成功,这里是直接把注册信息写入注册表
所以跟我们上面的方法并不冲突,可以理解为,一个是判断注册码是否存在,一个是写入正确的注册码,,,
所以我们跟入01202BC7 E8 195E0300 call 012389E5
直接跟踪出了这些信息,那就足够了
直接找到这些,发现跟我前篇帖子的软件是一模一样,注册成功就写入值为1,所以我们直接打开记事本,添加下列信息
Windows Registry Editor Version 5.00
"code"=dword:00000001
保存以后把文件名改成xx.reg 双击导入注册表即可完成注册
方法3:网络验证返回值Patch
看到这个网址,我便在段首下了一个断,一开始我以为是本地验证,但是当我经过这段代码的时候,发现了他是把我的注册码放到一个链接当中
ecx=005FBF68, (ASCII "http://con3.gook8.com/3.asp?password=520Kelly")
我直接用浏览器访问这段连接,发现返回值是error,这时候我在猜测如果这个注册码正确的话,是不是返回success
经过试验,发现并不是这样,然后我又怀疑
01202B7C B9 98912701 mov ecx, 01279198 ; b2D45534CC3E7B8B1B7715713BC2E039
这个字符串是不是明的注册码,注册了一边发现还是不对,所以我跟踪了这个网络验证返回call,发现
这里我的注册码为520Kelly
第二张图eax的值为7,就是20Kelly
第三张图是比较ecx的数据,为62 也就是字母b,而eax的值为0
所以我猜测如果他的返回数据是这串神秘的字符串呢
于是我把error改成这段字符串
在这里断下,此时edi的值刚好是error 直接替换成我们这串神秘的字符串
跑下去以后发现神奇地相等了
接下来的就是01202BAA /75 22 jnz short 01202BCE 跳转不实现,完美写入注册表的值
那么如上我们分析,这个程序首先是把注册码放到链接上,由作者的服务器给出返回值,再与程序中正确的返回值做比较,如果相等就在注册表里面写入值1就完成注册
至此我们PJ完成,,,写这个教程写了快两个小时了,感觉这篇帖子才应该真正的加个精华才对!
做个总结:逆向的路还长,总是想着靠别人还不如自己动手,一个简单的程序玩出不一样的花样才有趣,善于去发现,善于去探索,,,
楼下BGM走一波? 没有BGM,格盘师傅 每个程序都被你完的这么惨,赞一个。。哈哈哈 9倒了,6转了360°{:6_208:} 精彩,详细,楼主大牛膜拜一下,让我学到了不少东西 感谢分享..... 还以为多叼 还不是靠字符串 学习了。 跟着大牛来学一招,谢谢大牛分享哈