Android安全:代码注入
一、常用的Smail注入代码
在逆向分析APK文件的时候,我们往往需要注入一些自己的代码方便调试,如增加调试Log信息等。常用的Smail注入代码如下:
1.增加调试Log信息:
Log.i("test","Log Test");
2.增加堆栈跟踪信息:
new Exception("print trace onCreate").printStackTrace();
3.增加MethodTracing信息:
Debug.startMethodTracing("qprojecttract");
Debug.stopMethodTracing();
二、增加调试Log信息
推荐大家先书写相应的Java语言逻辑代码,然后将其反编译拿到Smali指定代码,最后复制过去即可;
1.我们常在应用中使用Log方法输出日志(如网络请求参数、加密数据等),书写如下:
- Log.i("test","Log Test");
2.Smali语言描述如下:
- const-string v0, "Log Test"
- const-string v1, "test"
- invoke-static {v1, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
3.如在Activity的onCreate()方法中,调用super.onCreate()之后,注入Log.i("test","Log Test")代码如下:
- # virtual methods
- .method protected onCreate(Landroid/os/Bundle;)V
- .locals 2
- .param p1, "aSavedInstanceState" # Landroid/os/Bundle;
- .prologue
- .line 24
- invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
- //注入Log代码
- const-string v0, "Log Test"
- const-string v1, "test"
- invoke-static {v1, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
- .line 25
- sget v0, Lcom/qunar/hotel/R$layout;->activity_next:I
- invoke-virtual {p0, v0}, Lcom/qunar/hotel/NextActivity;->setContentView(I)V
- … …
- .end method
4.重新打包、签名APK,运行至页面Logcat输出如下:
三、栈跟踪法
栈跟踪同样属于代码注入的范畴,它主要是手动向反汇编后的smail文件中加入栈跟踪信息输出的代码。栈跟踪法只需要知道大概的代码注入点,而且注入代码后的反馈信息比Log注入要详细的多;
1.我们使用的栈跟踪信息(跟踪指定代码调用堆栈)代码如下:
- new Exception("print trace onCreate").printStackTrace();
2.Smali语言描述如下:
- new-instance v0, Ljava/lang/Exception;
- const-string v1, "print trace onCreate"
- invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
3.如在Toast显示提示处,注入栈跟踪代码,用于追踪Toast.show()调用的地方;
- .line 35
- iget-object v0, p0, Lcom/qunar/hotel/NextActivity$1;->this$0:Lcom/qunar/hotel/NextActivity;
- invoke-virtual {v0}, Lcom/qunar/hotel/NextActivity;->getApplication()Landroid/app/Application;
- move-result-object v0
- iget-object v1, p0, Lcom/qunar/hotel/NextActivity$1;->this$0:Lcom/qunar/hotel/NextActivity;
- invoke-virtual {v1}, Lcom/qunar/hotel/NextActivity;->getResources()Landroid/content/res/Resources;
- move-result-object v1
- sget v2, Lcom/qunar/hotel/R$string;->login_success:I
- invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
- move-result-object v1
- invoke-static {v0, v1, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
- move-result-object v0
- invoke-virtual {v0}, Landroid/widget/Toast;->show()V
- //注入Exception代码
- new-instance v0, Ljava/lang/Exception;
- const-string v1, "print trace Toast"
- invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
- invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V
- .line 40
- :goto_0
- return-void
4.修改完毕之后,重新打包并签名。安装apk运行Logcat输出如下,Toast.show()方法在NextActivty.onCreate()方法中调用:
四、使用MethodTracing
DDMS提供了MethodProfing功能,它的作用是在执行程序时记录下每个被调用的API名称,只需要查看API的调用序列即可知道这段代码的具体用途;
1.我们使用的MethodProfing代码(分析API调用序列)如下:
- Debug.startMethodTracing("qprojecttract");
- Debug.stopMethodTracing();
2.Smail语法如下:
- const-string v0, "qprojecttract"
- invoke-static {v0}, Landroid/os/Debug;->startMethodTracing(Ljava/lang/String;)V
- invoke-static {}, Landroid/os/Debug;->stopMethodTracing()V
3.在onCreate()方法中,加入跟踪代码(在AndroidManifest.xml中添加WRITE_EXTERNAL_STORAGE权限),分析setContentView()API的调用序列:
- # virtual methods
- .method protected onCreate(Landroid/os/Bundle;)V
- .locals 2
- .param p1, "aSavedInstanceState" # Landroid/os/Bundle;
- .prologue
- .line 23
- invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
- .line 24
- //注入startMethodTracing代码
- const-string v0, "qprojecttract2"
- invoke-static {v0}, Landroid/os/Debug;->startMethodTracing(Ljava/lang/String;)V
- sget v0, Lcom/qunar/hotel/R$layout;->activity_next:I
- invoke-virtual {p0, v0}, Lcom/qunar/hotel/NextActivity;->setContentView(I)V
- //注入endMethodTracing代码
- invoke-static {}, Landroid/os/Debug;->stopMethodTracing()V
- .line 26
- sget v0, Lcom/qunar/hotel/R$id;->user:I
- … …
- .endmethod
4.重新打包,签名apk,并安装运行相关追踪的代码,使用adb工具从设备的/sdcard目录,获取分析结果文件qprojecttract2.trace;
- pengchengxiang@ubuntu:~/QprojectWorkSpace/qproject/home/build/outputs/apk/home-release/dist$ adb pull /sdcard/qprojecttract2.trace ~/QprojectWorkSpace/qproject/
- captures/
- [100%] /sdcard/qprojecttract2.trace
5.打开Android Studio->Captures窗口,双击qprojecttract2.trace文件,查看分析结果:

浙公网安备 33010602011771号