smali调试_as调试smali - CSDN
精华内容
参与话题
  • Android逆向之调试smali代码

    千次阅读 2018-05-04 00:49:08
    丨版权说明 : 《Android逆向之调试smali代码》于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢。 最近在研究Android逆向方面的知识,在这里做个示例笔记 准备 项目 版本 Android Studio ...

    ****版权说明 : 《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 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,到这里就完全结束了,后面会不定期更新…

    展开全文
  • smali调试

    2019-05-16 14:50:51
    https://www.jianshu.com/p/9843e80f5ac5 转载于:https://blog.51cto.com/haidragon/2395656
    
    

    转载于:https://blog.51cto.com/haidragon/2395656

    展开全文
  • smali文件1.下图为基本的smali结构一个smali文件对应一个class2.字段描述符‘Java中Void在smali中对应VVoid -> V其他具体描述符参考下面表格:下面粘贴两段例子代码对应看下: Android代码: package ...

    smali文件

    1.下图为基本的smali结构

    一个smali文件对应一个class

    2.字段描述符

    Java中Void在smali中对应V

    Void -> V

    其他具体描述符参考下面表格:

    下面粘贴两段例子代码对应看下:
    Android代码:

        package com.test.myapplication;
    
        import android.app.Activity;
        import android.os.Bundle;
        import android.widget.TextView;
    
        public class MainActivity extends Activity {
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                TextView tv = (TextView) findViewById(R.id.text);
                tv.setText("hello");
            }
        }
    

    smali代码:

        .class public Lcom/test/myapplication/MainActivity;
        .super Landroid/app/Activity;
        .source "MainActivity.java"
    
    
        # direct methods
        .method public constructor <init>()V
            .locals 0
    
            .prologue
            .line 7
            invoke-direct {p0}, Landroid/app/Activity;-><init>()V
    
            return-void
        .end method
    
    
        # virtual methods
        .method protected onCreate(Landroid/os/Bundle;)V
            .locals 2
            .param p1, "savedInstanceState"    # Landroid/os/Bundle;
    
            .prologue
            .line 11
            invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    
            .line 12
            const/high16 v1, 0x7f030000
    
            invoke-virtual {p0, v1}, Lcom/test/myapplication/MainActivity;->setContentView(I)V
    
            .line 13
            const v1, 0x7f070009
    
            invoke-virtual {p0, v1}, Lcom/test/myapplication/MainActivity;->findViewById(I)Landroid/view/View;
    
            move-result-object v0
    
            check-cast v0, Landroid/widget/TextView;
    
            .line 14
            .local v0, "tv":Landroid/widget/TextView;
            const-string v1, "hello"
    
            invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
    
            .line 15
            return-void
        .end method
    

    smali头部分析:

    .class public 对应 java class public

    Lcom/test/myapplication/MainActivity; 类描述符 L+包+名+; 可查看上面表中对应 Object —> Ljava/lang/Object;

    .super字段,表示从哪个类中扩展出来的, 此处对应 extends Activity

    .source字段,对应源文件.source “MainActivity.java”表示java文件就是MainActivity.java

    smali方法分析:

    固定格式

    .method 开始

    .end method 结尾

    .method protected onCreate(Landroid/os/Bundle;)V -> protected void onCreate(Bundle savedInstanceState)

    Landroid/os/Bundle; 传入的参数, 最后面的V 表示返回值类型Void

    invoke-virtual {p0, v1}, Lcom/test/myapplication/MainActivity;->findViewById(I)Landroid/view/View; -> TextView tv = (TextView) findViewById(R.id.text);

    invoke-virtual 调用方法

    move-result-object v0

    把结果放到v0

    const-string v1, “hello”

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    调用setText方法,把v1传入

    动态调试:

    工具:apktool

    下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads/

    注意:此处介绍的动态调试方法是比较旧的方法,下载2.1.0版本以下的,因为新版本的apktool -d 选项已经移除

    反编译源码中添加调试:

    1)java -jar apktool.jar d -d 目标.apk -o 结果放置目录

    2)修改AndroidMainfest文件,在application节点添加 android:debuggable=”true”

    3)在入口类的onCreate方法中添加:

    invoke-static{},Landroid/os/Debug;->waitForDebugger()V
    

    添加后示例:

    a=0;// .method protected onCreate(Landroid/os/Bundle;)V
    a=0;//     .locals 2
    a=0;//     .param p1, "savedInstanceState"    # Landroid/os/Bundle;
    a=0;// 
    a=0;//     .prologue
    a=0;//     .line 11
    a=0;//     invoke-static{},Landroid/os/Debug;->waitForDebugger()V
    a=0;//     invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    

    4)回编译修改过的apk文件

    java -jar apktool.jar b -d 代码目录 -o 目标apk名称
    

    问题:我在此处用android studio 编译了一个apk回编译失败,暂时没有解决,直接使用eclipse编译了一个demo.apk

    5)对生成的apk进行签名,签名方法可以参照之前的Android反编译和回编译文章

    使用android studio进行动态调试:

    1)导入已经反编译修改好的功能代码

    打开Android Studio ->File -> Open -> 选择刚才反编译的目录

    2)在相应位置设置断点

    3)设置远程调试选项

    Run -> Edit Configurations… -> 点击“+” -> Remote -> Host:localhost Port:8700

    4)切换到另外一个编写android代码的android studio窗口

    打开Android Device Monitor

    点击要调试的程序的进程

    5) 切换到smali工程窗口

    点击调试按钮,开始调试

    至此就可以像调试android代码一样调试smali 代码啦

    展开全文
  • C层一般会使用IDA进行调试分析,Java层常常就会需要对Smali代码进行调试分析。 刚接触逆向这块,看了很多网上的方法,于是就实践了一下,在实践的过程中又有了新方法的发现,于是乎,分享一下。 方案 话不多说直接上...

    前言

    大家都知道我们在逆向分析的时候,很多时候主要在分析逻辑。网络抓包、数据来源流向分析、页面逻辑跳转分析、动态调试等。由于很多代码都会混淆,很多时候我们直接通过代码可能看不出逻辑走向,所以我们就会选择断点来进行调试。

    C层一般会使用IDA进行调试分析,Java层常常就会需要对Smali代码进行调试分析。

    刚接触逆向这块,看了很多网上的方法,于是就实践了一下,在实践的过程中又有了新方法的发现,于是乎,分享一下。

    方案

    话不多说直接上方案:

    1、通过IDE+DDMS+Smalidea来进行调试
    2、通过Android studio + Smalidea来进行调试

    第一种方式:IDE+DDMS+Smalidea

    系统环境 macOS
    反编译工具 AndroidCrackTool
    (分享一下工具,已经替换apktool为最新版2.3.4)
    IDE Android studio 3.2

    1、首先反编译一个apk,修改其debuggable为true,并且重新打包

    (当然如果也可以root然后是用mprop来修改系统的io.debuggable属性,方法网上很多)

    AndroidCrackTool
    AndroidCrackTool是一个工具集合,可以通过设置来选择使用Apktool,它是比较新的版本
    反编译

    反编译之后打开AndroidManifest.xml清单文件,在application下加入android:debuggable="true"

    大家可以看到这里有多个smali,因为dex分包了,所以smali文件下也有多个(有可能同一个module下的代码会分散到几个文件夹下)

    回头我们会把这些smali代码拷贝到新的工程项目下进行调试。

    接下来就还是使用AndroidCrackTool(也可以自行使用apktool,它只是个成套的工具集)进行重新打包。
    打包好之后就在dist目录下

    然后再使用AndroidCrackTool进行签名,这个apk就变成一个可调试的apk了。

    2、使用IDE创建新工程(Android studio和idea都可以,我这里使用的是Android studio,因为大家都有AS,并且Android项目有独特的好处,后面会提到),然后把smali代码拷贝到source root目录下(一般就是src)

    默认src就是source root

    3、下载安装Smalidea插件,然后创建调试器

    下载地址 [Smalidea] (https://bitbucket.org/JesusFreke/smali/downloads/)
    下载出来的zip包,直接使用AS引入插件即可。
    引入插件
    然后,创建Remote调试器


    端口改为8700,module为app

    4、使用DDMS依附调试进程

    新版的AS已经不能直接从IDE打开DDMS了,从以下路径找到打开

    sdk/tools/monitor

    然后执行调试adb 命令

    adb shell am start -D -n {替换报名}/.ui.activity.LaunchActivity
    

    这里再提供一个快速查询包名的命令(也可以用top,那个信息较多)

    adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'
    

    执行命令后,app就出现一个弹框等到debugger attach了,DDMS打开,然后就出现device里面看到可调式的进程了。并且默认端口是8700
    可调式了

    然后AS运行我们的调试器,
    运行调试器

    大功告成

    这下我们就可以调试smali代码了,并且看左边的Frames,还可以看到函数调用栈,很棒。

    注意:

    如果遇到打开DDMS,提示8700端口已经占用,比如AS的Android项目已经占用了,这时候问就可以通过lsof -i:8700来查看 使用这个端口的进程信息,然后kill -9 进程号来杀掉这个进程,重新连接adb,打开ddms就可以了。
    查看进程号,杀掉,重启

    第二种方式:Android studio+Smalidea

    第二种就更简单一些了,其实就只使用AS就可以了,我们都知道Android app项目,我们运行起app之后,直接点击Stop左边的"Attach to Android processor"按钮,就可以调试此应用了。原理也一样,我们也可以通过它来调试我们想要调试的apk的进程。

    跟第一步不同,再执行了调试adb命令adb shell am start -D -n xxxx之后,点击此按钮,注意,这里需要勾选"Show all processes",这样就可以看到要调试的进程了。
    大功告成

    一样的,打上断点,就可以调试啦!哈哈哈,真方便。

    第二个方法是最方便的,Android开发者就是用AS就够了,不需要用idea啥的,还要去下载。这也是我推荐分享给大家的方法。

    最后

    本人也是刚刚开始接触逆向相关,需要学习的还很多,后面如果有好的东西也会多多分享,如果大家有好的资源也欢迎留言分享,谢谢。

    展开全文
  • 上一篇博文中我们讲解了smali语法,今天就带大家如何进行动态调试smali代码。你可能要问,为什么要学会动态调试smali代码?那就是为了减轻我们逆向分析的负担! 在上篇的博文中我们已经了解到,一个smali文件中代码...
  • 点击上方↑↑↑蓝字[协议分析与还原]关注我们“介绍Android逆向中调试smali代码的方法。”最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享。本文介绍...
  • 安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您...
  • 在次做个记录而已,等待问题解决了,在补上解决办法。 之前一直用android studio2.1.1进行调试smali,一直很好用。 由于最近需要做ndk方面的工作,看到...下载android studio2.3最新版本,结果发现smali调试无法进去。
  • AS动态调试smali

    千次阅读 2018-01-14 17:17:00
    1.用AndroidKiller把apk反编译成smali文件; 新建一个文件夹 然后把打开文件路径目录里的smali文件夹复制到文件中并改名为src ; 反编译后记得查看清单文件,在application标签里面要有 android:debuggable=”...
  • 0x1 AS动态调试smali环境配置 Android Studio是由谷歌发布的一个为Android平台开发程序的集成开发环境。由于其功能的强大,近几年来已经逐渐取代eclipse成为Android开发的首选工具。 AS动态调试smali代码需要用到...
  • eclipse动态调试smali

    2016-10-10 11:34:04
    跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运行看输出日志,这种方法费时费力,如果能够动态调试就最好了。下面就给大家介绍apk+eclipse来调试smali。 前期准备: eclipse。 Jdk或jre...
  • androidstudio动态调试smali

    千次阅读 2017-08-01 11:01:32
    参考:... 一、配置插件 下载插件smalidea 地址: https://bitbucket.org/JesusFreke/smali/downloads 下载smalidea-0.03.zip 下载完成后,打开Android studio
  • Android studio动态调试smali

    千次阅读 2019-02-21 14:42:19
    下载地址https://github.com/JesusFreke/smali/wiki/smalidea 首先第一步需要在as里面安装ideasmali的插件   装完重启之后。 我们将反编译的apk安装到手机中,以debug模式去运行他, adb shell am ...
  • smali调试总结

    2017-01-05 16:21:00
    开始调试smali调试从最早的重打包用各种JAVA IDE进行调试, 到后来的可以不用重打包用xposed插件, 在到最后的修改系统源码刷机或者修改boot.img刷机一劳永逸apk可调试可以为下面几个点满足一个几个,1.invoke-static ...
  • 1、工具介绍 使用工具 android killer:用于反编译apk包,得到smali...android studio:调试smali代码工具,或者使用idea,android studio就是在idea的基础上修改的 smalidea-0.03.zip: as插件,需要安装到and...
  • smali代码插入和调试

    千次阅读 2013-08-26 17:23:30
    转自:... 总结了一些Smali代码移植时可能遇到的编译错误:   1.函数调用(invoke-virtual等指令)的参数只能使用v0~v15,使用超过v15的变量会报错。修复这个问题有两种方法:
  • error: cannot bind listener: cannot bind to 127.0.0.1:8700: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048) 解决办法  netstat -nao | findstr "8700"  根据PID找到该进程,结束...
  • AndroidStudio调试smali代码
  • 教我兄弟学Android逆向04 动态调试smali代码:https://www.52pojie.cn/thread-658865-1-1.html From:Android Studio 3.6 调试 smali:https://blog.csdn.net/jha334201553/article/details/104494732 From:...
  • Mac下基于Android studio 4.0动态调试smali全过程 用到的工具 系统环境 macOS ; 反编译工具 Android-Crack-Tool;(包括:apktool 反编译apk->Smali 并且重新打包修改后的Smali到apk,jadx 用了查看Smali对应的...
1 2 3 4 5 ... 20
收藏数 2,208
精华内容 883
关键字:

smali调试