发新帖

Android逆向工程——建立程序修改思维

[复制链接]
11758 6
大家好,我是一个新人,新得不能再新的新人。许多话,我就不说太多了,直接进入主题。
大家都知道,随着时间过去,Android的软体也开始普及和强大,在逆向和反逆向这两块也是随着时间的推移,技术手段也是越来越强。
到目前为止,在最基础的爆破方面,已经出现了许许多多资料文献,而我今天写的,也跟前辈高人们一样,为一个目的做重复。
不过,我写的这篇,是想为跟我一样的新人提供一份直接简单的文章。
本文分为三块:初识程序、建立逻辑思维、多方式实现爆破。
一、初识程序。
程序,我们都见过,但是我这里举例的却不是正规的程序,而是我用VC++写的一个程序代码,目的是为了让新人了解程序。
#include<stdio.h>
void main()
{
        int number1,number2 = 0;                        //定义两个变量,并给第二个变量赋了初始值
        printf("请输入第一个数字:\n");                //输出显示“请输入第一个数字:”并换行
        scanf("%d",&number1);                                //输入一个数给变量number1
        if(number1>number2){                                //if条件语句,判断括号内的条件,即:number1是否大于number2
                printf("支付成功\n");                        //如果语句符合条件,则输出显示"支付成功"
        }else if(number1 == number2){                //如果前一条if语句不符合条件,则轮到这条语句继续判断括号内的条件,即:number1 == number2
                printf("支付取消\n");                        //如果语句符合条件,则输出显示"支付取消"
        }else{
                printf("支付失败\n");                        //如果前面的语句都不符合条件,则输出显示"支付失败"
        }
}

二、建立逻辑思维
从上面我提供的代码,就如同我们做爆破的思维是相似的。
假如我们要软体实现支付成功,实现爆破目的,那么我们此时能有几种办法?
显而易见,我们能做的有如下几种方法:
1、修改条件语句内的条件。
if(number1>number2){                               
printf("支付成功\n");

假如number1>number2,则支付成功,那么此时就表示我们已经付费了。
而number1 == number2或者number1<number2这两种情况都不在支付成功的范畴。
那么,我们把这一段原始程序改成:
if(number1==number2){                               
printf("支付成功\n");

或者
if(number1<number2){                               
printf("支付成功\n");

是不是就能代表,我们取消支付或者是离线支付失败的时候,照样能让软体实现支付成功的操作?
2、修改条件语句模块中的执行语句
        if(number1>number2){                                //if条件语句,判断括号内的条件,即:number1是否大于number2
                printf("支付成功\n");                        //如果语句符合条件,则输出显示"支付成功"
        }else if(number1 == number2){                //如果前一条if语句不符合条件,则轮到这条语句继续判断括号内的条件,即:number1 == number2
                printf("支付取消\n");                        //如果语句符合条件,则输出显示"支付取消"
        }else{
                printf("支付失败\n");                        //如果前面的语句都不符合条件,则输出显示"支付失败"

每一句if语句,都是在判断条件是否满足,满足之后所执行的内容,就是条件语句模块中的执行语句。
那么,在不改动条件语句的情况下,将执行语句全部更换成所要执行的语句,那么一样能实现直接爆破:
        if(number1>number2){                               
                printf("支付成功\n");                       
        }else if(number1 == number2){               
                printf("支付成功\n");                       
        }else{
                printf("支付成功\n");
因此,咱们在爆破的时候,方法其实还是很广的,只要看清看懂代码,然后充分去利用各种代码,就能把爆破多样化实现。

下面第三节就是以一款软件,实例操作。
三、多方式实现爆破
软件:计算机二级C语言掌上通
原软件地址:http://www.eoemarket.com/soft/232473.html
我们先安装软件,然后找付费失败之类的关键词。

此处我在激活码接收处随便输入一串数字,得到一个“许可号……”之类的词,而许可号三个字就是一个关键词,拿来搜索。
然后我们用Android Killer将软件进行反编译打开。

进到Android Killer界面,根据图内数字提示,搜索许可号这个关键词。
然后就定位出bq和q两个文件。
按照顺序,先进BQ查看,但是由于smile对于我们这样的新人来说,不利于直观查看,于是此软件很够意思的提供了转java源码查看的方式。


一目了然,只有一条判断语句,那么,只要使这个if语句的条件相反就行。但是这里,我准备用几种方式实现。
爆破方式一之GOTO强制跳转:

解析:强制跳转的作用就是,只要轮到执行强制跳转步骤,无论下面是什么代码,它一律跳到目标位置,从而直接跳过。就像此时,跳过了if判断语句,直接进入if语句内部的执行语句进行执行操作。
优点:在不懂如何去修改if语句的smile语法,那么可以直接进行强制跳跃。
爆破方式二之删除条件:

解析:既然语句是条件语句,那么,我不想让它判断,直接顺势执行,把if语句删除了,也是直接的方式。
优点:干脆直接操作,缺点,容易出问题。
爆破方式三之修改判断条件,这个爆破方式其实就不需要多说了,许多教程都是这种修改条件进行爆破处理。

下面,还剩下一个Q类,就留着给大家自己动手操作吧,道理都一样。

在许多教程里,都会用特征码去一带而过,本文的主旨,是让新人建立逻辑思维,知其然,亦知其所以然,不会用支付宝特征码9000,10进转16进这样的搜索方式进行解说。

好了,本次新人教程就到此为止。

最后说一句话:学逆向,先建立逻辑思维,从简单爆破到注册机,就像学编程,从最基础的hello world到各种算法。会了编程,有了一定基础,再去深入各种壳,各种加解密,因为这些都是跟机制,跟算法有关,也需要一定逻辑思维。而且还不那么直观,比如IDA,就要会一些汇编。那些动态调试,什么so文件。

致谢:逆向未来技术社区!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
已有2人评分 NB 荣获致谢 理由
越狱 + 1 很给力!
花墨 + 3 + 1 很给力!

查看全部评分 总评分: NB +3  荣获致谢 +2 

举报 使用道具

回复

精彩评论6

Mitjavaz    发表于 2015-8-9 00:59:07 | 显示全部楼层
先占沙发,明天准备把开罗游戏系列的百货商店其中一个功能的修改方式写出来,也欢迎大家提各种意见。
本新人在此谢谢了。

举报 使用道具

回复 支持 反对
花墨    发表于 2015-8-9 06:56:19 | 显示全部楼层
虽然基础,写得非常详细,加油!

举报 使用道具

回复 支持 反对
peterdocter    发表于 2015-8-10 10:01:56 | 显示全部楼层
不久又一个大牛将要诞生

举报 使用道具

回复 支持 反对
听鬼哥说故事    发表于 2015-8-10 10:02:52 | 显示全部楼层
很详细的基础文章,赞一个~

举报 使用道具

回复 支持 反对
越狱    发表于 2015-8-10 10:10:40 | 显示全部楼层
感谢分享

举报 使用道具

回复
gudantegong    发表于 2015-8-11 13:03:17 | 显示全部楼层
好 顶一下

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表