lzhhshuai 发表于 2018-8-22 12:43

【安卓逆向】安卓逆向之新手学破解【学生版】教程1

本帖最后由 lzhhshuai 于 2018-8-23 13:03 编辑

为避免有些人群看了本帖出现恶心,喷水,扔板砖,骂通街等症状请按ctrl + W 键   谢谢合作。
    本教程纯属一些新手看法,各位认为好的可以点个赞{:1_893:}!
                                                                           同时请大神不要喷!!首先我先自我介绍:一位新手学破解!{:1_918:}再次,我感谢@china0sen 他的排版,好看极了。
https://static.52pojie.cn/static/image/hrline/line1.png
作者:【Lee】版本:第一讲
第一节课废话版学破解,一定需要软件吧!这个我就不说啦。什么APK...............之类的。

第二节【深入浅出版】学过Android编程的人,一定知道Dalvik字节码指令也许你不知道,但今天我们就来介绍一下吧(资料摘自网上,请多多包含!)
Dalvik寄存器:在开始之前,首先来了解寄存器相关的知识.Dalvik中用的寄存器都是32位,64位类型数据则用两个相邻的32位寄存器表示,也就是对于double这种64位类型的数据,需要用到两个32位寄存器来存储.                                                                              


虚拟机寄存器:
我们知道Dalvik最多支持65536个寄存器(编号从0~65535),但是在ARM架构的cpu中只存在37个寄存器。
那么这种不对称是怎么解决的呢?
Dalvik中的寄存器是虚拟寄存器, 通过映射真实的寄存器来实现.我们知道每个Dalvik维护了一个调用栈,该调用栈就是用来支持虚拟寄存器和真实寄存器相互映射的.在执行具体函数时,Dalvik会根据.registers指令来确定该函数要用到的寄存器数目.具体的原理,可以自行参考Davilk的实现.下面我们谈到的寄存器都是虚拟寄存器.寄存器有两种不同的命名方法:v字命名法和p字命名法. (这两种命名法仅仅是影响了字节码的可读性.)


v字命名法以小写字母v开头的方式表示方法中使用的局部变量和参数.对于上面实例方法test(String a,String b)来说,v0,v1为局部变量能够使用的寄存器,v2,v3,v4为参数能够使用的寄存器: https://img-blog.csdn.net/20160731141440713
p字命名法以小写字母p开头的方式表示参数,参数名称从p0开始,依次增大.局部变量能够使用的寄存器仍然是以v开头.对于上面实例方法test(String a,String b)来说,v0,v1为局部变量能够使用的寄存器,p0,p1,p2为参数能够使用的寄存器:
https://img-blog.csdn.net/20160731142057192
Dalvik描述符
Dalvik描述符与JVM相类似,Davilk字节码中同样有一套用于描述类型,方法,字段的方法,这些方法结合Davilk的指令便形成了完整的汇编代码.
字节码和数据类型Davilk字节码只有两种类型:基本类型和引用类型.对象和数组都是引用类型,Davilk中对字节码类型的描述和JVM中的描述符规则一致:对于基本类型和无返回值的void类型都是用一个大写字母表示,对象类型则用字母L加对象的全限定名来表示.数组则用[来表示,具体规则如下所示:全限定名是什么
以String为例,其完整名称是java.lang.String,那么其全限定名就是java/lang/String;,即java.lang.String的”.”用”/”代替,并在末尾添加分号”;”做结束符.
java类型类型描述符
booleanZ
byteB
shortS
charC
intI
longJ
floatF
doubleD
voidV
对象类型L
数组类型[
这里我们重点解释对象类型和数组类型:
对象类型
L可以表示java类型中的任何类.
在java代码中以package.name.ObjectName的方式引用,而在Davilk中其描述则是以Lpackage/name/ObjectName;的形式表示.
L即上面定义的java类类型,表示后面跟着的是累的全限定名.比如java中的java.lang.String对应的描述是Ljava/lang/String;.
数组类型
[类型用来表示所有基本类型的数组,[后跟着是基本类型的描述符.每一维度使用一个前置的[.
比如java中的int[] 用汇编码表示便是[]为[
对于对象数组来说,[后跟着对应类的全限定符.比如java当中的String[]对应的是
字段的描述
Davilk中对字段的描述分为两种,对基本类型字段的描述和对引用类型的描述,但两者的描述格式一样:
对象类型描述符->字段名:类型描述符;
比如com.sbbic.Test类中存在String类型的name字段及int类型的age字段,那么其描述为:Lcom/sbbic/Test;->name:Ljava/lang/String;Lcom/sbbic/test;->age:I
方法的描述
java中方法的签名包括方法名,参数及返回值,在Davilk相应的描述规则为:
对象类型描述符->方法名(参数类型描述符)返回值类型描述符下面我们通过几个例子来说明,以java.lang.String为例:
java方法:public char charAt(int index){...}
Davilk描述:Ljava/lang/String;->charAt(I)C
java方法:public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin){...}
Davilk描述:Ljava/lang/String;->getChars(II[CI)V
java方法:public boolean equals(Object anObject){...}
Davilk描述:Ljava/lang/String;->equals(Ljava/lang/Object)Z
Dalvik指令集掌握以上的字段和方法的描述,只能说我们懂了如何描述一个字段和方法,而关于方法中具体的逻辑则需要了解Dalvik中的指令集.
因为Dalvik是基于寄存器的架构的,因此指令集和JVM中的指令集区别较大,反而更类似x86的中的汇编指令.
数据定义指令数据定义指令用于定义代码中使用的常量,类等数据,基础指令是const
指令描述
const/4 vA,#+B将数值符号扩展为32后赋值给寄存器vA
const-wide/16 vAA,#+BBBB将数值符号扩展为64位后赋值个寄存器对vAA
const-string vAA,string@BBBB通过字符串索引高走字符串赋值给寄存器vAA
const-class vAA,type@BBBB通过类型索引获取一个类的引用赋值给寄存器vAA
数据操作指令move指令用于数据操作,其表示move destination,source,即数据数据从source寄存器(源寄存器)移动到destionation寄存器(源寄存器),可以理解java中变量间的赋值操作.根据字节码和类型的不同,move指令后会跟上不同的后缀.
指令描述
move vA,vB将vB寄存器的值赋值给vA寄存器,vA和vB寄存器都是4位
move/from16 vAA,VBBBB将vBBBB寄存器(16位)的值赋值给vAA寄存器(7位),from16表示源寄存器vBBBB是16位的
move/16 vAAAA,vBBBB将寄存器vBBBB的值赋值给vAAAA寄存器,16表示源寄存器vBBBB和目标寄存器vAAAA都是16位
move-object vA,vB将vB寄存器中的对象引用赋值给vA寄存器,vA寄存器和vB寄存器都是4位
move-result vAA将上一个invoke指令(方法调用)操作的单字(32位)非对象结果赋值给vAA寄存器
move-result-wide vAA将上一个invoke指令操作的双字(64位)非对象结果赋值给vAA寄存器
mvoe-result-object vAA将上一个invoke指令操作的对象结果赋值给vAA寄存器
move-exception vAA保存上一个运行时发生的异常到vAA寄存器
对象操作指令与对象实例相关的操作,比如对象创建,对象检查等.
指令描述
new-instance vAA,type@BBBB构造一个指定类型的对象将器引用赋值给vAA寄存器.此处不包含数组对象
instance-of vA,vB,type@CCCC判断vB寄存器中对象的引用是否是指定类型,如果是,将v1赋值为1,否则赋值为0
check-cast vAA,type@BBBB将vAA寄存器中对象的引用转成指定类型,成功则将结果赋值给vAA,否则抛出ClassCastException异常.
数组操作指令在实例操作指令中我们并没有发现创建对象的指令.Davilk中设置专门的指令用于数组操作.
指令说明
new-array vA,vB,type@CCCC创建指定类型与指定大小(vB寄存器指定)的数组,并将其赋值给vA寄存器
fill-array-data vAA,+BBBBBBBB用指定的数据填充数组,vAA代表数组的引用(数组的第一个元素的地址)
数据运算指令数据运算主要包括两种:算数运算和逻辑运算.
1. 算术运算指令
指令说明
add-type加法指令
sub-type减法指令
mul-type乘法指令
div-type除法指令
rem-type求
2. 逻辑元算指令
指令说明
and-type与运算指令
or-type或运算指令
xor-type异或元算指令
3. 位移指令
指令说明
shl-type有符号左移指令
shr-type有符号右移指令
ushr-type无符号右移指令
上面的-type表示操作的寄存器中数据的类型,可以是-int,-float,-long,-double等.1.v命名与p命名寄存器v1 v2 v3-------p1 p2 p3-------

2.Daalvik字节码类型描述符   
Vvoid          只能用于返回值类型   
Zboolean       变量值只能是 真(true) 或 假(false)
Bbyte          字节型   
Sshort         短整型
Cchar          字符型
Iint         整数型   
Jlong(64位)长整型
Ffloat         浮点型    
Ddouble(64位)双精度浮点型
Ljava类类型 package.name.ObjectName Lpackage/name/ObjectName;
[数组类型 。注意多位数数组的维数最大为255个。[[] [[[][]
3.跳转指令
   if-eq   等于则跳转 ==
if-ne   不等于则跳转 !=
if-lt   小于则跳转 <
if-ge   大于或等于则跳转 >=
if-gt   大于则跳转>
if-le   小于或等于则跳转 <=   
goto    无条件跳转
switch分支跳转
    返回0 实现跳转

   Pswitch_0
。。。   。。。   。。。
Pswitch_1
。。。   。。。   。。。
Pswitch_2
。。。   。。。   。。。
4.方法调用指令 invoke
5.数据定义指令 const const-string

const-string v1,“youren”
6.操作指令 move

move v1,v2,
=======================================================
.method
invoke-virtual {v1}, Ljava/lang/String;->length()I取V1长度 12345 =5      move-result v2   将v1长度结果赋值给v2 v2=5
   const/4 v3, 0x1v3=1   goto :cond_1   if-ne v2, v3, :cond_0   :cond_1   ...   ...   ...   ...   ...      :cond_0   return-void.end method
============================================================




文本摘自CSDN博客:https://blog.csdn.net/dd864140130/article/details/52076515{:1_925:}
第一次发帖,多多包涵,谢谢了!












w5205201314 发表于 2018-8-22 15:59

感谢分享

吾爱看雪 发表于 2018-8-22 16:50

sdh522 发表于 2018-8-22 13:14
我最近和朋友在玩 逆风寒 手游这款游戏特别好玩就是我没钱充值啊,大师能不能给我破解下,我只想我一个人玩 ...

不可求破解啊。。

lzhhshuai 发表于 2018-8-22 12:44

新手贴,还请大牛出来指点指点!{:1_908:}

多幸运遇见baby 发表于 2018-8-22 13:36

感谢分享

lzhhshuai 发表于 2018-8-22 13:54

sdh522 发表于 2018-8-22 13:16
安卓手游 逆风寒.apk 在线等大神求破。感激不尽啊

可以看一下,但我毕竟只是一个新手。包含包含{:1_893:}

87901434 发表于 2018-8-22 13:54

大佬有空看看我的悬赏贴如何?就是逆向去除广告和打开APK的验证。

pikachu888 发表于 2018-8-22 14:21

最后写着,文本摘自CSDN博客:https://blog.csdn.net/dd864140130/article/details/52076515,
那么分类就不是原创,应该是转载

vvking7 发表于 2018-8-22 14:35

610100 发表于 2018-8-22 15:08

感觉没啥用

小梦想oo 发表于 2018-8-22 15:52

页: [1] 2 3 4 5 6 7 8
查看完整版本: 【安卓逆向】安卓逆向之新手学破解【学生版】教程1