【移动安全高级篇】————9、动态分析smali

Android逆向工程入门:APK反编译与Smali语法实战解析 在移动应用开发与安全领域,逆向工程是一项关键技术,它通过分析已编译的程序来理解其内部结构与运行逻辑。其核心原理在于将机器码或字节码转换回更易读的中间表示形式,从而揭示应用的功能实现与潜在逻辑。这项技术的价值在于赋能安全研究、漏洞挖掘、代码审计以及疑难问题调试,是深入理解Android应用不可或缺的技能。在具体实践中,APK反编译与Smali语法分析构成了Android逆向的基石。通过使用**Apktool**、**JADX**等工具链,可以将APK文件解包并反编译为可读的Smali代码——一种Dalvik/ 阅读详情

0X01 smali语言简述

smali语言是Dalvik的反汇编语言因Android虚拟机Dalvik不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码。

接触过Android逆向的小伙伴都会遇到smali语言,简单的逆向过程 [apk -> smali -> java]。有的逆向工具无法将smali语言反编译成java源码,只逆向到smali语言这层。或者反编译成java源码无法运行(smali宽松型语言)。

0X02 smali语言语法

####原始数据类型:

//smali----java
B----byte
C----char
D----double
F----float
I----int
J----long
S----short
V----void
Z----boolean
[XXX-----array
Lxxx/yyy----object

####基础语法:

语法:

.field  定义变量

.method  方法

.parameter  方法参数

.prologue  方法开始

.line 12  此方法位于第12行

invoke-super  调用父函数

const/high16  v0, 0x7fo3  把0x7fo3赋值给v0

invoke-direct  调用函数

return-void  函数返回void

.end method  函数结束

new-instance  创建实例

iput-object  对象赋值

iget-object  调用对象

invoke-static  调用静态函数

####smali跳转语句:

"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**

"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**

"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**

"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**

"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
//le 小于等于
//eqz 等于0
//nez 不等于0
//ltz 小于0
//gez 大于等于0
//gtz 大于0
//lez 小于等于0

####例子:

//smali
.method public onClick(View)V
          .registers 12
00000000  const/4             v9, 3
00000002  const/4             v8, 2
00000004  const/4             v7, 0
00000006  const/4             v6, 1
00000008  iget                v5, p0, MainActivity->flag:I
0000000C  if-ne               v5, v6, :12
00000032  const               v5, 0x7F0C0050
00000050  move-result-object  v3
00000052  check-cast          v3, TextView
00000056  iput                v7, p0, MainActivity->m:I
0000005A  new-instance        v0, Random
0000005E  invoke-direct       Random-><init>()V, v0
00000064  invoke-virtual      Random->nextInt(I)I, v0, v9
0000006A  move-result         v5
0000006C  iput                v5, p0, MainActivity->n:I
00000070  new-array           v1, v9, [String
00000074  const-string        v5, "CPU: Paper"
00000078  aput-object         v5, v1, v7
0000007C  const-string        v5, "CPU: Rock"
00000080  aput-object         v5, v1, v6
00000084  const-string        v5, "CPU: Scissors"
00000088  aput-object         v5, v1, v8
0000008C  iget                v5, p0, MainActivity->n:I
00000090  aget-object         v5, v1, v5
00000094  invoke-virtual      TextView->setText(CharSequence)V, v3, v5
0000009A  iget-object         v5, p0, MainActivity->P:Button
0000009E  if-ne               p1, v5, :B0
:A2
000000A2  const-string        v5, "YOU: Paper"
000000A6  invoke-virtual      TextView->setText(CharSequence)V, v2, v5
000000AC  iput                v7, p0, MainActivity->m:I
:B0
000000B0  iget-object         v5, p0, MainActivity->r:Button
000000B4  if-ne               p1, v5, :C6
:B8
000000B8  const-string        v5, "YOU: Rock"
000000BC  invoke-virtual      TextView->setText(CharSequence)V, v2, v5
000000C2  iput                v6, p0, MainActivity->m:I
:C6
000000C6  iget-object         v5, p0, MainActivity->S:Button
000000CA  if-ne               p1, v5, :D
 C
:CE
000000CE  const-string        v5, "YOU: Scissors"
000000D2  invoke-virtual      TextView->setText(CharSequence)V, v2, v5
000000D8  iput                v8, p0, MainActivity->m:I :D
 C
000000DC  iget-object         v5, p0, MainActivity->handler:Handler
000000E0  iget-object         v6, p0, MainActivity->showMessageTask:Runnable
000000E4  const-wide/16       v8, 1000
000000E8  invoke-virtual      Handler->postDelayed(Runnable, J)Z, v5, v6, v8, v9
000000EE  goto                :10
.end method
//java
public void onClick(View arg11) {
    int v9 = 3;
    int v8 = 2;
    if(this.flag != 1) {
        this.flag = 1;
        this.findViewById(0x7F0C0052).setText("");
        View v2 = this.findViewById(0x7F0C0050);
        View v3 = this.findViewById(0x7F0C0051);
        this.m = 0;
        this.n = new Random().nextInt(v9);
        String[] v1 = new String[v9];
        v1[0] = "CPU: Paper";
        v1[1] = "CPU: Rock";
        v1[v8] = "CPU: Scissors";
        ((TextView)v3).setText(v1[this.n]);
        if(arg11 == this.P) {
            ((TextView)v2).setText("YOU: Paper");
            this.m = 0;
        }

        if(arg11 == this.r) {
            ((TextView)v2).setText("YOU: Rock");
            this.m = 1;
        }

        if(arg11 == this.S) {
            ((TextView)v2).setText("YOU: Scissors");
            this.m = v8;
        }

        this.handler.postDelayed(this.showMessageTask, 1000);
    }
}

0X03 动态调试smali

IntelliJ IDEA/Android Studio 利用smalidea插件可实现动态调试smali代码
下载smalidea插件(https://bitbucket.org/JesusFreke/smali/downloads/)
添加smalidea插件[File->Settings->Plugins]

点击Install plugin from disk添加下载好插件。

加载插件后关闭Android Studio再重新打开。
导入源码(apk逆向的smali)。

选择要加载smali源码。

连续next。

加载后就能看到smali。

将存放smali文件的文件夹设置为项目源码。

给项目添加相应的SDK[File->Project Structure]。

运行模拟器并启动要调试的APP。
开启模拟器端口转发。

使用adb shell ps命令查看程序APP的运行的端口与名称。

添加远程调试环境。

开启程序端口调试转发。
tcp后的端口为上图添加的端口,jdwp后的端口为在apk中运行的APP端口。

为smali打上断点,运行Debug[Run->Debug],开始调试。

 

手把手教你用JADX和Apktool反编译APK,并修改Smali代码后重新签名打包 本文详细介绍了如何使用JADX和Apktool进行APK反编译,并修改Smali代码后重新签名打包的全流程。从工具准备、代码分析到重打包签名,每个步骤都配有实用技巧和操作指导,适合移动安全研究和应用定制领域的开发者学习。 阅读详情

相关推荐

Android APK逆向工程实战:从工具链到Smali修改与Frida动态调试

逆向工程是软件安全与开发领域的一项核心技术,它通过分析程序的最终产物来理解其内部逻辑与实现原理。在Android生态中,APK逆向工程尤为关键,其核心目标在于分析应用逻辑、定位关键功能点并进行安全审计。实现这一目标依赖于一套成熟的工具链,例如Apktool用于解码资源与反编译dex文件,Jadx则能将字节码高效还原为可读的Java代码,二者构成了静态分析的基石。这项技术的价值在于,它不仅能帮助开发者学习优秀实现、排查自身应用的安全风险,也是安全研究人员进行漏洞挖掘和恶意软件分析的重要手段。在应用场景上,无论

weixin_30751947的博客 357

【Android安全】 Smali

【Android安全】Smali

Juruo@Security 890

Android APK动态调试实战:从Smali代码到运行时分析

动态调试是软件逆向工程和安全分析中的核心技术,它允许开发者在程序运行时实时监控和干预其执行流程。与静态分析只能查看代码结构不同,动态调试通过调试器与目标进程交互,能够观察变量状态、控制执行路径、实时修改内存数据。这项技术在移动安全领域尤为重要,尤其在Android应用分析中,通过调试Smali代码(Dalvik字节码的汇编表示),可以深入理解应用运行时行为。在逆向分析、漏洞挖掘、恶意代码检测等场景中,动态调试能揭示静态分析无法发现的逻辑漏洞和隐蔽行为。本文以Android APK动态调试为例,详细讲解如何配

weixin_30443731的博客 374

2020-10-30(smali复杂类解析)

首发于i春秋论坛 之前在Android逆向——初识smali与java类中讲解了基本的HelloWorld和简单类。这节课就要进一步深入。如果能够耐下心来分析一定会有所收获。——写给自己和后来人。 0x00 前言 1.内容 1.1 smali复杂类分析(前菜) 1.基本属性 2.构造方法 3.基本方法 4.简单的练习 1.2 smali类相互调用(主菜) 1.两个类相互调用 1.3 小练习(甜点) 1.写一个smali 2.调用其他两个类里的方法 0x01 smali复杂类分析 1.java复杂类 如果有什

寻梦&之璐 757

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 364

Android逆向开发:从工具链到合规实践的技术解析与安全边界

Android逆向工程是一种通过反编译、调试和动态分析等技术手段,对已编译的APK应用进行解构与分析的方法。其核心原理在于深入理解Android运行时环境、DEX文件结构及系统调用机制,从而还原代码逻辑、追踪数据流并分析通信行为。这项技术的核心价值在于安全研究、漏洞挖掘、恶意软件分析与应用加固设计,是构建深度防御体系的关键能力。在实际应用场景中,它广泛应用于移动应用安全评估、竞品技术调研与隐私合规检测。本文聚焦于Android逆向开发中的核心工具链配置,详细解析了Apktool、Frida、jadx等关键工

weixin_33912638的博客 393

Smali和逆向分析

1.Smali简介 Smali是Dalvik的寄存器语言,它与Java的关系,简单理解就是汇编之于C。假如你对汇编有足够的驾驭能力,那你可以通过修改汇编代码来改变C/C++代码的走向。当然,学过汇编的都清楚,汇编比BrainFuck还难学,更不用说去反编译修改了。 但是Smali有一点不一样,就是它很简单,只有一点点的语法,只要你会java,了解Android的相关知识,那你完全可以通

PuddingGuo 8349

Android应用逆向工程实战:Remini高级功能解锁与AI模型调用分析

Android应用逆向工程是移动安全领域的核心技术,涉及对APK文件进行解包、反编译和动态调试,以理解其内部工作原理。其核心原理是通过静态分析工具(如Apktool、JADX)解析字节码,结合动态插桩框架(如Frida)监控运行时行为,从而揭示应用逻辑与验证机制。这项技术的价值在于帮助开发者理解应用架构、进行安全评估,并学习商业软件的工程实现。在AI应用场景中,逆向工程可用于分析客户端与云端模型的交互流程,例如研究图像处理应用的网络验证与功能解锁逻辑。本文以Remini AI画质修复应用为例,深入探讨其高级

weixin_30765577的博客 453

屏蔽AlertDialog对话框或者直接操作

首先 根据 关键字 跟 AlertDialog 综合起来 分析 分析 定位出来 当前对话框 所在的 代码位置 new-instance v2, Landroid/app/AlertDialog$Builder; invoke-direct {v2, p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/...

qq_34108752的博客 703

Rust 与 C/C++:Rust 比 C/C++ 更好还是只是“技能问题”?

对于许多嵌入式系统开发人员而言,的崛起似乎掀起了一股不小的浪潮,特别是在相较于传统的语言,Rust的“内存安全”优势让人眼前一亮。然而,是否可以将Rust作为C/C++的替代品?或者说,Rust是否真的比C/C++更好,抑或它只是一个“技能问题”呢?在嵌入式开发的领域,我观察到,尽管Rust在一些高性能、内存安全敏感的场景中受到了广泛推崇,但它在实际应用中的普及度,特别是在嵌入式领域,依然有限。今天,我会从多个角度探讨这个问题,并且分享一些对于Rust、C/C++以及嵌入式系统开发的个人见解。

qq_63315166的博客 1300

非易失存储器读写

24C256、IIC_SCL、IIC_SDA

CT_1104的专栏 2986

【smali】一些smali不常见的语法

1.内部类:一个包含简单的匿名内部类的代码: public class EventQs extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //

icy_xm的专栏 8176

安装部署 Guacamole 远程桌面网关

Guacamole 是Apache基金会提供的一组基于web的远程桌面访问工具,支持 VNC、RDP、SSH、 Telnet 等协议,支持远程透传音视频。

UsamaBinLaden6976498的专栏 1963

移动应用逆向实战:基于MobSF的Smali代码修改与重打包指南

在移动应用安全领域,逆向工程是分析应用内部逻辑、挖掘潜在漏洞的核心技术。其原理在于通过反编译工具将Android应用的DEX字节码转换为可读的Smali汇编代码,从而绕过源码混淆,直接窥探程序执行流程。这项技术的价值不仅体现在安全评估和恶意软件分析中,也是CTF竞赛和功能验证的关键手段。应用场景广泛覆盖了漏洞利用验证、逻辑绕过、协议分析等。本文聚焦于使用MobSF(Mobile Security Framework)这一集成化平台,系统讲解如何高效地进行Smali代码的定位、修改与重打包,实现精准的**逻辑

weixin_34101229的博客 414

头歌 操作系统 课堂练习2.1:外部中断 第2关:第一次时钟中断

将答案0x796c输入到workspace/mushixun/恢复点的地址.txt中的括号里即可,随后使用kill命令防止对第三关的环境造成影响。

Yinfrey的博客 6091

固态变压器SST 1.1 课程整体框架与学习路径

本课程围绕固态变压器(SST)全生命周期工程化流程设计,构建"规范要求-理论基础-设计方法-仿真验证-工程落地"的闭环学习体系,完整覆盖GB/T 40429-2021标准要求。课程分为基础认知、核心设计、合规验证、工程落地和前沿拓展五大模块,采用理论讲解与工程实践深度融合的教学路径,通过规范条款拆解、仿真预验证、硬件实现、试验检测等环节,培养学员从设计到落地的完整能力。课程强调标准合规性,每个设计环节均有明确规范约束,并提供标准化工程模板,确保学习成果可直接应用于实际项目开发。

技术工作者 995

免费在线流程图编辑器完整指南:mermaid.live 从画到分享

不用装软件,也不用注册账号:浏览器打开 mermaid.live,官方 Mermaid Live Editor 就能用,左侧编辑区敲几行语法,右侧立刻出图。相比来回传图片文件、流程一改就得重画的旧办法,画图、分享、导出被收进了同一个页面。 ## 官方免费 mermaid 编辑器:不装、不注册 它基于 SvelteKit 框架开发,MIT 协议开源,想在内网跑一份,自部署就行。因为是官方实现,渲

gitblog_00152的博客 898

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 462

Android应用安全实战:从InsecureBankv2靶场到移动安全漏洞系统化挖掘

移动应用安全是当今数字时代的关键议题,其核心在于识别和防范应用中的潜在风险。从技术原理层面,Android应用的安全漏洞常源于不当的组件暴露、不安全的数据存储、脆弱的通信加密以及逻辑缺陷。这些漏洞的技术价值在于,一旦被利用,可能导致数据泄露、身份盗用甚至金融损失。在应用场景上,无论是金融、社交还是工具类App,都需要系统化的安全评估。本文以经典的Android安全学习靶场InsecureBankv2为例,深入剖析其预设的各类漏洞,并演示如何结合静态分析、动态测试及Frida插桩等技术,构建一套从环境搭建、信

weixin_30522183的博客 403

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2176

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

之前几篇我们讨论了如何设置信令服务器,如何发送画面给远端以及如何用浏览器查看同步画面,今天来讨论如何实现Unity内部接收画面。看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。在Unity编辑器中打开一个示例项目,点击BroadCast按钮。4. 再点击Receiver按钮,Start。Build一个示例项目,并运行这个项目。启动Web.app。

每日出拳老爷子的博客 1721

移动应用安全逆向实战:MARA框架从入门到精通

移动应用安全是软件开发生命周期中至关重要的环节,其核心在于通过逆向工程深入理解应用内部机制,从而主动发现并修复潜在风险。逆向工程通过静态与动态分析技术,解析应用代码逻辑与运行时行为,为构建主动防御体系提供关键洞察。在工程实践中,集成化的安全测试框架能极大提升分析效率与深度。MARA Framework正是这样一个模块化、自动化的移动应用安全分析平台,它通过集成JADX、Frida等顶级开源工具链,将繁琐的逆向流程标准化。该框架支持对Android APK进行自动化静态漏洞扫描(覆盖OWASP Mobile

weixin_36250534的博客 414

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

H2O 内置 mruby-json 完全指南:在 mruby 处理器中解析与生成 JSON

mruby-json 是面向 mruby(轻量级嵌入式 Ruby)的 JSON 解析与序列化 mrbgem,被 H2O 作为 deps 目录下的内置依赖随附于仓库中,可在 H2O 的 mruby 处理器脚本(如 `mruby.handler` 配置)里直接调用。本文以 [deps/mruby-json/README.md](https://link.gitcode.com/i/f2d484d5c2

gitblog_00331的博客 478

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android安全测试神器大全(含静态测试、动态分析、反编译等)

在线分析 1. AndroTotal 2. Tracedroid 3. Visual Threat 4. Mobile Malware Sandbox 5. Appknox – 非免费

人生不怕起点低,就怕没追求 2721

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android反编译-smali语法

前面我们有说过android反编译的工具,如何进行反编译。反编译后可以得到jar或者得到smali文件。Android采用的是java语言进行开发,但是Android系统有自己的虚拟机Dalvik,代码编译最终不是采用的java的class,而是使用的smali。我们反编译得到的代码,jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。因此,我们有必要熟

icy_xm的专栏 1012

Android Studio动态调试APK实战:从Smali反编译到源码级调试

在Android应用安全分析与逆向工程领域,动态调试是一项核心技术,它允许开发者和安全研究员深入理解应用在运行时的真实行为。其原理是通过调试器与目标进程建立连接,实时监控和修改内存状态、执行流程及寄存器值,从而突破静态分析的局限。这项技术的核心价值在于能够精准定位加密算法、关键逻辑判断和网络协议等黑盒逻辑,对于安全评估、漏洞挖掘、竞品分析和疑难问题排查具有不可替代的作用。典型的应用场景包括分析第三方SDK、检测恶意代码、逆向协议以及调试加固应用。本文以android studio动态调试apk和smali代

weixin_30650039的博客 276
上一篇: 【JAVA代码审计】————4、XSS
下一篇: 【移动安全高级篇】————10、动态分析so
FLy_鹏程万里
FLy_鹏程万里 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄9年 1万+粉丝 1364原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值