Android逆向Android smali与java代码介绍1

Posted SogK1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android逆向Android smali与java代码介绍1相关的知识,希望对你有一定的参考价值。


————————————————
版权声明:本文为CSDN博主「SogK1997」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dive668/article/details/119542994
————————————————

面向招聘需求

工具要求

熟悉IDA Pro、GDB、JEB、JADX等常用逆向分析工具,具备较强的逆向分析能力;
掌握Android反编译,脱壳,静态分析、动态调试;掌握jadx, IDA, JEB, unidbg等工具;
熟悉使用IDA、OllyDeBug、WinDeBug或类似调试工具中的一种;
熟练掌握各种调试工具:Smali、Dedexer、Dexdump、Apktool、Dex2jar、IDA、OLLYDBG其中一种或多种;
熟练掌握各种调试工具:Smali、Dedexer、Dexdump、Apktool、Dex2jar、jd-gui、AndroidKiller、Jeb、IDA其中一种或多种,有Olly DBG使用基础。
对逆向工程有浓厚的兴趣,熟练apktool、Dex2jar、jeb、IDA、GDB等各种反编译及调试工具的使用;

框架要求

熟悉ARM、x86/64汇编以及smali,熟练掌握软件逆向静态分析、动态调试、代码跟踪等;
熟练掌握android的hook技术,熟悉DEX、ELF文件格式,熟悉DEX、ELF加壳脱壳;
熟练掌握Xposed、Cydia Substrate、Frida等其中一种Hook工具进行逆向开发。
熟练使用Xposed、frida等框架;
了解注入、Hook技术原理,能使用Frida、Xposed等框架编写Hook代码;
熟悉使用Xposed、Theos、frida等框架;

了解到IDA是所有工具中都要求掌握的一个:
IDA Pro

The best-of-breed binary code analysis tool, an indispensable item in the toolbox of world-class software analysts, reverse engineers, malware analyst and cybersecurity professionals.
同类最佳的二进制代码分析工具,是世界一流软件分析师、逆向工程师、恶意软件分析师和网络安全专业人员工具箱中不可或缺的一项。

IDA

IDA 反汇编器和调试器是一种交互式、可编程、可扩展、多处理器反汇编器,托管在 Microsoft Windows、Linux 或 Apple macOS 上。IDA 已成为分析恶意代码、漏洞研究和商业现货验证的事实上的标准。

参考学习&资源工具

Apktool Introduction
AndroidDevTools
Android_Tools
IDA_Pro_v7.5_Portable.zip
IDA Free
【吾爱破解首发】Android Killer修复版

吾爱网址:https://www.52pojie.cn/thread-1400404-1-1.html
https://cloud.189.cn/t/IZ3A7fUrmaq2 (访问码:5wdo)
签名密钥密码为52pojie.cn
压缩包解压密码为52pojie.cn
安装使用Android Killer需要java环境:
JDK 16.0.2 通用版本 (Java Development Kit)
Java SE 8 Archive Downloads (JDK 8u202 and earlier)
JRE 含义是(Java Runtime Environment)

1.创建新项目hello world

选择创建basic activity

注意编程语言选择java,自己设定Name和程序最低要求的Android的SDK版本

构建项目如下:

为我们的应用程序选择一个虚拟的手机,这里我选择pixel2api level 27,system image x86Orea的Android8,并下载。

编译前的程序组成

  • java存放着原程序代码
  • res存放布局等资源文件
  • AndroidManifest.xml是每个apk都需要的,描述了整个安卓应用中需要的属性和权限,窗口之类。

在build中找到编译生成的apk文件,拖拽到winhex中,看到apk文件具有特征头:pk。

可以选用压缩工具去打开。

对比源码和apk压缩包文件

java的源码被编译成classes.dex
res变成了res目录resources.arsc文件。

反编译

使用android killer这个软件,但是因为这个视频是数年前的:

activity介绍(窗体)

activity就是安卓的一个窗体,这个窗体是如何被注册和运行呢?
要想有一个窗体,需要现在Manifest里面注册上。
<activity>内注册.MainActivity,按ctrl跳转到内部注册代码。

布局文件在res下的layout,找到content_main.xmlactivity_main.xml


如何链接布局和函数方法呢?依赖于java中的oncreate()函数

自己创建窗体

在layout中new一个新的布局,命名为hello

之后需要一个类来描述它,建立一个链接,我们新建这个hello类,并参照MainActivity去写它的代码。

从AppMainActivity派生出来,并复制oncreate函数,和链接方法。

super.onCreate()
setContenView()

之后在Manifest中添加这个标签,

<activity android:name=".hello"/>

在mainactivity中启动我们创建的 hello窗体。需要startActivity()这个函数
需要添加代码:

startActivity(new Intent(MainActivity.this,hello.class));

新建一个按钮资源,对其添加代码实现对窗口的编辑。

AndroidKiller反编译

注意配置configs文件中SDK与自己电脑的SDK的bin目录的一致:

在build中找到编译生成的apk文件并拖拽到AndroidKiller中。

下图为反编译后的smail文件代码。

Smail文件

smail文件结构:头部定义,域定义和函数定义。

一个smal则对应于ー个 class,可以对其进行一些简单的修改。
java中的一些字段描述符被转化为字符修饰符:
Void->V

对于java对象的转换,补全其路径后,在前面添加L,并将.转化为/

oncreate()函数转换如下:

# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V //V代表返回的是void类型
    .locals 3
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .line 28
    invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 30
    invoke-virtual {p0}, Lcom/example/hello_world/MainActivity;->getLayoutInflater()Landroid/view/LayoutInflater;

    move-result-object v0

    invoke-static {v0}, Lcom/example/hello_world/databinding/ActivityMainBinding;->inflate(Landroid/view/LayoutInflater;)Lcom/example/hello_world/databinding/ActivityMainBinding;

    move-result-object v0

    iput-object v0, p0, Lcom/example/hello_world/MainActivity;->binding:Lcom/example/hello_world/databinding/ActivityMainBinding;

    .line 31
    invoke-virtual {v0}, Lcom/example/hello_world/databinding/ActivityMainBinding;->getRoot()Landroidx/coordinatorlayout/widget/CoordinatorLayout;

    move-result-object v0

    invoke-virtual {p0, v0}, Lcom/example/hello_world/MainActivity;->setContentView(Landroid/view/View;)V

    .line 33
    iget-object v0, p0, Lcom/example/hello_world/MainActivity;->binding:Lcom/example/hello_world/databinding/ActivityMainBinding;

    iget-object v0, v0, Lcom/example/hello_world/databinding/ActivityMainBinding;->toolbar:Landroidx/appcompat/widget/Toolbar;

    invoke-virtual {p0, v0}, Lcom/example/hello_world/MainActivity;->setSupportActionBar(Landroidx/appcompat/widget/Toolbar;)V

    .line 35
    const v0, 0x7f080110

    invoke-static {p0, v0}, Landroidx/navigation/Navigation;->findNavController(Landroid/app/Activity;I)Landroidx/navigation/NavController;

    move-result-object v0

    .line 36
    .local v0, "navController":Landroidx/navigation/NavController;
    new-instance v1, Landroidx/navigation/ui/AppBarConfiguration$Builder;

    invoke-virtual {v0}, Landroidx/navigation/NavController;->getGraph()Landroidx/navigation/NavGraph;

    move-result-object v2

    invoke-direct {v1, v2}, Landroidx/navigation/ui/AppBarConfiguration$Builder;-><init>(Landroidx/navigation/NavGraph;)V

    invoke-virtual {v1}, Landroidx/navigation/ui/AppBarConfiguration$Builder;->build()Landroidx/navigation/ui/AppBarConfiguration;

    move-result-object v1

    iput-object v1, p0, Lcom/example/hello_world/MainActivity;->appBarConfiguration:Landroidx/navigation/ui/AppBarConfiguration;

    .line 37
    invoke-static {p0, v0, v1}, Landroidx/navigation/ui/NavigationUI;->setupActionBarWithNavController(Landroidx/appcompat/app/AppCompatActivity;Landroidx/navigation/NavController;Landroidx/navigation/ui/AppBarConfiguration;)V

    .line 39
    iget-object v1, p0, Lcom/example/hello_world/MainActivity;->binding:Lcom/example/hello_world/databinding/ActivityMainBinding;

    iget-object v1, v1, Lcom/example/hello_world/databinding/ActivityMainBinding;->fab:Lcom/google/android/material/floatingactionbutton/FloatingActionButton;

    new-instance v2, Lcom/example/hello_world/MainActivity$1;

    invoke-direct {v2, p0}, Lcom/example/hello_world/MainActivity$1;-><init>(Lcom/example/hello_world/MainActivity;)V

    invoke-virtual {v1, v2}, Lcom/google/android/material/floatingactionbutton/FloatingActionButton;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 46
    return-void
.end method

invoke代表调用。Android中的是utf8格式字符串。汉字被编为类似\\u96f6类似格式。

apktool

apktool介绍

Apktool Introduction

Apk 只不过是一个包含资源和组装的 Java 代码的 zip 文件。如果您像这样简单地解压缩 apk,您将留下诸如classes.dex和 之类的文件resources.arsc

$ apktool d testapp.apk
I: Using Apktool 2.0.0 on testapp.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
$

除了 XML 之外,诸如 9 patch image、布局、字符串等资源都被正确解码为源格式。

什么是 9 patch image,它有什么用处?

框架文件
您可能知道,Android 应用程序使用在 Android 操作系统本身上找到的代码和资源。这些被称为框架资源,Apktool 依赖这些资源来正确解码和构建 apk。

每个 Apktool 版本都在内部包含发布时最新的 AOSP 框架。这使您可以毫无问题地解码和构建大多数 apk。但是,除了常规的 AOSP 文件之外,制造商还会添加自己的框架文件。要对这些制造商 apk 使用 apktool,您必须首先安装制造商框架文件。
在解码这个apk之前,我们必须获得HTC框架资源。我们com.htc.resources.apk从我们的设备中拉出并安装它

$ apktool if com.htc.resources.apk
I: Framework installed to: 2.apk

现在我们将再次尝试这种解码。

$ apktool d HtcContacts.apk 
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
I: Loading resource table from file: /home/brutall/apktool/framework/2.apk
I: Copying assets and libs...

如你看到的。Apktool 利用1.apk和2.apk框架文件来正确解码此应用程序。
寻找框架
在大多数情况下/system/framework,设备上的任何 apk都将是一个框架文件。在某些设备上,它们可能驻留在 /data/system-framework或 中甚至巧妙地隐藏在/system/app或 中/system/priv-app。它们通常以“资源”、“资源”或“框架”的命名来命名。
内部框架
Apktool 带有一个如上所述的内部框架。该文件$HOME/apktool/framework/1.apk在使用过程中被复制到。
管理框架文件
框架存储在不同的位置,具体取决于相关的操作系统。

  • Unix - $HOME/.local/share/apktool
  • windows—— %UserProfile%\\AppData\\Local\\apktool
  • apple- $HOME/Library/apktool

apktool 使用

apktool蓝奏云下载链接

apktool是一个.jar文件,需要java虚拟机打开。

java -jar D:/xxx/apktool.jar

进入之后
带参数d(d表示dcompile,反编译),带参数o,输出目录(此时拖拽app-debug.apk过去,方便得到路径)

java -jar apktool.jar d -d F:\\xxx\\app-debug.apk -o 

调试方法

源程序修改
一种比较旧的调试方法,使用 apktool的-d选项
java -jar apktool.jar d -d 目标.apk - o 结果存放目录
②修改 Android.mainfest文件,在在 application节点中添加 android:debuggable="true"
③在入口点的类的 onCreate方法中添加

invoke-static(), Landroid/os/Debug;->waitfordebugger()V

④反编译修改过的apk文件

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

⑤手动对apk文件进行签名
签名后才能使用adb install进行安装,否则会报错

java-jar signapk.jar testkey.x509.pem testkey.pk8 未签名APK名 签名APK名

导入apk代码
①idea/ Android Studio File->open,选择编译后的文件目录,导入代码
在相应的位置下好断点。

②设置远程调试选项
Run-> Debug Configurations-> Remote Java Application,Host填写为localhost,端口为Debug开放的端口8700。但实际上此时还没有开放。
tools->Android->Android Device Monitor

然后打开smail的MainActivity.java就可以进行Debug调试了。

打开目标apk文件
①打开apk文件,直到看到 wati for debugger的提示

作业

1.编写一个简单的apk文件,第一页(启动的 Activity)中有一个按钮,点击后可以打开第二页( Activity)
2.修改 Hello, World!!!你好,世界!!!(或其他字样)
3.在下面自己尝试一下调试,熟悉smail代码

以上是关于Android逆向Android smali与java代码介绍1的主要内容,如果未能解决你的问题,请参考以下文章

Android逆向基础知识Smali

Android逆向 Android Studio动态调试smali代码

Android 逆向概述

Android逆向笔记-使用Android Studio调试Smali代码(方式二)

Android逆向笔记-使用Android Studio调试Smali代码(方式一)

android-smali记录