Android逆向入门之常见Davlik字节码解析

目录
  • 破解流程
  • 相关知识
    • 寄存器
    • 复杂指令集和精简指令集
    • jvm和davlik的一些区别
  • 常见Davlik字节码解释
  • 破解程序
    • 分析修改smail文件
    • 重新签名

破解流程

破解Android程序流程:反编译—>分析–>修改–>回编译–>签名,这些都是在命令行中操作,当然也有集成了这些操作的工具:

macos:Android-Crack-Tool

Windows:Android Killer

相关知识

寄存器

这里解释下寄存器的概念,寄存器是用来存储

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。也就是存储来存储数据的。现在所有手机都是用的arm芯片

这里说一些题外话:比较常见的CPU有intel的X86架构的CPU的还有arm架构的CPU,其中intel的X86架构的cpu指令集有复杂指令集和精简指令集,arm中只有精简指令集。

复杂指令集和精简指令集

所谓复杂和简单就是根据是否要根据程序来设计指令来提高计算机的性能,复杂指令集会根据应用程序来增加一些复杂功能的指令集,这样也就导致CPU的指令越来越多越设计越复杂造价也越高,而精简指令集则不会根据程序来设计指令集,那么怎么提高性能?

jvm和davlik的一些区别

翻译成机器码的工作就是由高级语言的编译器来做的,把这些工作交给了编译器。所以两种区别就是复杂指令集会根据程序来增加自己的指令集达到提高计算机性能的作用,精简指令集则是交给了编译器去做指令转换的工作。由于加入了编译器的转换所以运行速度会慢,而且占用的内存也会变多,同样的程序在arm芯片的手机上和intel芯片的电脑上,手机上占用的空间更多。精简指令集的arm架构还有一个特点是其寄存器特别多,而davlik虚拟机利用这个特性对原本java虚拟机进行了改动:

java虚拟机中每个线程都会有一个PC计数器和一个java栈,PC计数器用于记录程序执行到哪个地方,java栈中用来记录java方法的调用记录叫做栈帧,每调用一个方法就会分配一个新栈并压入java栈,每个栈帧都包含局部变量区,求值栈(jvm叫做操作数栈),局部变量区用来存储方法的参数和局部变量,求值栈用于保存求值的中间结果及调用其他方法的参数。方法运算时从栈中的局部变量区取数据进行运算将结果存放在操作数栈中,最后返回的时候从操作数栈中弹出结果

而davlik虚拟机运行时中也为每一个线程维护了一个PC计数器和一个调用栈,不同的是这个调用栈中维护了一个寄存器列表,至于虚拟寄存器分配多少个是根据方法结构体中的registers字段给出,davlik虚拟机根据这个字段创建一份虚拟的寄存器列表。将java栈帧中的局部变量区和操作数栈换成了寄存器列表来存储。所以java虚拟机是基于栈架构,而davlik虚拟机基于寄存器架构

常见Davlik字节码解释

1.常见Davlik字节码:

定义字段类型:

check-cast 寄存器(操作数),定义的类型;
举例:
check-cast v0,Lcom/android/Launcher2/launcherApplication;

代表定义v0的类型为LauncherApplication
字段写入字段读取(通用解释)

总结:指令 目的操作数 源操作数前面代表指令 寄存器中的值(操作数) 所属类 变量名 变量属性本质上指令操作的还是操作数,根据指令变量是读取还是被赋值读取get:读取变量赋值给操作数赋值set:赋值变量的值为操作数的值

静态字段写入:

const 寄存器 ,值所对应的ID(0X0代表为null)
sput-object 寄存器,字段所属的类;->字段名字:字段类型

const/4 v3, 0x0
sput-object v3, Lcom/disney/Class1;->globalIapHandler:Lcom/disney/config/GlobalPurchaseHandler;
将0x00(代表null)存入v3寄存器中
将v3寄存器中的值写入Class1中的globalIapHandler变量,该变量类型为GlobalPurchaseHandler,
也就是Class1.globalIapHandler = null;

静态字段读取:

sget -object 寄存器, 字段所属的类;->字段名称:字段类型
举例:
sget-object v0, Lcom/disney/Class1;->PREFS_INSTALLATION_ID:Ljava/lang/String;
读取Class1中的PREFS_INSTALLATION_ID变量,该变量类型为String

普通字段写入:

.local v0, args:Landroid/os/Message;
const/4 v1, 0x12
iput v1, v0, Landroid/os/Message;->what:I
将args变量存入v0寄存器中
将0X12传入到v1寄存器中
设置Message中的what变量为v1的值
相当于 args.what=18;

普通字段读取:

iget-object 寄存器 p0(代表该变量所在类的示例即this), 字段所属的类;->字段名字:zidaun1:字段类型
举例:
iget-object v0, p0, Lcom/disney/Class1;->_view:Lcom/disney/Class2;
从v0寄存器中拿Class1中的_view变量,这个变量类型为Class2

调用方法:

invoke-virtual {寄存器:调用者(p0代表this)和方法参数信息}, 方法所在的类;->方法名(参数) 返回值

举例:
invoke-virtual {p0},Lcom/android/Launcher2/Launcher;_>getApplication()L android/app/Application;
java实现代码为:(this.)getApplication();

调用父类方法:

invoke-super {寄存器 :代表调用者和参数},方法所属的类;->方法名称(参数类型)返回值【V代表无返回值】

invoke-super {p0,p1},Landroid/app/ActivityGroup;->onCreate(Landroid/os/Bundle;)V

调用接口:

invoke-interface {寄存器【和方法一样也是调用者和方法参数信息】}, 方法所属的接口全名;->方法名(参数类型)返回值

invoke-interface {v3,v6,v9},Landroid/content/SharedPreferences;->getBoolean(Ljava/lang/String;Z)Z
java实现代码为:v3.getBoolean(v6,v9);

判断语句:

一,if-nez(与if-eqz相反)
if-nez 寄存器(里面存储的是操作数), :标号处
如果操作数不为null或者不为0或者不相等就跳转到标号处执行代码
举例:
move resule v0 (将上一条命令的结果赋值给v0)
if-nez v0, :cond_0
(判断其值不为0【条件为真】就跳转到cond_0标号处,反之程序继续执行直到执行到return-void指令处)

二,if-eqz
表示在结果为0或者相等时跳转(与if-nez相反)

方法返回:

return-void 没有返回值

破解程序

分析修改smail文件

1.修改完smali文件安装到手机上

重新编译,回编译命令为

apktool b 文件地址

回编译中常见的错误:
1.提示"at brut.androlib.Androlib.buildResourcesFull(Androlib.java:477)"
解释:该问题为打包资源出错,程序使用的的API版本号和apkool中framework-res.apk基于Android的版本不一致导致
举例:程序使用的API版本号为25;而apkttol版本号为2.2.2其对应的framework-res.apk的版本是基于Android6.0的,
其API为23。两者不一致
解决方法为:找一台API和程序使用的API版本号一致的android设备,从中获取framework-res.apk,并把这个apk安装到本地
使用命令:
(1.)获取android设备中的framework-res.apk:
adb pull /system/framework/framework-res.apk
(2.)安装到本地apktool中
apktool if ./framework-res.apk

重新签名

编译完生成的APK文件是没有进行签名的,所以不能安装。

通过signapk对APK文件进行签名
使用命令:
cat /User/android/Program/signapk
#!/bin/sh
java -jar ~/Program/signapk_jar/signapk.jar ~/Program/signapk_jar/testkey.x509.pem ~/Program/signapk_jar/testkey.pk8 $1 signed.apk
这些文件都可以从android源码中提取。
接着完成apk的签名操作:
signapk 编译后未签名的apk文件地址
签名后完成后会在上面的文件地址里面生成sign.apk文件

到此这篇关于Android逆向入门之常见Davlik字节码解析的文章就介绍到这了,更多相关Android Davlik 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用android-apktool来逆向(反编译)APK包方法介绍

    谷歌官方提供了apktool可以逆向已经发布出去的APK应用,即反编译已经打包成功的APK文件,使用它可以将其反编译成非常接近打包前的原始格式,对于APK来说,可以具体的逆向AndroidManifest.xml.资源文件resources.arsc以及将dex文件反编译成可以调试的smali文件. Warnning 但apktool并不等于是可以用来侵犯前作者的作品的工具,所以使用apktool工具的用户千万不用用其来进行不正当.非法的使用. It is NOT intended for pi

  • Android 逆向学习详解及实例

    断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的.当然要深入的话还需要对这门语言的细节特性和奇技淫巧进行挖掘. 这里推荐2本书,个人觉得对android开发入门和android逆向入门比较好的教材: <google android 开发入门与实战> <android 软件安全与逆向分析> 1. 我对android逆向的认识 因为之前有一些windows逆向的基础,在看andr

  • Android逆向技巧——去除开屏广告

    相信不少网友都有相似的经历:很多app刚开始用的时候很清爽,没啥广告:等用了一段时间后厂家就开始大量上广告的了,我个人觉得这是典型的利用大数据杀熟:厂家看到用户的月活.日活都挺高的,说明用户对自己的app已经产生依赖,此时可以开始"杀猪吃肉"了!开屏广告是我最讨厌的一种:点开app就被逼着看,而且非会员一般要5秒后才能跳过,不想被逼着看广告的就花钱充会员:怎么才能不花钱去掉app的开屏广告了? 先简单回顾一下windows下PE文件的执行原理:PE文件的文件头有个字段叫AddressO

  • Android逆向之dex2oat的实现解析

    目录 简介 dex2oat介绍 为什么要使用dex2oat进行转换 dex2oat代码 1.dex2oat类定义 2.OpenDexFiles函数定义 3.dex2oat入口函数定义 总结 简介 在Android系统5.0及以上系统开始逐渐丢弃Dalvik虚拟机,由于ART虚拟机对内存分配和回收都做了算法优化,降低了内存碎片化程度,回收时间也得以缩短,所有android系统5.0及以上都在主推ART虚拟机.在ART虚拟机中ART则会将Dex通过dex2oat工具编译得到一个ELF文件,它是一个可

  • Android逆向入门之常见Davlik字节码解析

    目录 破解流程 相关知识 寄存器 复杂指令集和精简指令集 jvm和davlik的一些区别 常见Davlik字节码解释 破解程序 分析修改smail文件 重新签名 破解流程 破解Android程序流程:反编译->分析–>修改–>回编译–>签名,这些都是在命令行中操作,当然也有集成了这些操作的工具: macos:Android-Crack-Tool Windows:Android Killer 相关知识 寄存器 这里解释下寄存器的概念,寄存器是用来存储 寄存器是CPU内部用来存放数据的

  • JVM入门之类加载与字节码技术(类加载与类的加载器)

    1. 类加载阶段 1.1 加载阶段 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有: _java_mirror 即 java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴 露给 java 使用 _super 即父类 _fields 即成员变量 _methods 即方法 _constants 即常量池 _class_loader 即类加载器 _vtable 虚方法表 _ita

  • Android okhttp的启动流程及源码解析

    前言 这篇文章主要讲解了okhttp的主要工作流程以及源码的解析. 什么是OKhttp 简单来说 OkHttp 就是一个客户端用来发送 HTTP 消息并对服务器的响应做出处理的应用层框架. 那么它有什么优点呢? 易使用.易扩展. 支持 HTTP/2 协议,允许对同一主机的所有请求共用同一个 socket 连接. 如果 HTTP/2 不可用, 使用连接池复用减少请求延迟. 支持 GZIP,减小了下载大小. 支持缓存处理,可以避免重复请求. 如果你的服务有多个 IP 地址,当第一次连接失败,OkHt

  • 浅谈javap命令拆解字节码文件

    目的拆解分析反编译字节码 解析成人能够理解的结构 ,然后再对字节码文件进一步分析 源代码 public class test { private static int classV =2; public static void main(String[] args) { classV =200; int localV =4; localV =400; } } 二进制 idea bin_ed插件查看. 看不懂 那就使用人能看的懂的汇编语言查看类文件结构和代码指令. javap 指令和选项 0:无选

  • java Class文件结构解析常量池字节码

    目录 Class文件结构 整体结构 文件头 常量池 属性表 Code_attribute结构 函数表/字段表 字节码解析 Class文件结构 整体结构 ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class

  • 使用Android studio查看Kotlin的字节码教程

    Kotlin是一门JVM语言,它被google大力推广,现如今已经是Android官方推荐的开发语言了.为了更好的学习Kotlin,你必须要从字节码的角度来看待语法特点,这样可以更好的加深自己的理解.这篇文章就是教大家如何通过Android studio来查看Kotlin编译后的字节码. 1.首先选中你要显示字节码的文件,之后点击顶部工具栏中的 Tools ->选中 Kotlin ->在弹出菜单中点击 Show Kotlin Bytecode. 2.点击之后在Android studio最右侧

  • Android进阶从字节码插桩技术了解美团热修复实例详解

    目录 引言 1 插件发布 2 Javassist 2.1 准备工作 2.2 Transform 2.3 transform函数注入代码 2.3.1 Jar包处理 2.3.2 字节码处理 2.4 Javassist织入代码 2.4.1 ClassPool 2.4.2 CtClass 引言 热修复技术如今已经不是一个新颖的技术,很多公司都在用,而且像阿里.腾讯等互联网巨头都有自己的热修复框架,像阿里的AndFix采用的是hook native底层修改代码指令集的方式:腾讯的Tinker采用类加载的方

  • 详解Java字节码编程之非常好用的javassist

    一.Javassist入门 (一)Javassist是什么 Javassist是可以动态编辑Java字节码的类库.它可以在Java程序运行时定义一个新的类,并加载到JVM中:还可以在JVM加载时修改一个类文件.Javassist使用户不必关心字节码相关的规范也是可以编辑类文件的. (二)Javassist核心API 在Javassist中每个需要编辑的class都对应一个CtCLass实例,CtClass的含义是编译时的类(compile time class),这些类会存储在Class Poo

  • Android基于OpenCV实现QR二维码检测

    目录 QR二维码 QR二维码格式 QR二维码结构 API QRCodeDetector类结构 检测QR二维码 识别QR二维码 检测并识别QR二维码 操作 结果 源码 QR二维码 QR码(英语:Quick Response Code:全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明.QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以快速解码其内容.QR码使用四种标准化编码模式(数字.字母数字.字节(二进制)和日文(Shift_

随机推荐