zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android安全:代码注入

2023-09-14 09:16:10 时间

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