Android逆向之调试smali代码

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

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


准备

项目版本
Android Studio3.1.2
JDK1.8.0_152
Apktool2.3.2
smalidea0.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 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那一行,记录以下红圈两个端口号
  • 关闭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
  • 导入后工程视图会自动切换为“Android”,然而什么都看不到,手动切换为“Project”即可

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

  • 增加一个远程调试配置
  • 为项目配置JDK
3. 调试
  • 打断点

不懂smali语法没关系,从上图可以看出断点打在了**“if (“cheny”.equals(username) && “123456”.equals(password)) {”**位置附近。

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

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


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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值