【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版本
构建项目如下: 为我们的应用程序选择一个虚拟的手机,这里我选择pixel2 和api level 27 ,system image x86 的Orea的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.xml 和activity_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
.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 *
除了 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代码
|