【S03E02】Shark恒 零基础破解教程之图文!【多处调用】
S03E01帖子,我真的没有想到会有将近200人加分,大家对我的热捧,让我受宠若惊啊!我会用实际行动来感谢大家对我的支持,让新手走更远,让我们的逆向队伍更强大!
这次我们要讲到的内容是关键CALL被多处调用的问题。
我们先看下图,这个程序点击按钮时,他会判断条件,条件不符合的话,标题不会变动。
你是不是会问,什么条件?其实这是我写程序的时候随便写的一个条件。
这个条件模拟了软件的验证项,验证软件是否为已注册,也就是点击按钮,会进行验证。这种多处调用验证的方式在非常多的软件中都运用到了,这一课,我们就讲解这种验证的分析方法。
下图为点击“原创发布区”按钮时,标题没有任何变动。
其实这个软件是可以通过很多方法进行逆向的,看过我第一季和第二季的朋友,都会拿出不同的方法进行逆向。
比如说查找字符串,E-debug,等等方法都可以达到逆向。
但是今天我们学的技术,是全新的!大家不要跑题哈。
如果我们使用以前的方法进行逆向,肯定是在下图跳转的位置NOP掉,对吗?
但是这个软件需要NOP的地方有6处,如果另外一个软件需要NOP的地方有1000处呢?会不会累死?
所以,今天我们要寻找的是他的关键CALL,在我们前两季也提到过关键CALL的问题,这一次,我们就要利用到他了。
我们看下图,60%零基础的朋友,会认为下图红色圈圈内的CALL就是关键CALL,因为他距离关键跳最近,其实不对。
因为红色圈圈内的CALL上面有一个跳转,是可以跳过这个CALL的,你见过关键CALL是可以跳过的吗?不可能!
那红色圈圈内的CALL肯定不是关键CALL,所以我们认定,绿色圈圈内的CALL,99%的可能性是关键CALL。
然后我们选中关键CALL,右键,跟随,就可以看到这个CALL里面的代码了。如下图操作。
看下图,目前选中的行,就是段首,段首就是这个关键CALL的第一行。
然后看下面的本地调用来自 xxxxxx,有6个地址,因为我们的程序有6处调用了这个CALL来验证。
(选中第一行的情况下,下面才能显示本地调用,否则是看不到的。)
也就是说,如果你用以前的方法逆向,那你就需要改6处的跳转NOP,
如果软件有1000处调用,那你就需要改1000处的跳转NOP,如果有10000处呢?难道你要去修改10000处???
今天我们学习的内容,就是修改1处,达到1000处被修改的效果!
我们在断尾的RETN处设置断点,然后运行程序,点击任意一个按钮,程序就会断在下图位置。
因为按钮会调用这个CALL进行验证,我们又在这个CALL的断尾处下了断点,所以点击按钮后会断在这里。
看下图是还要注意箭头方面,EAX=0,这是一个非常致命的赋值。
就像我们上一课讲到的内容一样,1代表真,0代表假,关键CALL复制了0给EAX,那就是验证为假!!
既然这个CALL通过计算后,最终的目的就是给EAX赋值,0代表假,1代表真。
那我们需要做的就是直接给EAX赋值1,然后退出这个CALL,也就是我们需要修改关键CALL内的代码。
该怎么做的?看下图!这是第二季汇编课程的内容,MOV就起到了赋值的作用,不明白的回看第二季。
在关键 CALL的段首,也就是进CALL后第一行代码进行修改。修改为MOV EAX,1 的意思,就是把1给EAX,然后EAX就变成了1了,而不是刚才的0
好,现在CPU执行到这个CALL就会直接给EAX赋值为1,然后我们就不需要这个CALL干其他事了。
我们只需要让这个CALL把1给EAX,然后出去就OK了。然后我们再输入retn 4达到退出这个CALL的效果。
有人可能会问,有的是retn,有的是 retn 4,有的是retn 8,这里为什么用 retn 4?
请看下图,因为这个CALL本身就是retn 4,所以就必须用retn 4 否则会出错。
OK,那接下来的事情就是保存修改了。
修改后怎么保存?如果有这个疑问,回看第一季第一集。
然后我们打开程序,点击任意按钮,看看是不是修改关键CALL可以解决6个按钮的限制?
如果已经解决了,请大家记住这种方法,关键CALL很重要。
即便软件有一万处需要逆向,只要找到关键CALL,修改一处就等于修改一万处!
敢不敢把你修改后的程序贴出来给大家看看?我给你加分哦~
搜索字符串找不到啊,关键CALL下面的那个CALL都找不到呢。
学习了,感谢
搞定了。提示吾爱汇编论坛就到www.xuepojie.com 当前按钮是 原创发布区。其他的都提示的不一样。有的是以检测到论坛!
额(⊙o⊙)…看不懂,还是学习第一课吧
谢谢老师的教程,我会不断努力的
非常谢谢,很不错!!!!!!!!
学习了,......
学习了,谢谢