Android逆向之调试smali代码

版权说明 : 《Android逆向之调试smali代码》于当前CSDN博客乘月网属同一原创,转载请说明出处,谢谢。

最近在研究Android逆向方面的知识,在这里做个示例笔记


准备

项目 版本
Android Studio 3.1.2
JDK 1.8.0_152
Apktool 2.3.2
smalidea 0.05

  之所以列出版本号,一方面因为调试工具需要用到Android Device Monitor工具,而Android Studio 3.0开始弃用该工具,所以使用方法比较特殊,另一方面希望要通过本篇文章学习的童鞋,尽量跟着我的版本号来,防止出现不必要的问题。


开撸

做一个简单的Android项目Demo

  • 新建一个Android工程

图片[1]-Android逆向之调试smali代码-乘月网

  • 然后我们编辑一个简单的登录布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:hint="请输入用户名" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:hint="请输入密码"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="登录" />
</LinearLayout>
  • 再编写简单的登录java逻辑
......
public class MainActivity extends AppCompatActivity {
    EditText et_username, et_password;
    Button btn_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = findViewById(R.id.et_username);
        et_password = findViewById(R.id.et_password);
        btn_login = findViewById(R.id.btn_login);

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = et_username.getText().toString().trim();
                String password = et_password.getText().toString().trim();
                checkLogin(username, password);
            }
        });
    }

    /**
     * 登录
     *
     * @param username
     * @param password
     */
    public void checkLogin(String username, String password) {

        if ("cheny".equals(username) && "123456".equals(password)) {
            Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "登录失败!", Toast.LENGTH_SHORT).show();
        }
    }
}
  • 编辑完毕后,先确保手机已经连接上Android Studio,然后编译打包apk安装到手机,再拖出apk包用来反编译

图片[2]-Android逆向之调试smali代码-乘月网

  • 利用apktool等逆向工具对apk包进行反编译,反编译结果如下图

图片[3]-Android逆向之调试smali代码-乘月网

  • 新建任意英文名文件夹,本文叫“DemoSmali”,将反编译结果目录下的smali文件夹copy到“DemoSmali”目录下并重命名为"src",为之后导入Android Studio作铺垫。嗯哼?是不是很像一个名为"DemoSmali"的项目?

图片[4]-Android逆向之调试smali代码-乘月网

  • 关闭逆向工具,因为可能会占用adb或相关端口

着手Debug

1. 建立debug环境体系

  • 进入android sdktools目录,即Android Device Monitor所在的目录,双击monitor.bat文件开启Monitor

注意:
1. 目前所有Android Studio版本都可以通过此方式开启Monitor
2. Android Studio3.0之前版本是可以直接在Studio上的Tools菜单找到"Android Device Monitor"入口的

此时,会出现Monitor窗口,窗口上会显示你的手机设备。如果没有显示,检查手机有没有连接好Android Studio,如果显示了但提示“Could not open Selected VM debug port (8700)”类似字样,请检查逆向工具以及其它会占用adb的软件如某助手,某豆荚是否已经关闭。

  • cmd命令行切换到android sdkplatform-tools目录,即adb所在的目录,执行命令
adb shell am start -D -n cn.icheny.demo/cn.icheny.demo.MainActivity

  目的:调试MainActivity
  格式: adb shell am start -D -n 应用包名/Activity具体类名

  • 执行后,手机会出现debug弹窗,千万别关闭。在Monitor窗口上也会多出一行,即红色debug logo那一行,记录以下红圈两个端口号

图片[5]-Android逆向之调试smali代码-乘月网

  • 关闭Monitor窗口,因为会占用8700端口。cmd命令行切换到adb所在的目录,执行命令 adb forward tcp:8700 jdwp:19509
adb forward tcp:8700 jdwp:18896

  格式: adb forward tcp:tcp端口 jdwp:设备Online端口
  jdwpJava Debug Wire Protocol,Java 调试线协议。
cmd窗口没有提示说明成功了,若提示“cannot bind listener: cannot bind to 127.0.0.1:8700”类似字样说明没有关闭Monitor窗口呗,咋这么不听话来!关闭后,重新执行一遍命令即可。

2. 配置调试

  • DemoSmali目录导入Android Studio

图片[6]-Android逆向之调试smali代码-乘月网
图片[7]-Android逆向之调试smali代码-乘月网

  • 导入后工程视图会自动切换为“Android”,然而什么都看不到,手动切换为“Project”即可

  • 右键src目录,将其转为“Sources Root”

图片[8]-Android逆向之调试smali代码-乘月网

  • 增加一个远程调试配置

图片[9]-Android逆向之调试smali代码-乘月网
图片[10]-Android逆向之调试smali代码-乘月网
图片[11]-Android逆向之调试smali代码-乘月网

  • 为项目配置JDK

    图片[12]-Android逆向之调试smali代码-乘月网
    图片[13]-Android逆向之调试smali代码-乘月网

3. 调试

  • 打断点

    图片[14]-Android逆向之调试smali代码-乘月网
    不懂smali语法没关系,从上图可以看出断点打在了“if ("cheny".equals(username) && "123456".equals(password)) {”位置附近。

  • 开启调试

    图片[15]-Android逆向之调试smali代码-乘月网

  • 在手机上输入用户名和密码后点登录按钮,即可进入debug

    图片[16]-Android逆向之调试smali代码-乘月网

嗯哼,是不是似曾相识的debug画面?会smali语法的话,就可以愉快的玩耍了。


OK,到这里就完全结束了,后面会不定期更新......

© 版权声明
THE END
喜欢就支持以下吧
点赞2 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容