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;->(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;->(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文件,查看分析结果: 
图像

新技术,新未来!欢迎大家关注 “1024工场”微信服务号 ,时刻关注我们的最新的技术讯息! (甭客气!尽情的扫描或者长按!)

你可能感兴趣的:(Android安全,Android安全)