危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18982417

对SDemo动画的终极破解

最近从危险漫步从网上下了一些教程,全是用SDemo录制的,而且有的还加了密码,心里有些不爽,于是便产生了破解的想法。不过单纯的破解不过瘾,危险漫步这次还要做3个补丁,分别是文件补丁、内存补丁和内存读取密码补丁。

打开动画,随便输入一个密码试探一下,程序弹出个消息框,提示说密码错误。既然有错误提示,那我们用OD的字符串查找工具即可,或者下消息框函数断点也行(在命令行输入“BpMessageBoxA”)。用OD载人程序,点击菜单“插件”-“超级字符串参考”,找到“PasswordWiong!”。双击它,即可跳到调用它的地方,到了调用它的地方后,我们往前看看。

这里就是破解的切入点,粗略地看了下,发现了经典的比较语句,在00402005处下断点。F9运行程序,随便输入一个密码,程序断下在玩吗刚刚下的断点上。F8单步步过,我们在经过转移语句的时候要分外注意,步过之前先看看它是跳向哪里的,如果不是跳向失败,那就让它跳。

那要怎么判断它是否跳向失败呢?跳向失败一般可分为两类,一种是弹出错误提示,二是直接退出程序或无反应。不过除了这两类,还有一些特殊的,例如下个注册失败标志位等等,就不多说了。F8走到00401FF9遇到了个转移语句(JE00402056),来看看它跳向哪里。这里程序调用了SDemo自己的函数OnOK,从字面上看,貌似是成功的意思,凭直觉认为是开始播放,那就让它跳,试试看。把JE改为JMP,F9运行,果然成功播放了。

我们再回到刚刚的地方去看看。在转移语句前有一句判rXx是否为零的语句,综合修改后的反应,我们可以得出结论,这里的判断语句是用来判断动画是否加了密码,没有则直接播放。现在我们已经发现了一处爆破点,但这并不是我们的最终目标。

上面的语句已经判断完动画是否有密码,那程序下面会做应该就是取出加密后的密码,并对其解密,再与我们输入的密码对比。我们继续单步步过,现在我们应该注意堆栈窗口的变化,看看能不能发现我们输入的假密码。还有就是要注意Call语句,但不是所以的Call语句都要注意,只需要注意形如(all xx。address cxX代表我们调试的程序)的就行了,这样的代码是用于执行程序内部的一段代码的,因为这很有可能就是算法的入口。

单步步过到00402025处,一直没有在堆栈窗口看到我们输入的假密码,倒是看到了一些奠名其妙的东西,有点像加密过的东西。刚才我们已经知道,我们应该在注意堆栈信息时,还需要注意Call语句a于是我们在0040202s处停下,F2下断点,再F7单步步人。这里就是算法了,由于我们的目的不是分析算法,所以这些代码都可以不看,一直F8步过,步过时注意堆栈信息。

在步过的同时,我们看到了许多莫名其妙的字符串,不过我们都可以不用管它,或者我们可以干脆直接步过这个算法。我们出了算法,马上就看见了经典的比较语句。我们现在不用着急往下走,我们刚从算法出来,难道算祛就没有算出什么东西吗?这不,我们抬头一看,就在堆栈信息中发现了“123”。这就是真正的密码了(嘿嘿,我自己设的,我还不知道!)。好了,我们继续往下走。

在步过经典的比较语匀的时候,我们在S2处,可以看到我们输入的假密码——“”,因为我没有输入任何东西,所以这里显示就是为空了。我们在API文档中可以查到关予这个比较语句的相关信息。这个语句的功能就是比较我们给它的两个数据,是否相同,然后修改标志位EAX来表示结果。若EAX为1,则表示两个数据不一样;若为0,则表示一样。

这时我们只需要将EAX改为0就行了,但这只是一个权宜之计。我们不可能每次都用OD来修改标志位,所以我们可以将比较语句(这里说的是“TEST EAX,EAX”)中的EAX,改为其他的存储器。我们可以用ESP,它绝对不会为零,因为在这比较语句前有一句“ADD ESP,20”,这是给ESP加上20的意思。或许我们可以将跳转语句中(JE00402056)的JE改为绝对跳(JMP)。

现在我们就有三处爆破点了,我们可以任选一处来做补丁。我这里选择的是判断是否有密码的那处,打开KeyMake,我们选择内存补丁。弹出一个窗口,让我们填写这个内存补丁的相关信息。我们在程序名称处选择我们的动画文件,接下来的两项就可填可不填。我们接下了点击“添加”按钮,添加我们要修改的相关信息。

修改地址我们选择的爆破点的地址,修改长度要依据我们选择的爆破点要修该多少指令来填写,我们这里的三个爆破点都只需要改一个指令,那我们填写lat可以了。原始指令处可不是填写什么nJEXXX”的,而是填写爆破点对应的十六进制代码,以我选择的爆破点为例。我们需要注意的地方,我都给圈起来了。我选择的这处爆破点,只需修改JE为JMP就行,JE对应的十六进制码是74,那我们就在原始指令处写上74。我们在OD中把JE改为JMP,十六进制码变为EB。那我们就在修改指令处填上EB。全部填写完毕后,我们按下“生成”按钮即可。不过要注意的时,我们的内存补丁一定要和欲破解的动画文件放在同一目录下。

接下来,我们来做文件补丁。这个就简单的多了,我们在OD只要任选一处爆破点来修改,之后另存为即可。打开制作文件补丁的窗口。相关的个人信息就自己发挥吧,我们只需要在选原始的文件选择未破解的文件,再在已破解的处选择我们刚刚修改过的文件,

最后按下制作就可以了。

最后我们来制作密码读取器,这个可以从内存中直接读出密码来,这个当然要在密码出现的前提下喽:既然前提是密码要出现在内存里,那我们就只能在算法之后读取密码了。打开内存注册机,载入我们的动画文件,在点击“用户信息”按钮填上一些信息,再点击“添加”按钮,中断地址只要选择算法之后的就行,我选择的是0040202Ar.,-但也不是只要算法之后的就行,还有一个条件,就是要在比较语句(TEST EAX,EAX)之前,因为这里会将EAX改为0或l,这样就读不出真正的密码了。至于中断次数我们填1就可以了,第一字节我们只要

填写,我们选择的地方的十六进制码,不过只需要填两位就行了。指令长度我们填个5就行了,再勾选上“保存下列信息为注册码”。接着选择“内存方式”,然后勾选上存储器,选择“EAX”,。最后点击“生成”按钮就可以了。

至此,我们不仅破解了SDemo,而且还做了关于它的三个补丁——文件补丁、内存补丁和密码读取器,这可真算的上是终极破解了!

相关推荐