• Andriod逆向学习笔记


    本文涉及到的所有内容均来自互联网或者书籍。禁止用于其他任何商业,非商业/不正当用途.

    1.准备

    android sdk,java是必须的。另准备apktool和jd-gui。见这篇blog

    将apktool所在的目录加到环境变量

     

    2.先来一个简单的,修改跳转逻辑。

    先写个sample,第一个activity界面上一个输入框,一个按钮,输入“zuoshu”时点击按钮会跳转到第二个activity.输入其他内容则finish().



    将编译出来的apk放到d:hackInject.apk,命令行下 

    cd d:hack

    apktool d -f Inject.apk

    会生成d:hackInject目录

    java中跳转的逻辑部分是如下写的,MainActivity.java

    Java代码  收藏代码
    1. Button go = (Button) findViewById(R.id.go);  
    2. go.setOnClickListener(new OnClickListener() {  
    3.   
    4.     @Override  
    5.     public void onClick(View v) {  
    6.         String str = text.getText().toString();  
    7.         if (str.equals("zuoshu")) {  
    8.             goSecond();  
    9.         } else {  
    10.             MainActivity.this.finish();  
    11.         }  
    12.     }  
    13. });  

      看到Inject目录下有MainActivity.smali和MainActivity$1.smali两个文件,后面一个才是匿名OnClickListener的代码。onClick部分如下

    Java代码  收藏代码
    1. # virtual methods  
    2. .method public onClick(Landroid/view/View;)V  
    3.     .locals 2  
    4.     .parameter "v"  
    5.   
    6.     .prologue  
    7.     .line 24  
    8.     iget-object v1, p0, Lcom/example/injectactivtytest/MainActivity$1;->val$text:Landroid/widget/EditText;  
    9.   
    10.     invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;  
    11.   
    12.     move-result-object v1  
    13.   
    14.     invoke-interface {v1}, Landroid/text/Editable;->toString()Ljava/lang/String;  
    15.   
    16.     move-result-object v0  
    17.   
    18.     .line 25  
    19.     .local v0, str:Ljava/lang/String;  
    20.     const-string v1, "zuoshu"  
    21.   
    22.     invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z  
    23.   
    24.     move-result v1  
    25.     #hack here  
    26.     if-eqz v1, :cond_0  
    27.   
    28.     .line 26  
    29.     iget-object v1, p0, Lcom/example/injectactivtytest/MainActivity$1;->this$0:Lcom/example/injectactivtytest/MainActivity;  
    30.   
    31.     #calls: Lcom/example/injectactivtytest/MainActivity;->goSecond()V  
    32.     invoke-static {v1}, Lcom/example/injectactivtytest/MainActivity;->access$0(Lcom/example/injectactivtytest/MainActivity;)V  
    33.   
    34.     .line 30  
    35.     :goto_0  
    36.     return-void  
    37.   
    38.     .line 28  
    39.     :cond_0  
    40.     iget-object v1, p0, Lcom/example/injectactivtytest/MainActivity$1;->this$0:Lcom/example/injectactivtytest/MainActivity;  
    41.   
    42.     invoke-virtual {v1}, Lcom/example/injectactivtytest/MainActivity;->finish()V  
    43.   
    44.     goto :goto_0  
    45. .end method  

    smali是dalvik字节码文件,详细的说明在android源码的dalvikvmmterpc目录下 

    在25行用#hach here标出的地方为跳转判断。"if-eqz v1, :cond_0"意思是如果v1为0,则跳转到":cond_0"处。改为"if-nez v1, :cond_0",不为0则跳转。代码的改动就完了,接下来编译回apk。

    先准备个签名文件sign.keystore放到Inject目录下,参考这里.

    cd d:hackInject

    apktool b

    在会生成一个目录dist,里面有个InjectTest.apk

    jarsigner -verbose -keystore aeo_android.keystore -signedjar distInjectTest_signed.apk distInjectTest.apk

    完了安装distInjectTest.apk即可。输入“zuoshu”的时候不会跳转,输入其他内容时会跳转。

    还可以做些其他修改,比如修改原来是跳转到SecondActivity,可以修改为跳转到ThirdActivity之类的。

     

    3.来点高级的,把自己的代码注入到目标程序

    思路就是先写个Service,在目标程序启动的时候,在oncreate里加入startservice的代码。为什么不是activity?service是后台运行的。

    建立一个Target project,内容是显示helloworld。要做的事情有三个

    1>写一个HackService。另建一个Hack project。Service代码如下

    Java代码  收藏代码
    1. public class HackService extends Service {  
    2.   
    3.     @Override  
    4.     public void onStart(Intent intent, int startId) {  
    5.         super.onStart(intent, startId);  
    6.         Toast.makeText(this, "this is a hack app", Toast.LENGTH_SHORT).show();  
    7.     }  
    8.   
    9.     @Override  
    10.     public IBinder onBind(Intent intent) {  
    11.         return null;  
    12.     }  
    13.   
    14. }  

     启动service的话,会显示"this is a hack app".

    xml文件配置

    Java代码  收藏代码
    1. <service android:name="com.example.servicetest.HackService" >  
    2.     <intent-filter>  
    3.         <action android:name="com.oneguy.startservice" />  
    4.     </intent-filter>  
    5. </service>  

    另外在MainActivity加入如下启动代码,目的是为了获得启动Service的字节码。

    Java代码  收藏代码
    1. Intent i = new Intent("com.oneguy.startservice");  
    2. startService(i);  

    2>将启动Service的字节码加到Target.apk反编译后的字节码内

    a.反编译Hack.apk放在Hack目录,反编译Target.apk放在Target目录。

    b.将Hacksmali目录下的HackService.smali拷贝到Targetsmali目录下,这是Service的字节码。

    c.打开HacksmaliMainActivity.smali,拷贝启动Service的相关代码,到TargetsmaliMainActivity.smali中,大致内容如下

    Java代码  收藏代码
    1. #inject start  
    2. line 16  
    3. new-instance v0, Landroid/content/Intent;  
    4.   
    5. const-string v1, "com.oneguy.startservice"  
    6.   
    7. invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V  
    8.   
    9. .line 17  
    10. .local v0, i:Landroid/content/Intent;  
    11. invoke-virtual {p0, v0}, Lcom/oneguy/hack/MainActivity;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;  
    12. #inject end  

     d.将HackAndroidManifest.xml中Service相关的声明拷贝到TargetAndroidManifest.xml中。

    3>编译修改后的代码。重新签名即可。

    找了个app练手,费了点劲,大致效果如下


     

    4.防御

    有万无一失的防御方式么?只能说有办法可以加大hack的难度,一山更有一山高。

    作为开发者,大概有如下几个方法

    1>代码混淆。这个sdk里面自带工具,能大大提高hack的难度。

    2>程序md5自检。玩了一款国内的app,看到了类似代码,没细读,应该是启动时检查程序自身apk的md5,修改过的apk和未修改的apk md5是不一样的。这个检测确实有用,但是,直接将md5这段检测的逻辑hack掉也可以绕过。

    3>使用c++或者c#写代码,程序逻辑不在字节码内。这个对于大多数app来说有点不靠谱了。但是像cocos2d的游戏,或者Unity的游戏,基本上hack不了的。

    作为普通用户怎么办?

    1>安装官方app。修改过的app签名会和以前不一样,安装的时候会提示用户。并且一定看清楚程序所需要的权限。

    2>不要轻易root。没收root权限,是给手机的最后一道防御。我认为厂商们鼓吹发烧,个性,并且以"我家的手机能root,我们不做限制“为卖点是极不合适的。刷了root后,有新病毒来的时候,不要过多的指望安全厂商。好在现在病毒传播的途径是通过各个app市场向客户端传播,没有客户端之间的传播,如果像以前pc上邮件,pc,局域网都能传播的话,刷root等于是放病毒进来。

  • 相关阅读:
    标准C语言(9)
    标准C语言(8)
    标准C语言(7)
    标准C语言(6)
    标准C语言(5)
    标准C语言(4)
    标准C语言(3)
    标准C语言(1)
    Linux基础
    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
  • 原文地址:https://www.cnblogs.com/wsfjlagr/p/3850020.html
Copyright © 2020-2023  润新知