动态分析技巧
- 主流的动态分析框架除了提供一套完整、通用的动态分析方法,通常还具备高度的可配置特性与可扩展性,如添加自定义分析模块、增加指定的 API 分析等功能
- 但对一些应用,还有一些分析要点没有提供,这时就要分析人员动手解决这些问题
代码注入法
- 一个程序在发布时通常不会保留 Log 输出信息。若想观察程序特定位置的输出信息,在默认情况下,使用动态分析框架是做不到的,要手动进行代码注入
- 代码注入指先反编译 Android 程序,再在反汇编的 smali 文件中添加 Log 调用的代码,最后重新打包程序并运行,查看输出结果
- 实例:GitHub
- 本实例为一个注册码验证模拟程序,输入用户名和注册码后,点击“注册”按钮,程序会判断注册码是否正确,并弹出相应提示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/44a3865a20218354127ddb9292ddcdb3.jpeg)
- 现在要找出用户名“admin”的注册码
- 先看其反汇编代码。用 ApkTool 反编译(cmd:
apktool d app-release.apk -o out
,找到如下按钮点击事件处理代码
# virtual methods
.method public onClick(Landroid/view/View;)V
.locals 3
.line 34
iget-object p1, p0, Lcom/droider/checksn/MainActivity$1;->this$0:Lcom/droider/checksn/MainActivity;
invoke-static {p1}, Lcom/droider/checksn/MainActivity;->access$000(Lcom/droider/checksn/MainActivity;)Landroid/widget/EditText;
move-result-object p1 # 用户名文本控件
invoke-virtual {p1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
move-result-object p1 # 获取用户名文本框内容
invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object p1 # 转为 String
invoke-virtual {p1}, Ljava/lang/String;->trim()Ljava/lang/String;
move-result-object p1 # 去掉用户名中的空格
.line 35
iget-object v0, p0, Lcom/droider/checksn/MainActivity$1;->this$0:Lcom/droider/checksn/MainActivity;
invoke-static {v0}, Lcom/droider/checksn/MainActivity;->access$100(Lcom/droider/checksn/MainActivity;)Landroid/widget/EditText;
move-result-object v0 # 注册码文本控件
invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
move-result-object v0 # 获取注册码文本框内容
invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0 # 转为 String
invoke-virtual {v0}, Ljava/lang/String;->trim()Ljava/lang/String;
move-result-object v0 # 去掉注册码中的空格
.line 36
invoke-virtual {p1}, Ljava/lang/String;->length()I
move-result v1 # 获取用户名长度
const/4 v2, 0x0
if-eqz v1, :cond_2 # 若用户名长度为 0,则跳转到弹出重新输入提示处
invoke-virtual {v0}, Ljava/lang/String;->length()I
move-result v1 # 获取注册码长度
if-nez v1, :cond_0 # 若注册码长度不为 0,则跳转到验证注册码处
goto :goto_1 # 若注册码长度为 0,则跳转到弹出重新输入提