Dalvik指令分析(一) hex to instruction

AI赋能FRIDA:智能二进制动态分析与自动化Hook实践 动态二进制插桩是软件逆向与安全分析中的关键技术,通过在程序运行时注入代码来监控和修改其行为。其核心原理是在目标进程的内存空间中插入探测点,实现对函数调用、参数传递等执行细节的透明观察。这项技术的工程价值在于能够绕过静态混淆和加密,直接观测程序的真实逻辑,极大提升了漏洞挖掘、协议分析和恶意代码检测的效率。传统动态分析高度依赖人工经验,面临目标定位难、脚本编写繁琐、结果筛选低效等瓶颈。随着机器学习技术的发展,AI模型通过学习海量二进制代码模式,能够自动识别关键代码区域并预测程序行为,为动态分析提供智能引导。将A 阅读详情

       有过android应用反编译或者再打包的朋友都有使用过apktool的经验,apktool能将dex文件的

字节码转换为smali代码,这个工具是怎么做到对dex进行解析并生成smali代码的呢?这就需要对

dex文件的格式很熟悉、需要掌握dalvik指令的字节码格式,并能翻译成对应的smali代码。

        我准备写一系列的文章来分析dex文件的格式、dalvik字节码的格式、以及dex to smali的方法,

基于此可以做很多的应用,比如安全扫描、应用加固等等!

Dalvik指令介绍请参考官方文档:General design  如果读者对X86或者ARM指令集有一定的了解,

学习Dalvik指令还是很容易的。如果您掌握了Dalvik指令集,就能将dex文件转换为smali代码,这也

是很多android安全研发人员的基本功。


下面以一个例子开始来讲解Dalvik指令集:

实例1:将如下davik字节码翻译为smali代码,从高字节到低字节为:00 02 2C 69 10 70

翻译步骤:(用程序语言描述)

step1: 将00 02 2C 69 10 70赋值给变量instr

step2: 低8bits为opcode,即OP = instr & 0xff 得到 0x70,对应的指令为invoke-direct,查询官方文档

           可知0x70指令对应的指令格式为35c,即长度为6个字节,最多有5个寄存器,如下图:

70invoke-direct { parameters }, methodtocallInvokes a method with parameters without the virtual method resolution.7010 0800 0100 - invoke-direct {v1}, java.lang.Object.<init>:()V // method@0008
Invokes the 8th method in the method table with just one parameter, v1 is the "this" instance5.
          

format为35c的指令:长度为6bytes( 3*2)  5代表寄存器数量  c代表const pool index

35c格式的指令:

A|G|opBBBB F|E|D|C 35c [A=5] op {vC, vD, vE, vF, vG}, meth@BBBB
[A=5] op {vC, vD, vE, vF, vG}, type@BBBB
[A=4] op {vC, vD, vE, vF},kind@BBBB
[A=3] op {vC, vD, vE}, kind@BBBB
[A=2] op {vC, vD}, kind@BBBB
[A=1] op {vC}, kind@BBBB
[A=0] op {}, kind@BBBB

The unusual choice in lettering here reflects a desire to make the count and the reference index have the same label as in format 3rc.

该指令的字节(按照地址从高到低): 00 02 2C 69 10 70

即op=70,op的高8位为A|G,所以左右12位就可以得到A的值,因为这是小端字节序,所以A|G|op被存放在低地址

A: argument word count,寄存器的个数(4bits)

B: method reference index  (16bits)

C..G: argument registers (4bits each=20bits)


step3: 获取A G位的值,G = (instr >> 8) & 0xf = 0,   A = (instr >> 12) & 0xf = 1,即A等于1,对应的指令格式为:

           [A=1] op {vC}, kind@BBBB  

step4: 获取C和BBBB的值:C = (instr >> 32) & 0xf = 2,所以寄存器为v2,BBBB = (instr >> 16) & 0xffff = 0x2C69 = 11369

           BBBB即为method index,以11369作为下标,查询method表获得该方法对应的描述如下:

struct method_id_item method_id[11369]	
void java.lang.Object.<init>()	33A04h	8h	Fg: Bg:0x008080	Method ID</span>

所以上述16进制代码对应的dalvik指令为:

invoke-direct       v2, Ljava/lang/Object;-><init>()V</span>

 

小结: 35C格式的指令是dalvik指令集里比较复杂的一种指令,读者可以对照上述步骤,再仔细分一下转换过程,

如果能将35C格式的指令分析明白了,再分析别的指令也不是难事。

参考网址:

1. https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html

2. https://source.android.com/devices/tech/dalvik/instruction-formats.html

AI逆向工程师学习路线:从爬虫基础到智能Agent实战 在网络安全与数据采集领域,逆向工程是理解系统内部逻辑、分析数据流与协议的关键技术。其核心原理在于通过静态分析与动态调试,解析软件或网络应用的行为机制,从而复现或绕过其限制。随着AI大模型的兴起,传统逆向技术正与智能体(Agent)深度融合,催生出新一代技术范式。AI能够辅助工程师快速理解混淆代码、生成解密函数,甚至构建自适应网站变化的智能爬虫Agent,极大提升了逆向分析与数据采集的效率和智能化水平。这种融合技术尤其适用于复杂反爬策略应对、自动化安全测试及大规模数据采集等场景,为工程师提供了从基础爬虫到AI 阅读详情

相关推荐

Dalvik 指令集 for2010

Dalvik 指令集 for2010

Dalvik指令集

类型 语法 含义 V void,只用于返回值类型 Z boolean B byte S short C char I int J long F float D double L Java类类型 [ 数组类型 方法 方法格式...

deo91209的博客 212

Dalvik指令集.doc

安卓虚拟机的操作指令文档

全网最全 Dalvik 指令集解析 !

为什么是全网最全,因为根本没人整理 Dalvik 指令集。。 本文档纯粹作为一个 Dalvik 指令集速查表,相信一定有需要的同学。 文末扫码关注公众号,回复 Dalvik 获取本文档 pdf 版本 ! 首先说明 Dalvik 虚拟机的基本约定 。 Dalvik 寄存器都是 32 位的,64 位数据使用相邻两个寄存器来存储 下表中提到的寄存器对均指相邻两个寄存器。如寄存器对 vAA,指寄存器...

weixin_34060299的博客 590

ck3m多轴运动控制器笔记1:电机的配置与注意事项

利用PMAC(CK3M)运动控制器来实现对电机的控制,对具体的配置流程和注意事项讲解

p975468132的博客 4641

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

Android Protect-0.Dalvik语言基础简介

Dalvik语言基础简介

hgy413的专栏 873

Windows Server远程桌面断开后,PyWinAuto/按键精灵脚本失效?试试这个‘会话保持’的终极配置

本文深入解析Windows Server远程桌面断开后导致PyWinAuto/按键精灵脚本失效的问题,提供会话保持的终极配置方案。通过转换到控制台会话(console模式)和调整组策略,确保自动化程序在断开连接后持续稳定运行,适用于Windows Server各版本。

weixin_28738165的博客 227

Android Dalvik 指令集

本篇文章同时收录在我的个人博客:Android Dalvik 指令集 前言 目前 DEX 可执行文件主流的反汇编工具有 BakSmali 与 Dedexer,本篇文章 Dalvik 指令的语法都采用的 Smali 语法格式。 了解 Dalvik 寄存器 Dalvik 虚拟机基于寄存器架构,作用与特定的 CPU 上运行,设计之初采用了 ARM 架构,ARM 架构的 CPU 本身集成了多个寄存器,Da...

weixin_33709219的博客 313

告别手动发日报!用n8n+钉钉打造智能报告机器人(含模板下载)

本文详细介绍了如何利用n8n开源工作流自动化平台与钉钉机器人搭建智能日报系统,实现数据自动采集、处理和发送。通过实战步骤和模板下载,帮助用户告别手动处理日报的繁琐,提升工作效率和数据准确性。

h3i4j的博客 857

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

如何高效学习Java? 毕业设计项目应该怎么做?入门实战项目应该怎么做? 做Java开发都应该学习哪些框架技术? 我想来跟你聊聊为什么要学习此专栏?我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,当你迷茫想努力没有方向时,最事半功倍的方法是:找人带你! 因为过来人,更懂得如何学、如何做、如何少走弯路! 那今天就给大家带来一门专栏课程,由 天罡gg 和 经海路大白狗 两位实力大牛合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

天罡gg的专栏 2万+

Android逆向基础——Dalvik 指令集

Dalvik指令集是学习Android虚拟机中必不可少的知识点,它是被Android虚拟机所识别且直接执行的指令。

玄道的网安博客 6415

SOC、SOH、OCV

1)放电实验法的测量SOH结果最为准确,但是深度放电会对影响电池的寿命;2)电阻折算法仅将电阻作为评价SOH的依据,但电池老化时电阻的变化范围较小,因此该方法的误差较大;3)电阻折算法需要对电池进行大量的实验,绘制成Map图,但是该方法有一定的局限性,针对不同的电池需要绘制不同的Map图;4)阻抗分析法是目前最为前沿的方法,可以根据阻抗谱较为直观的分析SOH的变化,但是该方法需要的成本较高,每台设备约为5万美元。

m0_61973119的博客 2万+

smali文件语法参考

Dalvik opcodes Author: Gabor Paller Vx values in the table denote a Dalvik register. Depending on the instruction, 16, 256 or 64k registers can be accessed. Operations on long and double values

qq591840685的专栏 1257

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

862

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1534

Dalvik 指令集

Dalvik 指令集格式 基础字节码 -名称后缀/字节码后缀 目的寄存器 源寄存器 例如 move-wide/from 16 vAA ,vBBBB; move:基础字节码,表示基本操作 wide:名称后缀 ,表示指令操作的数据宽度为64位不加后缀默认32位) 这个数据宽度到底是什么意思呢? 数据宽度指在单位时间内可以传递的数据量,一次可以处理的多少数据量 例如数据宽度为64位,那就表示一次能处理64位,8字节的数据(如有不对请大神斧正) from16:字节码后缀,表示数据源为16位寄存器引用变量 vAA:

weixin_41722852的博客 1217

WINCC7.3破解文件

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

安卓逆向系列教程(一)Dalvik 指令集

安卓逆向系列教程(一)Dalvik 指令集 作者:飞龙 寄存器Dalvik 指令集完全基于寄存器,也就是说,没有栈。所有寄存器都是 32 位,无类型的。也就是说,虽然编译器会为每个局部变量分配一个寄存器,但是理论上一个寄存器中可以存放一个int,之后存放一个String(的引用),之后再存放一个别的东西。如果要处理 64 位的值,需要连续的两个寄存器,但是代码中仍然只写一个寄存器。这种情况下,你

龙哥盟 5万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

常见的 256 条 Dalvik 字节码指令

Dalvik 字节码指令是 Android 虚拟机的指令集,广泛用于处理 .dex 文件中的代码。下面列出一些常用的 Dalvik 指令,但 Dalvik 指令集有很多操作码,这里仅列出 256 个常用指令及其功能简述。为简明起见,指令按类别分类。这 256 条指令涵盖了 Dalvik 指令集中常用的加载、移动、算术运算、逻辑运算、条件跳转、方法调用等指令类别。

1290

超详细的Dalvik指令

Dalvik虚拟机比Java虚拟机执行速度快 通过实例来对比Java字节码和Dalvik字节码的不同 源码如下: public class Hello { public static void main(String[] args){ Hello hello = new Hello(); System.out.println(hello.foo(5,...

凌烟醉卧的博客 3419

Android逆向学习笔记1:Dalvik语言基础(2)

DVM有专用的指令集和专门的指令格式DEX。其一些特点如下:1、基于寄存器的设计。方法在内存创建后有固定大小的栈帧。2、如果整数与浮点数按位表示,可以用32位寄存器来存放。3、指令流以16位无符号整型为存储单元。

weixin_58284606的博客 787

Android Dalvik虚拟机实战,学习Android开发的步骤

答应大伙的备战金三银四,大厂面试真题来啦!这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。《960全网最全Android开发笔记》《379页Android开发面试宝典》包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。

2401_84149557的博客 688

移动安全Android逆向系列:Dalvik概念&破解实例

Dalvik是google专门为Android操作系统设计的一个虚拟机,Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。Dalvik VM比JVM速度更快,占用空间更少。在Java代码中我们无法修改某个逻辑,所以需要将java代码翻译成smali代码,也就是将dex文件转换为smali文件。

qq_53058639的博客 1158

Dalvik可执行格式和字节码规范

<<Android软件安全权威指南>>笔记 第三章 Dalvik可执行格式与字节码规范 早期Android是Dalvik虚拟机,Android4.4以后,引入ART(Android Runtime)虚拟机 JIT(Just-In-Time)即时编译,AOT(Ahead-Of-Time)预先编译 ART提供对Dalvik的可执行格式与字节码的支持 Dalvik虚拟机 特点 专有DEX(Dalvik Executable)可执行文件格式 常量池32位索引 基于寄存器架构,完整指令系统 D

z1nk的博客 1353

smali语法中文版

表中的vx、vy、vz表示某个Dalvik寄存器。根据不同指令可以访问16、256或64K寄存器。 表中lit4、lit8、lit16、lit32、lit64表示字面值(直接赋值),数字是值所占用位的长度。 long和double型的值占用两个寄存器,例:一个在v0寄存器的double值实际占用v0,v1两个寄存器。 boolean值的存储实际是1和0,1为真、0为假;boolean型的值实际是转成int型的值进行操作。 所有例子的字节序都采用高位存储格式,例:0F00 0A00的编译为0F, 00, 0A

qq_18477271的博客 2429
上一篇: 运用smali自动注入技术分析android应用程序行为
下一篇: Dalvik指令分析(二) 从java文件到dex
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值