yyhd 发表于 2021-1-28 11:00

玩玩破解,写给新人看(第九集)

本帖最后由 yyhd 于 2021-10-16 00:20 编辑

第十一课继续让你尝到“成功”的味道


大家好,上集是完整的讲解了一次爆破的过程,相信绝大多数的朋友跟着做一遍会尝到初步“成功”的喜悦,如果说您还没有成功,别着急,您再仔细看一遍,应该就可以了,很可能是你忽略了一点小细节。
今天我们的敌人是第二种类型的软件。

有登录账号和密码,登录后找不到错误提示。

软件的名称:CM(有错误提示,OD搜索不到)

假定你现在是软件的作者,你听完了我前几节课,你就会知道如果你写的软件被破解者用OD分析,很轻松的查到“失败”或者“成功”这样的验证后结果的字符串,你的软件会非常不安全。所以,你的一个基本做法就是让别人用OD的字符串搜索引擎找不到关键字符串。于是,你用了一些不可告人的办法,结果,破解者在OD里真的找不到关键字符串了,破解的新手对于这样的软件就一脸懵逼了,没有办法只能放弃。


真的就放弃了吗?当然不,我们的兴趣就是要玩破解,看谁能玩过谁?

下面我们来具体分析一下,我们可以把找不到错误提示信息的软件分为两大类。


第一类是当我们点登陆后,我们明明看到错误提示,但是在OD里就是搜不到。
第二类是当我们点登陆后,没有任何提示,所谓“这里的黎明静悄悄”。

相比之下,第二类应该比第一类更难。

我们先分析第一类。首先思考一下,为什么软件在运行时明明有错误提示,但是我们的OD会看不到。我们刚才说了,这是因为编写软件者在编写读取关键字符串的代码上做了手脚,导致我们用OD搜不到。至于做了手脚,我们不用管它,现在摆在我们面前的就是一个现实——搜不到字符串,我们找不到破解的突破口。

现在我们用OD打开CM(有错误提示,OD搜不到)这个软件,然后你登录后,用搜索引擎进行搜索,找不到错误提示的字符串,见下图:




即使F9运行程序,转到00401000处,再搜,还是搜不到。
怎么办呢?

一种办法就是既然有提示字符串,我们就继续换方法搜。

我们现在用鼠标按一下下图中蓝色方框内的“M”按钮,M代表程序的内存空间。




然后我们按住红色箭头指的滑块拉到最上面。然后我们在这个页面鼠标右键选择“搜索”菜单,会出现下图:




然后在红色箭头指的位置,就是ASCII后面的方框内输入“登录失败”,点确定按钮,就会出现下图:




呵呵,在红色方框内,我们终于看到了梦中的情人“登录失败”。我们用记事本记一下“登录失败”这一行的地址00481DAF。

然后我们按一下OD页面上方的“C”按钮,见下图:




按完以后,我们就回到了最初的OD显示的代码窗口页面,“C”按钮代表CPU,因为我们的代码窗口也叫做CPU窗口。你再看看,在“C”旁边还有几个英文字符的按钮,这是OD给我们提供的快速在不同页面转换的按钮,比如你按一下“B”按钮,就会出现我们已经下过的所有断点,B就叫做断点窗口。

我们继续,按完“C”以后,你的OD可能会变成这样,见下图:




不是你刚打开OD的样子,你现在只需要在红色方框内也就是代码窗口内鼠标双击一下,就正常了。




然后你就在数据窗口用CTRL+G,然后在红色箭头位置输入我们刚才记下的地址00481BAF,点确定。来到下图:




然后你在红色箭头指的位置,也就是00481BAF右边的数据上用鼠标左键选中第一行,就是紫色部分,然后点鼠标右键选择“断点”菜单中的“内存访问”,这样我们就在00481BAF这个地址下了一个“内存断点”,这个断点的意思就是当我们的程序在执行过程中读取这个地址中的数据,程序就会暂停。我们想一想,00481BAF这个地址里存放的数据不就是“登录失败”字符串吗?我们的目的就是当程序执行中只要读取“登录失败”字符串就会暂停下来,此刻程序停留的位置就接近关键代码了。

好,我们继续,下完“内存断点”后,我们按F9让程序运行起来,然后输入登录账号和密码,点登陆,OD会立刻停下来,见下图:




红色箭头显示“暂停”,错误提示的信息框也没有出现,说明我们在程序读取存放“登录失败”的地址00481BAF的那一刻暂停了,因为读取以后才会把“登录失败”字符串显示在信息框里,所以此时信息框无法显示,换句话说,我们现在代码停留的位置应该是在验证CALL执行完和验证结果(错误信息框出现)之间。

接下来,我们首先要干的事情,就是在绿色箭头指的位置(也就是我们刚才下内存断点的位置)鼠标右键,选择里面的“删除内存断点”菜单,因为我们已经断下来了,不需要了。





然后按F8一句一句代码往下跟,不用做任何修改,返回上一层CALL,不同的编写语言以及作者编写代码的不同会导致返回的次数不同,我们这个软件返回了三层,所谓返回三层就是遇到了三次RETN,RETN后就会返回到上一级调用处。见下图:




返回三次后,我们的代码会执行到0040137A,这个时候就是关键位置了,你看上面有一个大跳转JMP可以跳过我们的停留位置,这就非常可疑了,在JMP下面还有一个跳转能够跳过来,我们可以猜测一下,如果JMP下面的跳转不实现,那么JMP就可以跳过我们现在的代码,而我们此刻的代码就是根据“登录失败”这个错误信息跟过来的,那么也就是说JMP很可能就会跳过“登录失败”这个错误信息,我们不就成功破解了吗?

我们先别着急,再看一下红色方框里的CALL,也就是我们代码停留的位置的上一句,这个CALL的作用是什么呢?呵呵,这个CALL的作用就是读取出我们的“登录失败”字符串。

我们再往下看绿色方框里的CALL,这个CALL的作用是什么呢?这个CALL的作用就是弹出登录失败这个信息框。

我们继续看,在红色方框内的CALL下面是不是有一个EAX,EAX的作用还记得吗?对,它里面存放的是上面CALL的返回值,也就是说此时的EAX里面存放着“登录失败”这个字符串,然后通过语句MOV ,EAX,把EAX的值转移到一个内存地址里以后使用。

现在你的脑子里对整个破解流程是不是变的更清晰些了?

下面的工作,就是把能够跳到JMP下面的那个跳转改成NOP,你就成功了,快试试看吧!

除了这个用内存断点搜字符串的方法,我们还可以怎么做呢?

我们这个软件,虽然常用的方法搜不到字符串,但是会有错误的提示框,那么我们就可以对MessageBoxA函数下断点进行破解。

再如果,我们的软件没有弹出错误信息框,我们又该怎么办?

鉴于本节课内容已经不少了,为了方便大家阅读和学习,我放到下一集来讲,谢谢大家的继续支持!

附件里是本集的练习软件。
如果您觉得我发的内容确实对您有所帮助,请麻烦您支持一个热心值,进行精神鼓励,也是我继续写下去的动力!

玩玩破解,写给新人看(第一集)
玩玩破解,写给新人看(第二集)
玩玩破解,写给新人看(第三集)
玩玩破解,写给新人看(第四集)
玩玩破解,写个新人看(第五集)
玩玩破解,写给新人看(第六集)
玩玩破解,写给新人看(第七集)
玩玩破解,写给新人看(第八集)
玩玩破解,写给新人看(第九集)
玩玩破解,写给新人看(第十集)
玩玩破解,写给新人看(第十一集)
玩玩破解,写给新人看(第十二集)
玩玩破解,写给新人看(阶段练习1)
玩玩破解,写给新人看(第十三集)
玩玩破解,写给新人看(第十四集)
玩玩破解,写给新人看(第十五集)
玩玩破解,写给新人看(第十六集)
玩玩破解,写给新人看(第十七集)
玩玩破解,写给新人看(第十八集)
玩玩破解,写给新人看(第十九集)
玩玩破解,写给新人看(第二十集)
玩玩破解,写给新人看(第二十一集)
玩玩破解,写给新人看(第二十二集)
玩玩破解,写给新人看(第二十三集)
玩玩破解,写给新人看(第二十四集)
闲谈如何破解软件?
玩玩破解——小白实战1,你也行!
玩玩破解——小白实战2,巧搜字符串
玩玩破解——小白实战3,易语言字符串比较通杀
玩玩破解——小白实战4,冰火两重天
对新人们学习《玩玩破解》系列教程的集中解答
玩玩破解—加点油,再前行!

FeiyuYip 发表于 2021-1-28 17:30

关于大跳转,想了好久,误以为有jmp下面还有一个跳转,实际上如果表述为”jmp上面还有一个大跳转跳到它下面“,这样可能会更加清楚一点,不致产生歧义。


https://www.52pojie.cn/thread-1360792-1-1.html,有网友@huangdc已经贴出了问题所在,对我等新手可能有帮助。

萧雪笙 发表于 2021-2-1 18:08

然后按F8一句一句代码往下跟,不用做任何修改,返回上一层CALL,不同的编写语言以及作者编写代码的不同会导致返回的次数不同,我们这个软件返回了三层,所谓返回三层就是遇到了三次RETN,RETN后就会返回到上一级调用处。见下图:

这里没有看懂有大佬再给讲讲么?F8跟到哪里开始返回上一层CALL,怎么返回上一层CALL

求指点!!!感谢

广海涉 发表于 2021-1-28 16:14

在m之后,搜索“登陆失败”后,弹出来这个弹窗,没有搜索出来,这是什么错误啊?

rinnzeng 发表于 2021-3-16 18:24

这篇重复练习了11遍,终于搞清楚了流程了,纯新手如果跟做一遍可能可以学样破解成功,但要真正理解为什么要这样做,每练一遍思考一次为什么要点这里,11遍后终于把这篇搞清楚了,感谢大佬保姆级教程。

皇帝陛下万岁 发表于 2021-2-24 11:41

xiaoqu525 发表于 2021-2-23 16:47
在摁F8得时候,那个exe软件要关掉么?鼠标放在00402366那里摁F8么

兄弟 基础有点差啊,嘚补课了
问题1:在摁F8得时候,那个exe软件要关掉么?
肯定不关掉啊,关掉了程序就结束了,OD是动态调试 也就是运行时调试,exe关掉了结束了就不能调试了呀。
问题2:鼠标放在00402366那里摁F8么
不是鼠标放在语句里,F8是运行下一条语句的意思,鼠标选择只是有代码的详细说明,并不表示让你代码运行到鼠标选择的地方。但是呢,你可以鼠标选择,然后再按一个F2,F2的意思是下断点。

建议多看两遍大神的教程

helc 发表于 2021-11-17 09:47

第九集!
第一个作业:CM(有错误提示,OD搜不到)
用OD打开,智能搜索,发现搜索不到错误提示。
一种方法:按工具栏的m按钮,进入程序的内存空间,在最上面搜索错误提示,会出现我们要的登陆失败的地址,记录下来,00481DAF。
回到代码窗口,再数据窗口中ctrl+g,搜索00481DAF,看到它的hex数据,B5 C7 C2 BC,这对应的是   “登录”。这里要注意的是可能搜索后没出现hex数据,要右键选择hex的hex/ASCII(16位)。
选中那个hex数据,右键设置内存访问。运行程序,输入账号和密码,代码停留在错误信息框出现之前,删除前面设置的内存断点。
然后f8单步运行,要返回三次retn,来到代码的关键位置,地址为0040137A。往上找到个jmp,它下面有个跳转,要nop掉它。因为我们是根据那个错误信息跟过来的,那么这个jmp很可能会跳过这个错误信息。这里要注意这个jmp没显示跳转的箭头,但看代码jmp 004013CC,而它自己是0040135A,是从0040135A跳到004013CC,而错误信息的地址是0040137A,很明显是跳过了的。所以如果这个jmp能实现,很有可能就成功了。
nop那个中间的跳转,复制保存。再次运行,提示登录成功!

还有另一种方法,比它简单多了。
还记得前面的API断点设置工具的MessageBoxA断点吗,设置它,然后运行,输入信息,来到堆栈区,发现登录失败的错误提示,找第一个返回,跟随它,来到代码区。
发现定位到的位置0040138A,就在第一种方法最后单步到的位置附近。往上也能找到那个jmp,和之前方法一样,nop掉中间的跳转,复制保存。再次运行,提示登录成功!

两种方法,第一种有些地方没理解,在于下了内存断点后的单步运行,什么时候才算是找到了关键位置?三次retn,为什么是三次呢?
而相比之下,第二种方法,前几集一直用的,很好理解。

不过这题的注意点还是jmp 004013CC,OD没把箭头标出来,容易以为往上跳了,其实它是能跳过错误信息的。

ckem 发表于 2021-10-3 02:58

xulei 发表于 2021-8-19 09:19
然后按F8一句一句代码往下跟,不用做任何修改,返回上一层CALL,不同的编写语言以及作者编写代码的不同会导 ...

这里我也看不懂.
大概是call 是调用子程式   断点在call 里面 retn 跳出结束call 跳出当前call

call3{ call2{   call1{    启动后断点前面停   (断点在这里)   }    第一次retn}第二次retn    } 第三次retncall3的外面

龙卷风三号 发表于 2021-3-2 22:28

凌天羽 发表于 2021-1-28 12:40
楼主,有一个疑问,就是这个按F8返回几次怎么,知道返回到指定地方了?有没有什么提示?不然一直按F8都 ...

F8执行到retn语句会返回到一个地址,但不是所有返回的地方都是call语句,如果你返回到的语句前一句是call才能说明你跳到上一级的call语句。然后我是试出来的第三个call可以。

凌天羽 发表于 2021-1-28 12:40

楼主,有一个疑问,就是这个按F8返回几次怎么,知道返回到指定地方了?有没有什么提示?不然一直按F8都不知道什么时候返回到了!

ma5635 发表于 2021-1-28 19:04

""接下来,我们首先要干的事情,就是在绿色箭头指的位置(也就是我们刚才下内存断点的位置)鼠标右键,选择里面的“删除内存断点”菜单,因为我们已经断下来了,不需要了,然后按F8一句一句代码往下跟,不用做任何修改,返回上一层CALL,不同的编写语言以及作者编写代码的不同会导致返回的次数不同,我们这个软件返回了三层,所谓返回三层就是遇到了三次RETN,RETN后就会返回到上一级调用处。"""
麻烦问下大佬,怎么判断具体有几层call呢?

刀大喵 发表于 2021-1-28 11:02

楼主教程一个不拉 赞。。。

yzmb8456 发表于 2021-1-28 11:04

谢谢楼主,继续追~

zhoushushu 发表于 2021-1-28 11:07

谢谢楼主,一个都不落的看下来了。

radarer 发表于 2021-1-28 11:08

非常感谢楼主老师的分享,一集不落的学习完了。

lishu44275 发表于 2021-1-28 11:14

请开足马力,继续.....

JetJerry 发表于 2021-1-28 11:15

感谢分享心得。点个赞{:1_921:}

heikexiaohei 发表于 2021-1-28 11:15

谢谢!已学习

adolph123 发表于 2021-1-28 11:16

感谢楼主,我会好好学习的!

mensun2003 发表于 2021-1-28 11:16

楼主,总共多少集呢?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 玩玩破解,写给新人看(第九集)