一、常用的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工场”微信服务号
,时刻关注我们的最新的技术讯息!
(甭客气!尽情的扫描或者长按!)