第六章 动态分析 Android 程序(二)(动态分析技巧)

动态分析技巧

  • 主流的动态分析框架除了提供一套完整、通用的动态分析方法,通常还具备高度的可配置特性与可扩展性,如添加自定义分析模块、增加指定的 API 分析等功能
  • 但对一些应用,还有一些分析要点没有提供,这时就要分析人员动手解决这些问题

代码注入法

  • 一个程序在发布时通常不会保留 Log 输出信息。若想观察程序特定位置的输出信息,在默认情况下,使用动态分析框架是做不到的,要手动进行代码注入
  • 代码注入指先反编译 Android 程序,再在反汇编的 smali 文件中添加 Log 调用的代码,最后重新打包程序并运行,查看输出结果
  • 实例:GitHub
  • 本实例为一个注册码验证模拟程序,输入用户名和注册码后,点击“注册”按钮,程序会判断注册码是否正确,并弹出相应提示
    在这里插入图片描述
  • 现在要找出用户名“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,则跳转到弹出重新输入提
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值