丨版权说明 : 《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工程
- 然后我们编辑一个简单的登录布局。
<?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包用来反编译
- 利用apktool等逆向工具对apk包进行反编译,反编译结果如下图
- 新建任意英文名文件夹,本文叫“DemoSmali”,将反编译结果目录下的
smali
文件夹copy到“DemoSmali”目录下并重命名为"src",为之后导入Android Studio作铺垫。嗯哼?是不是很像一个名为"DemoSmali"的项目?
- 关闭逆向工具,因为可能会占用adb或相关端口
着手Debug
1. 建立debug环境体系
- 进入
android sdk
的tools
目录,即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 sdk
的platform-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那一行,记录以下红圈两个端口号
- 关闭
Monitor窗口
,因为会占用8700端口。cmd命令行
切换到adb所在的目录,执行命令 adb forward tcp:8700 jdwp:19509
adb forward tcp:8700 jdwp:18896
格式: adb forward tcp:tcp端口 jdwp:设备Online端口
jdwp:Java Debug Wire Protocol,Java 调试线协议。
若cmd
窗口没有提示说明成功了,若提示“cannot bind listener: cannot bind to 127.0.0.1:8700”类似字样说明没有关闭Monitor窗口
呗,咋这么不听话来!关闭后,重新执行一遍命令即可。
2. 配置调试
- 将
DemoSmali
目录导入Android Studio
- 导入后工程视图会自动切换为“Android”,然而什么都看不到,手动切换为“Project”即可
-
右键
src
目录,将其转为“Sources Root”
- 增加一个远程调试配置
- 为项目配置JDK
3. 调试
-
打断点
不懂smali语法没关系,从上图可以看出断点打在了“if ("cheny".equals(username) && "123456".equals(password)) {”位置附近。 -
开启调试
-
在手机上输入用户名和密码后点登录按钮,即可进入debug
嗯哼,是不是似曾相识的debug画面?会smali语法的话,就可以愉快的玩耍了。
OK,到这里就完全结束了,后面会不定期更新......
暂无评论内容