首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 逆向之 smali

Dalvik字节码 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...JD-GUI看的代码有很多是混淆过的,但是一些系统回调方法是不能混淆的,比如onCreate 首先看这个类有没有静态方法和静态代码块,因为这类代码会在对象初始化前运行,可能在这里加载so文件,或者是加密校验等操作...Object 数组: 在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F 对象: 以L作为开头,格式是LpackageName/objectName; String...对象在smali中为:Ljava/lang/String; 类里面的内部类:LpackageName/objectName$subObjectName; 函数 函数公式为: Func-Name (...写一个打印log的静态类 将其转换成smali文件 把文件放入工程里 在要打印log的地方添加如下代码: invoke-static {v1}, Lcom/softard/MyLog;->

2K31

Android逆向之--------常见Davlik字节码解释

: check-cast v0,Lcom/android/Launcher2/launcherApplication; 代表定义v0的类型为LauncherApplication 字段写入字段读取(通用解释...赋值set:赋值变量的值为操作数的值 静态字段写入: const 寄存器 ,值所对应的ID(0X0代表为null) sput-object 寄存器,字段所属的类;->字段名字:字段类型 const/4...globalIapHandler = null; 静态字段读取: sget -object 寄存器, 字段所属的类;->字段名称:字段类型 举例: sget-object v0, Lcom/disney.../Class1;->PREFS_INSTALLATION_ID:Ljava/lang/String; 读取Class1中的PREFS_INSTALLATION_ID变量,该变量类型为String 普通字段写入...cond_0标号处,反之程序继续执行直到执行到return-void指令处) 二,if-eqz 表示在结果为0或者相等时跳转(与if-nez相反) 方法返回: return-void 没有返回值

41830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    android apk 防止反编译技术第二篇-运行时修改字节码

    接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码。这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创。...link_size 0x2C 4 连接段的大小,如果为0就表示是静态连接。 link_off 0x30 4 连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0。...详细的dex文件介绍就不说了,有兴趣的可以查看android 源码dalvik/docs目录下的dex-format.html文件有详细介绍。不过我记得在android4.0版本后就没有了这个文件。...dex文件的解析在dalvik源码的dexDump.cpp给出了我们具体的实现,根据它的实现我们可以查找我们需要的类及方法。...,"com.android.dex", i+1); base = get_module_base(-1,filename);//获得odex文件在内存中的映射地址 if(base !

    1.4K110

    Android 逆向笔记 —— 说说 Dalvik 及其指令集

    例如 String 对象,其全限定名是 java/lang/String;,在 Dalvik 中就表示为 Ljava/lang/String;。...字段 字段的表示统一用如下格式: 类型;->字段名称:类型描述符 比如一个 com.test.Test 类中的一个 String 类型的 name 字段,在 Dalvik 中就可表示为: Lcom/test...以 com.test.Test 类中的 add() 方法为例,就是上面用到的两数相加的函数,其在 Dalvik 中描述为: Lcom/test/Test;->add(II)I add(II) 中的两个...字段操作指令 字段操作指令分为两类,分别是对于普通字段和静态字段的操作。...语法 说明 sstaticop vAA, field@BBBB 对已标识的静态字段执行已确定的对象静态字段运算,并将结果加载或存储到值寄存器中 针对不同类型的静态字段,有如下命令: sget、sget-wide

    1.3K10

    Class文件进阶详解

    ACC_PUBLIC:意义:表示该类是公共的,可以被其他类访问。解释:具有ACC_PUBLIC标志的类对于其他类是可见的,可以在同一包中或不同包中的其他类中访问。...在 Java 虚拟机规范的早期版本中,用于实现虚拟方法调用的指令是invokespecial,它被用来调用超类中的构造方法。...它仍然会被设置,但是在实际的虚拟机实现中可能没有直接的影响。...3.常量池总结常量池是类文件中存储常量的表,包括类的如下几种信息:字段(Fieldref):类的字段对应的Fieldref(字段引用常量)也存放在常量池中。...4.常量池中的信息常量池中的第一位,如果有静态方法,并且静态方法中有字符串,则第一位会给这个字符串。如果没有静态方法,则第一位给父类的构造方法。

    11010

    .apk反编译_apk反编译教程

    Dalvik字节码 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...一、smali的数据类型 在smali中,数据类型和Android中的一样,只是对应的符号有变化: •B—byte •C—char •D—double •F—float •I—int •...“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali...中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。...这个String成员变量获取并放到v0这个寄存器中,注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。

    9.5K30

    smali基本语法

    [] 对象数组 注:每一维最多255个④类字段/变量 Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String; smali字段                                            ...1.赋值 静态static const-string v0, "Hello Smali" sput-object v0, Lcom/MyActivity;->name:Ljava/lang/String...取值 静态(static fields) sget-object v0, Lcom/MyActivity;->name:Ljava/lang/String; 相当于java代码 v0 = MyActivity.name...invoke-virtual 调用protected或public方法 return-void 表示方法结束返回void p0 在静态方法中表示当前对象实例 p1 表示当前onCreate方法参数...()I move-result v2 v2保存的则是调用String.length()返回的整型 注: Long和Double类型是64位,需要2个寄存器存储参数 例如: myMethod(IJ

    1.2K00

    破解第一个Android程序

    > 在开发Android程序时,string.xml文件中的所有字符串资源都在gen//R.java文件的String类中标识,每个字符串都有唯一的int类型的索引值。...可以猜测:ApkTool内部使用baksmali将APK中的DEX文件反编译为smali文件,但ApkTool在反编译APK时没有处理instant-run.zip中的DEX文件,因此,在反汇编输出信息中没有程序真正的反汇编代码...grep是macOS和Ubuntu的自带命令,在Windows中该命令可以通过Cygwin来安装。使用grep -r命令,可以在指定的目录中搜索包含特定字符串的文件。...其中,->this$0是内部类MainActivity$1中的一个synthetic字段,存储的是父类MainActivity的引用。...安装和测试 启动一个Android模拟器,或者使用数据线将Android设备和计算机连接起来,在终端执行adb uninstall命令卸载原来安装的程序,然后执行adb install命令安装破解后的程序

    3.4K20

    探究Android中的注解

    归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android...中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. 1 2 3 dependencies { compile 'com.android.support:support-annotations...) 如果我们在不知情或者疏忽情况下,传入这样的值,就会出现问题....因为它的判断依据是,如果updateView的线程注解(这里为@UiThread)和run(没有线程注解)不一致才会错误提示.如果run方法没有线程注解,则不提示....Keep 在Android编译生成APK的环节,我们通常需要设置minifyEnabled为true实现下面的两个效果 混淆代码 删除没有用的代码 但是出于某一些目的,我们需要不混淆某部分代码或者不删除某处代码

    80920

    smali hello

    则跳转到:cond_** "if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_** 常用逻辑 if-eqz if-nez smali语法 invoke-static 是类静态方法的调用...,编译时,静态确定的; invoke-virtual 虚方法调用,调用的方法运行时确认实际调用,和实例引用的实际对象有关,动态确认的,一般是带有修饰符protected或public的方法; invoke-direct...没有被覆盖方法的调用,即不用动态根据实例所引用的调用,编译时,静态确认的,一般是private或方法; invoke-super 直接调用父类的虚方法,编译时,静态确认的。.../lang/String;)V #声明静态main()方法 .registers 4 #程序中使用v0、v1、v2寄存器与一个蚕食寄存器 .parameter #一个参数 .prologue....super Ljava/lang/Object;#定义父类 .method public static main([Ljava/lang/String;)V#声明静态main()方法 .registers

    54730

    深入探索 APKTool:Android 应用的反编译与重打包工具

    Field Table:列出所有类中的字段,包括字段的名称和类型。 Method Table:列出所有方法,包括方法名、返回类型和参数。...Class Definitions:包含所有类的详细信息,如类的访问权限、父类、接口、源文件名、静态值以及类中定义的方法和字段。 Data Section:包含所有类的数据,如代码实现和静态数据。...类型安全和检查:在反汇编过程中,baksmali 也会尝试解析和表示类型信息,以确保转换后的 smali 代码在类型安全和逻辑上是准确的。...构建资源映射:通过解析资源表和相关的包、类型、键结构,apktool 构建一个资源映射,这个映射允许它理解每个资源的具体信息和位置。...通过这些详细的步骤和解释,本文为开发者和安全研究人员提供了一个全面的工具,以便更好地理解、检查和修改 Android 应用,即使在没有原始源代码的情况下也能进行有效的修改和调试。

    97710

    安卓逆向系列教程 4.4 逆向云播 VIP

    然后我们点击那个“设置”,在设置界面上,我们如果点击“加入会员”,弹出这样一行消息。 ? 然后我们将其拖进 Android Killer,发现它是 e4a 编写的。 ?...程序窗口类中有两个,都在图片列表框1$表项被单击方法中。内容都是“您目前不是会员…”。设置窗口里的都是“加入会员”,是按钮的标题,和破解没太大关系。...我们在相同方法中寻找,只找到一处满足要求的地方: # 项目索引 .param p1, "\u9879\u76ee\u7d22\u5f15" # I .prologue const/4 v3, 0x1...我们可以看到p1为 1 时,首先获取了com/dgplay/公用模块的vip静态字段,判断它是不是1(v3),是的话就启动窗口,不是的话就弹出消息。...但是,在静态构造器中将这个字段赋成 1 是不行的,因为主界面中可能有将它重新赋成 0 的代码。我们搜索Lcom/dgplay/公用模块;->vip,结果如下: ? 其中只有主窗口和设置窗口有赋值。

    1.6K30

    关于Java中枚举Enum的深入剖析

    在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定。Java也不例外。Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析。...Season不能再继承其他的类 Season被标记成了final,意味着它不能被继承 static代码块 使用javap具体反编译class文件,得到静态代码块相关的结果为 static {};...:()I 事实果真如此,在switch-case中,还是将Enum转成了int值(通过调用Enum.oridinal()方法) 枚举与混淆 在Android开发中,进行混淆是我们在发布前必不可少的工作,...(Android中)该不该用枚举 既然上面提到了枚举会转换成类,这样理论上造成了下面的问题 增加了dex包的大小,理论上dex包越大,加载速度越慢 同时使用枚举,运行时的内存占用也会相对变大 关于上面两点的验证...除此之外,我们还需要对比可读性和易维护性来与性能进行衡量,从中进行做出折中 在Android中的替代 Android中新引入的替代枚举的注解有IntDef和StringDef,这里以IntDef做例子说明一下

    71230

    Android开发减少方法数的建议 博客分类: Android小技巧 方法数android

    现在的Android应用越来越庞大,开发者越来越能感受到方法数限制带来的影响。这里简单讲几个减少方法数的小建议。 1.什么是方法数?为什么它这么重要?    ...这要从dex的文件格式说起,在把源码编译、转化为dex文件格式时,dex文件中会有一个区域包含了所有源码中定义或引用的方法列表。这个区域中所有方法项的总数就是方法数。...很遗憾,Android在刚开始被设计的时候,这一区域的方法数量不能超过65536个,也就是2个字节表示的范围。当源码定义或引用的方法数量超过了这个限制的话,就会导致编译不成功,你说重要不重要呢? .../training/articles/perf-tips.html#PackageInner 解决办法: 很简单,把mValue和doStuff()的private修饰符去掉就好了,这样它的默认访问域为包级...); } } } 则实际在方法数列表中它只占2个方法 Class: Lcom/tencent/mobileqq/activity/DemoActivity; 2 Method:

    52250

    关于Java中枚举Enum的深入剖析

    在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定。Java也不例外。Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析。...不能再继承其他的类 Season被标记成了final,意味着它不能被继承 static代码块 使用javap具体反编译class文件,得到静态代码块相关的结果为 static {}; Code:...:()I 事实果真如此,在switch-case中,还是将Enum转成了int值(通过调用Enum.oridinal()方法) 枚举与混淆 在Android开发中,进行混淆是我们在发布前必不可少的工作,...(Android中)该不该用枚举 既然上面提到了枚举会转换成类,这样理论上造成了下面的问题 增加了dex包的大小,理论上dex包越大,加载速度越慢 同时使用枚举,运行时的内存占用也会相对变大 关于上面两点的验证...除此之外,我们还需要对比可读性和易维护性来与性能进行衡量,从中进行做出折中 在Android中的替代 Android中新引入的替代枚举的注解有IntDef和StringDef,这里以IntDef做例子说明一下

    95630

    Android热更新方案Robust开源,新增自动化补丁工具

    在补丁的制作过程中大量的使用反射来调用出现bug类中的方法和字段,还可以在补丁类新增方法或者类,以期达到修复线上问题的目的。...从日志中可以看出,很多类并没有按照mapping中的映射关系去映射,而是被rename了,然后就不得不放弃这种做法。...以Java编译器对泛型方法的处理为例,Java编译器会为泛型方法生成一个桥方法(在桥方法里面调用真正的方法,桥方法的参数是object的类型,注意这类桥方法Robust热更新系统并没有对其插桩),同时Java...为了解决上述的问题,自动化提供了一个静态方法(Robust.modify()),支持在泛型或者Lambda表达式里面调用这个静态方法,自动化扫描所有的方法调用,检测到这个静态方法的调用就就可以找到找到需要制作补丁的方法...这个问题的解决办法就是在反射的时候,加强对反射条件限制,强制校验反射的方法或者字段的声明类,如果在反射的时候就知道方法c是类Parent中的方法的话,就可以解决这个问题,在反射的时候就需要多传递一个方法的声明类

    1.8K50

    如何安全地打印日志

    首先看看绝大部分公司以及开发者的做法: 日志开关+日志类 为了在release版本里面没有日志输出,一个最简单的想法是:把所有打印日志的语句放在一个if(DEBUG)的语句里面;在日常开发的时候,DEBUG...静态反编译打开日志开关 上面的那种方式有一个问题:虽然在release版本里面,确实没有日志输出;但是输出日志的代码依然存在,只是没有执行到!(if条件不成立)所以,有没有办法让这些代码执行到呢?...;->i(Ljava/lang/String;Ljava/lang/String;)I :cond_0 return-void .end method 很明白,那个叫做a的静态变量就是我们的开关..., 它的初始化在哪个静态代码块里面;新建了一个局部变量0x0然后赋值给了a;因此,我们把这个0x0修改为0x1就打开了这个开关。...那么当DEBUG变量为False的时候proguard可以理所当然地认为,这一部分代码时绝对不会被执行的,这样,打印日志的语句就会被优化(删除)掉;如果是一个变量,那么在运行期间就有可能改变它的值(private

    1.4K30

    通过javap命令分析java汇编指令

    它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。...0到结尾10),slot就是这个变量在局部变量表中的槽位(槽位可复用),name就是变量名称,Signatur局部变量类型描述 LocalVariableTable: Start...此时有两个this对象引用值在操作数组栈 2: getfield #12// Field count:I this出栈,并获取其count字段,然后压入栈,此时栈中有一个this和一个count...#18 // 经过上一步操作后,栈中有两个值,栈顶为上一步操作结果,栈顶下面是this引用,这一步putfield指令,用于将栈顶的值赋值给引用对象的count字段 10: return...通过对象的地址引用去操作。 (3)常量池。 (4)其他如帧数据区、方法区(jdk1.8之前,常量池也在方法区)等部分,测试中没有显示出来,这里说明一下。

    2.4K20

    Kotlin入门教程,快使用Kotlin吧

    ,这样可以像Java那样如果为空就报空指针异常,还有一种是字段后加?,这样可以不做处理返回null或者配合?:(相当于Java中的三元运算)做判空处理: 1//类型后面加?...T以及T的超类,下限是T;在kotlin中可以使用in来代替例如clazz: Class 静态类和静态方法 object(全局): 使用object修饰的类,同时会创建一个实例(类似Java...中的单例模式),可以直接通过 类名.方法名或者类名.属性名来直接调用该类中的方法或者属性。...: String) : this(context, 0, string) 6} 主构造函数在类头中申明,而次构造函数在类体中申明; 主构造函数没有任何修饰符时可以省略constructor关键字,而次构造函数不能省略...使用场景:适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中onBinderViewHolder中,数据model的属性映射到UI

    1K10
    领券