17年10月30日360最新虚拟壳脱壳后完全修复的详细解析

怎么过反调试dump得到没修复的oncreate部分,我就不啰嗦了,我只说被360抽取的oncreate怎么修复的,适用于2017年10月30日,最新的360加固助手1.5.3.0版本

三.修复详细过程

下面我说一下如果修复oncreate的指令,拿我的附件说明

第一步:得到最新360加固的指令映射表(注意360的每个版本的指令映射表都是不一样的,不一样也没关系,

下面有说如何生成最新版本指令映射表的,只要逻辑不发生太大的变化!)

1.得到被加密的指令

附件manualProduceSmali文件夹包含生成绝大多数dalvik指令的,将其编译用360加固,我们得到AllDalvikOpcode_test6_jiagu_sign.apk,然后过360的反调试直到运行到360的第二个so见我的附件second.so,偏移地址0x35CA6,在这里下断点

得到360抽取后的加密指令,然后把这个加密指令进行异或运算得到被360加密后的指令流,

2.找到指令分支表

看到second.so的偏移0x35CCC处,将其内容复制到

360calc_switch/360calc_switch/360calc_switch.cpp数组里面

因为AllDalvikOpcode_test6_jiagu_sign.apk是用我们已知的dalvik指令进行加密的,用360calc_switch这个工程可以计算出,真正的dalvik指令对应于second.so里面的偏移,然后就得到了指令映射表,见附件360decodeopcode\python\20170919_1.5.1.5And_0925_1.5.3.0\360opcodemaptable.config我已经为大家准备最新的360加固的映射表了,如下

第一项是opcode,第二项是指令长度,第三项是在second.so中的偏移,第四项是相对于switch分支表的偏移,第五项是指令

//一、空操作指令1条0×00,0×02,0x360c8,0x3fc,”nop”//二、数据操作指令13条0×01,0×02,0x360ce,0×402,”move”0×02,0×04,0x360e6,0x41a,”move/from16″0×03,0×06,0×36102,0×436,”move/16″0×04,0×02,0×36126,0x45a,”move-wide”0×05,0×04,0×36146,0x47a,”move-wide/from16″0×06,0×06,0x3616a,0x49e,”move-wide/16″0×07,0×02,0×36196,0x4ca,”move-object”0×08,0×04,0x361aa,0x4de,”move-object/from16″0×09,0×06,0x361c4,0x4f8,”move-object/16″0x0a,0×02,0x361e8,0x51c,”move-result”0x0b,0×02,0×36200,0×534,”move-result-wide”0x0c,0×02,0x3621e,0×552,”move-result-object”0x0d,0×00,0×0,0×0,”move-exception”//三、返回指令4条0x0E,0×02,0x38b36,0x2e6a,”return-void”0x0F,0×02,0×0,0×0,”returnvAA”0×10,0×02,0×0,0×0,”return-wide”0×11,0×02,0×0,0×0,”return-object”……….第二步:得到被抽取的指令

好了已经得到指令映射表了,现在你可以随便找一个apk让360加固了,然后呢过反调试一直运行到360的第2个so文件,然后在偏移地址0x35CA6下断点,得到被加密的抽取指令360jiami_decode,然后配置文件360decodeopcode\python\decodeopcode.py

switch_table_addr=0x35CCC//switch分支表的起始地址decode_key=0xD0//异或的key然后运行decodeopcode.py就可以得到所有的被抽取的指令了第三步:手动将被抽取的指令,填回到dex里面去

注意dex文件的DexMethod和DexCode这两个结构体即可

StructDexMethod{U4methodIdx;//361没有处理U4accessFlags;//访问标志,被360改成了8402,也就是0×104本来是04U4codeOff;//指向DexCode结构的偏移}//这个结构体360没有改动他structDexCode{u2registersSize;u2insSize;u2outsSize;u2triesSize;u4debugInfoOff;u4insnsSize;指令集个数以2字节为单位,实际为0×4u2insns[1];指令集,被360加密了的};四.结尾

更多内容见附件:~~~描述能力有点差,凑合着看吧

最后:祝你好运~有兴趣的完全可以把得到指令映射表和指令解密和修复写成py,做个自动脱壳器!我就懒得写了,我要去玩游戏了,

五.得到指令映射表的关键东西

包含绝大多数dalvik指令的oncreate函数,我这里也贴一下吧

#virtualmethods

.methodprotectedonCreate(Landroid/os/Bundle;)V

#注意累计指令机器码字节数是1160

#累计dalvik指令编码是0x00-0xff总256条,我累计实现209条指令,其中9条指令未实现,26条指令是dalvik没有使用的,12条指令只存在于odex文件中

.locals14

.paramp1,"savedInstanceState"#Landroid/os/Bundle;

.prologue

#一、空操作指令1条手工植入====================================================

nop#opcode=0x00

#四、数据定义指令10条,手工植入,有一条不会写====================================================

const/4v0,0x7#opcode=0x12#存入int8到v0

const/16v1,0x5#opcode=0x13#存入int3到v1

constv2,0x3#opcode=0x14#存入int3到v2

const/high16v3,0x41200000#opcode=0x15#存入float10.0f到v3

const-wide/16v3,0x03e8#opcode=0x16

const-wide/32v3,0x00bc614e#opcode=0x17#存入long12345678到v3,v4

const-widev3,0x002bdc545d6b4b87L#opcode=0x18#存入long12345678901234567到v3,v4

const-wide/high16v3,0x4024000000000000L#opcode=0x19#存入long10.0常量到v3,v4

const-stringv5,"snow_test"#opcode=0x1A

const-classv6,Landroid/content/Context;#opcode=0x1C

#二、数据操作指令13条,植入====================================================

movev6,v0#opcode=0x01v0移动到v6

move/from16v6,v0#opcode=0x02v0移动到v6

move/16v6,v0#opcode=0x03v0移动到v6

move-widev7,v3#opcode=0x04v3,v4移动到v7,v8是移动long/double值

move-wide/from16v7,v3#opcode=0x05v3,v4移动到v7,v8是移动long/double值

move-wide/16v7,v3#opcode=0x06v3,v4移动到v7,v8是移动long/double值

move-objectv9,p0#opcode=0x07,p0的对象引用移动到v9

move-object/from16v9,p0#opcode=0x08,p0的对象引用移动到v9

move-object/16v9,p0#opcode=0x09,p0的对象引用移动到v9

#下面去增加,方法调用指令后面增加

invoke-direct{p0},Lcom/snow/alldalvikopcode/MainActivity;->moveresultfunc()I

move-resultv6#opcode=0x0a,移动上一个方法调用的返回值到

invoke-direct{p0},Lcom/snow/alldalvikopcode/MainActivity;->moveresultwidefunc()D

move-result-widev7#opcode=0x0b,移动上一个方法调用的返回值到

invoke-direct{p0},Lcom/snow/alldalvikopcode/MainActivity;->moveresultobjectfunc()Landroid/content/Context;

move-result-objectv9#opcode=0x0c,移动上一个方法调用的返回值到

#move-exceptionv7#opcode=0xD蛋疼1,注意这不是trycatch生成的,不知道怎么实现

#五.锁指令2条,植入===================================================================

monitor-enterp0#opcode=0x1d

monitor-exitp0#opcode=0x1e

#六.实例操作指令3条,植入=============================================================

check-castp1,Landroid/os/Bundle;#opcode=0x1f

instance-ofv0,p1,Landroid/os/Bundle;#opcode=0x20

new-instancev10,Ljava/lang/StringBuilder;#opcode=0x22新建字符串变量

#七.数组操作指令18条,植入=============================================================

const/4v2,0x4#用来作为数组大小

const/4v1,0x2#用来做索引

#int数组

new-arrayv0,v2,[I#opcode=0x23,新建v2大小数组int[],引用丢v0里面

array-lengthv3,v0#opcode=0x21,获取数组长度,长度丢v1里面

fill-array-datav0,:array_0#opcode=0x26初始化v0数组

agetv3,v0,v1#opcode=0x44,从int数组v0,用v1做索引得到的值丢v2

aputv3,v0,v1#opcode=0x4B,把v2丢到int数组v0,用v1做索引里面

#long数组

new-arrayv0,v2,[J#创建long数组

fill-array-datav0,:array_1

aget-widev3,v0,v1#opcode=0x45,获取值存入v2,v3里面,用v1做索引

aput-widev3,v0,v1#opcode=0x4C,把v2v3的值存入,v1作为索引里面

#byte数组

new-arrayv0,v2,[B

fill-array-datav0,:array_2

aget-bytev3,v0,v1#opcode=0x48

aput-bytev3,v0,v1#opcode=0x4F

#char数组

new-arrayv0,v2,[C

fill-array-datav0,:array_3

aget-charv3,v0,v1#opcode=0x49

aput-charv3,v0,v1#opcode=0x50

#short数组

new-arrayv0,v2,[S

fill-array-datav0,:array_4

aget-shortv3,v0,v1#opcode=0x4A

aput-shortv3,v0,v1#opcode=0x51

const/4v1,0x0#用来做索引

const/4v2,0x1#用来做数组大小

#对象数组

new-arrayv0,v2,[Ljava/lang/String;#创建String对象

const-stringv3,"s"

aput-objectv3,v0,v1#opcode=0x4D

aget-objectv4,v0,v1#opcode=0x46

#boolean数组

new-arrayv0,v2,[Z

const/4v3,0x1

aput-booleanv3,v0,v1#opcode=0x4E

aget-booleanv3,v0,v1#opcode=0x47

const/4v0,0x3#数组大小是3

const/4v2,0x1

const/4v3,0x2

const/4v4,0x3

filled-new-array{v2,v3,v4},[I#opcode=0x24

filled-new-array/range{v2..v4},[I#opcode=0x25

#八.异常指令1条,植入=============================================================

#throwvAAopcode=0x27蛋疼2,注意这不是trycatch生成的,不知道怎么实现

#九.跳转指令17条,植入=============================================================

#第一类跳转

const/4v1,0x4

goto:gotogoto_0#opcode=0x28

:gotogoto_0

goto/16:gotogoto_1#opcode=0x29

:gotogoto_1

goto/32:gotogoto_2#opcode=0x2A

:gotogoto_2

#第二类跳转

const/4v0,0x1

packed-switchv0,:pswitch_data_0#opcode=0x2B,switch形式1

goto:gotogoto_3

:pswitch_0

const/4v1,0x1

:pswitch_1

const/4v1,0x2

:gotogoto_3

sparse-switchv0,:sswitch_data_0#opcode=0x2C,switch形式2

goto:gotogoto_6

:sswitch_0

:sswitch_1

:gotogoto_6

#第三类跳转

const/4v0,0x4

const/4v1,0x5

if-eqv0,v1,:cond_0#opcode=0x32v0==v1

:cond_0

if-nev0,v1,:cond_1#opcode=0x33v0!=v1

:cond_1

if-ltv0,v1,:cond_2#opcode=0x34v0

:cond_2

if-gev0,v1,:cond_3#opcode=0x35v0>=v1

:cond_3

if-gtv0,v1,:cond_4#opcode=0x36v0>v1

:cond_4

if-lev0,v1,:cond_5#opcode=0x37v0<=v1

:cond_5

if-eqzv0,:cond_7#opcode=0x38v0==0

:cond_7

if-nezv0,:cond_8#opcode=0x39v0!=0

:cond_8

if-ltzv0,:cond_9#opcode=0x3Av0<0

:cond_9

if-gezv0,:cond_10#opcode=0x3bv0>=0

:cond_10

if-gtzv0,:cond_11#opcode=0x3cv0>0

:cond_11

if-lezv0,:cond_12#opcode=0x3dv0<=0

:cond_12

#十.比较指令5条,植入=============================================================

const/high16v1,0x41300000#11.0ffloat

const/high16v2,0x41300000#11.0ffloat

const-wide/high16v3,0x4026000000000000L#11.0double,会存入v3和v4

const-wide/high16v5,0x4026000000000000L#11.0double,会存入v5和v6

const-wide/16v7,0xb#11long,会存入v7和v8

const-wide/16v9,0xb#11long,会存入v9和v10

cmpl-floatv0,v1,v2#opcode=0x2D比较v1和v2存入v0

cmpg-floatv0,v1,v2#opcode=0x2E比较v1和v2存入v0

cmpl-doublev0,v3,v5#opcode=0x2F

cmpg-doublev0,v3,v5#opcode=0x30

cmp-longv0,v7,v9#opcode=0x31

#十一.字段操作指令,34条指令,植入=============================================================

igetv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->intfield:I#opcode=0x52

iputv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->intfield:I#opcode=0x59

iget-widev0,p0,Lcom/snow/alldalvikopcode/MainActivity;->doublefield:D#opcode=0x53

iput-widev0,p0,Lcom/snow/alldalvikopcode/MainActivity;->doublefield:D#opcode=0x5A

iget-objectv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->objectfield:Ljava/lang/String;#opcode=0x54

iput-objectv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->objectfield:Ljava/lang/String;#opcode=0x5B

iget-booleanv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->booleanfield:Z#opcode=0x55

iput-booleanv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->booleanfield:Z#opcode=0x5C

iget-bytev0,p0,Lcom/snow/alldalvikopcode/MainActivity;->bytefield:B#opcode=0x56

iput-bytev0,p0,Lcom/snow/alldalvikopcode/MainActivity;->bytefield:B#opcode=0x5D

iget-charv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->charfield:C#opcode=0x57

iput-charv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->charfield:C#opcode=0x5E

iget-shortv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->shortfield:S#opcode=0x58

iput-shortv0,p0,Lcom/snow/alldalvikopcode/MainActivity;->shortfield:S#opcode=0x5F

sgetv0,Lcom/snow/alldalvikopcode/MainActivity;->sintfield:I#opcode=0x60

sputv0,Lcom/snow/alldalvikopcode/MainActivity;->sintfield:I#opcode=0x67

sget-widev0,Lcom/snow/alldalvikopcode/MainActivity;->sdoublefield:D#opcode=0x61

sput-widev0,Lcom/snow/alldalvikopcode/MainActivity;->sdoublefield:D#opcode=0x68

sget-objectv0,Lcom/snow/alldalvikopcode/MainActivity;->sobjectfield:Ljava/lang/String;#opcode=0x62

sput-objectv0,Lcom/snow/alldalvikopcode/MainActivity;->sobjectfield:Ljava/lang/String;#opcode=0x69

sget-booleanv0,Lcom/snow/alldalvikopcode/MainActivity;->sbooleanfield:Z#opcode=0x63

sput-booleanv0,Lcom/snow/alldalvikopcode/MainActivity;->sbooleanfield:Z#opcode=0x6A

sget-bytev0,Lcom/snow/alldalvikopcode/MainActivity;->sbytefield:B#opcode=0x64

sput-bytev0,Lcom/snow/alldalvikopcode/MainActivity;->sbytefield:B#opcode=0x6B

sget-charv0,Lcom/snow/alldalvikopcode/MainActivity;->scharfield:C#opcode=0x65

sput-charv0,Lcom/snow/alldalvikopcode/MainActivity;->scharfield:C#opcode=0x6C

sget-shortv0,Lcom/snow/alldalvikopcode/MainActivity;->sshortfield:S#opcode=0x66

sput-shortv0,Lcom/snow/alldalvikopcode/MainActivity;->sshortfield:S#opcode=0x6D

#十二.方法调用指令,15条指令,其中odex用5条,有效的只有10条,2条无法写=========================================================

const/4v2,0x2

const/4v3,0x3

const/4v4,0x4

const/16v5,0x37

invoke-virtual{p0,v1},Lcom/snow/alldalvikopcode/MainActivity;->virtualfunc(I)I#invoke-virtual,opcode=6E

#invoke-super,opcode=6F见编译自带生成的

invoke-direct{p0,v1},Lcom/snow/alldalvikopcode/MainActivity;->directfunc(I)I#invoke-direct,opcode=70

invoke-static{v1},Lcom/snow/alldalvikopcode/MainActivity;->staticfunc(I)I#invoke-static,opcode=71

const-stringv0,"SNOW"

const/4v7,0x0

invoke-virtual{p0,v0,v7},Lcom/snow/alldalvikopcode/MainActivity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;

move-result-objectv6

const-stringv0,"test"

const-stringv7,""

invoke-interface{v6,v0,v7},Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;#invoke-interface,opcode=72

move-objectv0,p0

invoke-virtual/range{v0..v5},Lcom/snow/alldalvikopcode/MainActivity;->virtualrangefunc(IIIII)I#invoke-virtual/range,opcode=74

#蛋疼3invoke-super/range,opcode=75,无法写不能再oncreate里面调用其父类Activity含有多个参数的方法

invoke-direct/range{v0..v5},Lcom/snow/alldalvikopcode/MainActivity;->directrangefunc(IIIII)I#invoke-direct/range,opcode=76

const/4v6,0x2

invoke-static/range{v1..v6},Lcom/snow/alldalvikopcode/MainActivity;->staticrangefunc(IIIIII)I#invoke-static/range,opcode=77

#蛋疼4,invoke-interface-range,opcode=78,无法写,可以自定义接口,但是MainActivity就必须implements接口了

#十三.数据转换指令21条=================================================================================

#inta=v0

#longa=v1,v2

#floata=v3

#doublea=v5,v6

#intb=v7

#longb=v8,v9

#floatb=v10

#doubleb=v11,v12

const/4v0,0x5

const-wide/16v1,0x6

const/high16v3,0x40e00000#7.0f

const-wide/high16v5,0x4020000000000000L#8.0

neg-intv7,v0#neg-intvx,vyopcode=7B

not-intv7,v0#not-intvx,vyopcode=7C

neg-longv8,v5#neg-longvx,vyopcode=7D

not-longv8,v5#not-longvx,vyopcode=7E

neg-floatv10,v3#neg-floatvx,vyopcode=7F

neg-doublev11,v5#neg-doublevx,vyopcode=80

int-to-longv8,v0#int-to-longvx,vyopcode=81

int-to-floatv10,v0#int-to-floatvx,vyopcode=82

int-to-doublev11,v0#int-to-doublevx,vyopcode=83

long-to-intv7,v1#long-to-intvx,vyopcode=84

long-to-floatv9,v1#long-to-floatvx,vyopcode=85

long-to-doublev11,v1#long-to-doublevx,vyopcode=86

float-to-intv7,v3#float-to-intvx,vyopcode=87

float-to-longv8,v3#float-to-longvx,vyopcode=88

float-to-doublev11,v3#float-to-doublevx,vyopcode=89

double-to-intv7,v5#double-to-intvx,vyopcode=8A

double-to-longv8,v5#double-to-longvx,vyopcode=8B

double-to-floatv9,v5#double-to-floatvx,vyopcode=8C

int-to-bytev1,v0#int-to-bytevx,vyopcode=8D

int-to-charv1,v0#int-to-charvx,vyopcode=8E

int-to-shortv1,v0#int-to-shortvx,vyopcode=8F

#十四.数据运算指令83条=================================================================================

const/4v2,0x5

const/4v4,0x5

add-intv0,v2,v4#opcode=0x90add-intv0,v2,v4计算v2+v4并将结果存入v0。

sub-intv0,v2,v4#opcode=0x91sub-intv0,v2,v4计算v2-v4并将结果存入v0。

mul-intv0,v2,v4#opcode=0x92mul-intv0,v2,v4计算v2*v4并将结果存入v0。

div-intv0,v2,v4#opcode=0x93div-intv0,v2,v4计算v2/v4并将结果存入v0。

rem-intv0,v2,v4#opcode=0x94rem-intv0,v2,v4计算v2%v4并将结果存入v0。

and-intv0,v2,v4#opcode=0x95and-intv0,v2,v4计算v2与v4并将结果存入v0。

or-intv0,v2,v4#opcode=0x96or-intv0,v2,v4计算v2或v4并将结果存入v0。

xor-intv0,v2,v4#opcode=0x97xor-intv0,v2,v4计算v2异或v4并将结果存入v0。

shl-intv0,v2,v4#opcode=0x98shl-intv0,v2,v4左移v2,v4指定移动的位置,结果存入v0。

shr-intv0,v2,v4#opcode=0x99shr-intv0,v2,v4右移v2,v4指定移动的位置,结果存入v0。

ushr-intv0,v2,v4#opcode=0x9Aushr-intv0,v2,v4无符号右移v2,v4指定移动的位置,结果存入v0。

const-wide/16v2,0x6

const-wide/16v4,0x6

add-longv0,v2,v4#opcode=0x9Badd-longv0,v2,v4计算v2,v2+1+v4,v4+1并将结果存入v0,v0+1注1。

sub-longv0,v2,v4#opcode=0x9Csub-longv0,v2,v4计算v2,v2+1-v4,v4+1并将结果存入v0,v0+1注1。

mul-longv0,v2,v4#opcode=0x9Dmul-longv0,v2,v4计算v2,v2+1*v4,v4+1并将结果存入v0,v0+1注1。

div-longv0,v2,v4#opcode=0x9Ediv-longv0,v2,v4计算v2,v2+1/v4,v4+1并将结果存入v0,v0+1注1。

rem-longv0,v2,v4#opcode=0x9Frem-longv0,v2,v4计算v2,v2+1%v4,v4+1并将结果存入v0,v0+1注1。

and-longv0,v2,v4#opcode=0xA0and-longv0,v2,v4计算v2,v2+1与v4,v4+1并将结果存入v0,v0+1注1。

or-longv0,v2,v4#opcode=0xA1or-longv0,v2,v4计算v2,v2+1或v4,v4+1并将结果存入v0,v0+1注1。

xor-longv0,v2,v4#opcode=0xA2xor-longv0,v2,v4计算v2,v2+1异或v4,v4+1并将结果存入v0,v0+1注1

const/4v4,0x5#这个一定要不然下面会崩溃

shl-longv0,v2,v4#opcode=0xA3shl-longv0,v2,v4左移v2,v2+1,v4指定移动的位置,结果存入v0,v0+1注1。

shr-longv0,v2,v4#opcode=0xA4shr-longv0,v2,v4右移v2,v2+1,v4指定移动的位置,结果存入v0,v0+1注1。

ushr-longv0,v2,v4#opcode=0xA5ushr-longv0,v2,v4无符号右移v2,v2+1,v4指定移动的位置,结果存入v0,v0+1注1。

const/high16v2,0x40e00000#7.0f

const/high16v4,0x40e00000#7.0f

add-floatv0,v2,v4#opcode=0xA6add-floatv0,v2,v4计算v2+v4并将结果存入v0。

sub-floatv0,v2,v4#opcode=0xA7sub-floatv0,v2,v4计算v2-v4并将结果存入v0。

mul-floatv0,v2,v4#opcode=0xA8mul-floatv0,v2,v4计算v2*v4并将结果存入v0。

div-floatv0,v2,v4#opcode=0xA9div-floatv0,v2,v4计算v2/v4并将结果存入v0。

rem-floatv0,v2,v4#opcode=0xAArem-floatv0,v2,v4计算v2%v4并将结果存入v0。

const-wide/high16v2,0x4020000000000000L#8.0

const-wide/high16v4,0x4020000000000000L#8.0

add-doublev0,v2,v4#opcode=0xABadd-doublev0,v2,v4计算v2,v2+1+v4,v4+1并将结果存入v0,v0+1注1。

sub-doublev0,v2,v4#opcode=0xACsub-doublev0,v2,v4计算v2,v2+1-v4,v4+1并将结果存入v0,v0+1注1。

mul-doublev0,v2,v4#opcode=0xAD#后来才知道现在补上

div-doublev0,v2,v4#opcode=0xAEdiv-doublev0,v2,v4计算v2,v2+1/v4,v4+1并将结果存入v0,v0+1注1。

rem-doublev0,v2,v4#opcode=0xAFrem-doublev0,v2,v4计算v2,v2+1%v4,v4+1并将结果存入v0,v0+1注1。

#---------------------------------------------------------

add-int/2addrv0,v2#opcode=0xB0add-int/2addrv0,v2计算v0+v2并将结果存入v0。

sub-int/2addrv0,v2#opcode=0xB1sub-int/2addrv0,v2计算v0-v2并将结果存入v0。

mul-int/2addrv0,v2#opcode=0xB2mul-int/2addrv0,v2计算v0*v2并将结果存入v0。

div-int/2addrv0,v2#opcode=0xB3div-int/2addrv0,v2计算v0/v2并将结果存入v0。

rem-int/2addrv0,v2#opcode=0xB4rem-int/2addrv0,v2计算v0%v2并将结果存入v0。

and-int/2addrv0,v2#opcode=0xB5and-int/2addrv0,v2计算v0与v2并将结果存入v0。

or-int/2addrv0,v2#opcode=0xB6or-int/2addrv0,v2计算v0或v2并将结果存入v0。

xor-int/2addrv0,v2#opcode=0xB7xor-int/2addrv0,v2计算v0异或v2并将结果存入v0。

shl-int/2addrv0,v2#opcode=0xB8shl-int/2addrv0,v2左移v0,v2指定移动的位置,并将结果存入v0。

shr-int/2addrv0,v2#opcode=0xB9shr-int/2addrv0,v2右移v0,v2指定移动的位置,并将结果存入v0。

ushr-int/2addrv0,v2#opcode=0xBAushr-int/2addrv0,v2无符号右移v0,v2指定移动的位置,并将结果存入v0。

const-wide/16v0,0x6

add-long/2addrv0,v2#opcode=0xBBadd-long/2addrv0,v2计算v0,v0+1+v2,v2+1并将结果存入v0,v0+1注1。

sub-long/2addrv0,v2#opcode=0xBCsub-long/2addrv0,v2计算v0,v0+1-v2,v2+1并将结果存入v0,v0+1注1。

mul-long/2addrv0,v2#opcode=0xBDmul-long/2addrv0,v2计算v0,v0+1*v2,v2+1并将结果存入v0,v0+1注1。

div-long/2addrv0,v2#opcode=0xBEdiv-long/2addrv0,v2计算v0,v0+1/v2,v2+1并将结果存入v0,v0+1注1。

rem-long/2addrv0,v2#opcode=0xBFrem-long/2addrv0,v2计算v0,v0+1%v2,v2+1并将结果存入v0,v0+1注1。

and-long/2addrv0,v2#opcode=0xC0and-long/2addrv0,v2计算v0,v0+1与v2,v2+1并将结果存入v0,v0+1注1。

or-long/2addrv0,v2#opcode=0xC1or-long/2addrv0,v2计算v0,v0+1或v2,v2+1并将结果存入v0,v0+1注1。

xor-long/2addrv0,v2#opcode=0xC2xor-long/2addrv0,v2计算v0,v0+1异或v2,v2+1并将结果存入v0,v0+1注1。

shl-long/2addrv0,v2#opcode=0xC3shl-long/2addrv0,v2左移v0,v0+1,v2指定移动的位置,并将结果存入v0,v0+1。

shr-long/2addrv0,v2#opcode=0xC4shr-long/2addrv0,v2右移v0,v0+1,v2指定移动的位置,并将结果存入v0,v0+1。

ushr-long/2addrv0,v2#opcode=0xC5ushr-long/2addrv0,v2无符号右移v0,v0+1,v2指定移动的位置,并将结果存入v0,v0+1。

const/high16v0,0x40e00000#7.0f

add-float/2addrv0,v2#opcode=0xC6add-float/2addrv0,v2计算v0+v2并将结果存入v0。

sub-float/2addrv0,v2#opcode=0xC7sub-float/2addrv0,v2计算v0-v2并将结果存入v0。

mul-float/2addrv0,v2#opcode=0xC8mul-float/2addrv0,v2计算v0*v2并将结果存入v0。

div-float/2addrv0,v2#opcode=0xC9div-float/2addrv0,v2计算v0/v2并将结果存入v0。

rem-float/2addrv0,v2#opcode=0xCArem-float/2addrv0,v2计算v0%v2并将结果存入v0。

const-wide/high16v0,0x4020000000000000L#8.0

add-double/2addrv0,v2#opcode=0xCBadd-double/2addrv0,v2计算v0,v0+1+v2,v2+1并将结果存入v0,v0+1注1。

sub-double/2addrv0,v2#opcode=0xCCsub-double/2addrv0,v2计算v0,v0+1-v2,v2+1并将结果存入v0,v0+1注1。

mul-double/2addrv0,v2#opcode=0xCDmul-double/2addrv0,v2计算v0,v0+1*v2,v2+1并将结果存入v0,v0+1注1。

div-double/2addrv0,v2#opcode=0xCEdiv-double/2addrv0,v2计算v0,v0+1/v2,v2+1并将结果存入v0,v0+1注1。

rem-double/2addrv0,v2#opcode=0xCFrem-double/2addrv0,v2计算v0,v0+1%v2,v2+1并将结果存入v0,v0+1注1。

const/4v2,0x6

add-int/lit16v0,v2,0x1#opcode=0xD0add-int/lit16v0,v2,lit16计算v2+lit16并将结果存入v0。

#sub-int/lit16v0,v2,0x1#opcode=0xD1sub-int/lit16v0,v2,lit16计算v2-lit16并将结果存入v0。蛋疼5这条指令不能写

mul-int/lit16v0,v2,0x1#opcode=0xD2mul-int/lit16v0,v2,lit16计算v2*lit16并将结果存入v0。

div-int/lit16v0,v2,0x1#opcode=0xD3div-int/lit16v0,v2,lit16计算v2/lit16并将结果存入v0。

rem-int/lit16v0,v2,0x1#opcode=0xD4rem-int/lit16v0,v2,lit16计算v2%lit16并将结果存入v0。

and-int/lit16v0,v2,0x1#opcode=0xD5and-int/lit16v0,v2,lit16计算v2与lit16并将结果存入v0。

or-int/lit16v0,v2,0x1#opcode=0xD6or-int/lit16v0,v2,lit16计算v2或lit16并将结果存入v0。

xor-int/lit16v0,v2,0x1#opcode=0xD7xor-int/lit16v0,v2,lit16计算v2异或lit16并将结果存入v0。

add-int/lit8v0,v2,0x1#opcode=0xD8add-int/lit8v0,v2,lit8计算v2+lit8并将结果存入v0。

#sub-int/lit8v0,v2,0x1#opcode=0xD9sub-int/lit8v0,v2,lit8计算v2-lit8并将结果存入v0。蛋疼6这条指令不能写

mul-int/lit8v0,v2,0x1#opcode=0xDAmul-int/lit8v0,v2,lit8计算v2*lit8并将结果存入v0。

div-int/lit8v0,v2,0x1#opcode=0xDBdiv-int/lit8v0,v2,lit8计算v2/lit8并将结果存入v0。

rem-int/lit8v0,v2,0x1#opcode=0xDCrem-int/lit8v0,v2,lit8计算v2%lit8并将结果存入v0。

and-int/lit8v0,v2,0x1#opcode=0xDDand-int/lit8v0,v2,lit8计算v2与lit8并将结果存入v0。

or-int/lit8v0,v2,0x1#opcode=0xDEor-int/lit8v0,v2,lit8计算v2或lit8并将结果存入v0。

xor-int/lit8v0,v2,0x1#opcode=0xDFxor-int/lit8v0,v2,lit8计算v2异或lit8并将结果存入v0。

shl-int/lit8v0,v2,0x1#opcode=0xE0shl-int/lit8v0,v2,lit8左移v2,lit8指定移动的位置,并将结果存入v0。

shr-int/lit8v0,v2,0x1#opcode=0xE1shr-int/lit8v0,v2,lit8右移v2,lit8指定移动的位置,并将结果存入v0。

ushr-int/lit8v0,v2,0x1#opcode=0xE2ushr-int/lit8v0,v2,lit8无符号右移v2,lit8指定移动的位置,并将结果存入v0。

#下面编译生成===============================================

invoke-super{p0,p1},Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V#invoke-super,opcode=6F

const/high16v0,0x7f030000

invoke-virtual{p0,v0},Lcom/snow/alldalvikopcode/MainActivity;->setContentView(I)V

#三、返回指令4条无法测试

return-void#opcode=0xE

#returnvAA#opcode=0xF,onCreate默认返回void,无法写这里,蛋疼7

#return-widevAA#opcode=0x10,onCreate默认返回void,无法写这里,蛋疼8

#return-objectvAA#opcode=0x11,onCreate默认返回void,无法写这里,蛋疼9

#下面是数组数据

:array_0

.array-data4

0x11

0x22

0x33

0x44

.endarray-data

:array_1

.array-data8

0x37

0x42

0x4d

0x58

:array_2

.array-data1

0x1t

0x2t

0x3t

0x4t

:array_3

.array-data2

0x73s

0x6es

0x6fs

0x77s

:array_4

0x5s

0x6s

0x7s

0x8s

#下面是switch数据1

:pswitch_data_0

.packed-switch0x1

.endpacked-switch

#下面是switch数据2

:sswitch_data_0

.sparse-switch

0x1->:sswitch_0

0x2->:sswitch_1

.endsparse-switch

.endmethod

六.题外

哎,蛋疼,懂的破解虚拟壳的人就那么一些,希望可以促进移动加固的发展(破坏也是一种推动力啊),希望解决兼容问题,然后发展成so虚拟化啊~加固技术越难越好啊~这样才好玩啊!

*本文原创作者:大王叫我来挖坟,属于FreeBuf原创奖励计划,禁止转载。

THE END
1.SPFlashTool立即注册 onfix.cn分享文件(夹):SP_Flash_Tool_V6.zip分享于2024-02-01 16:17:48 永久分享 提取文件 提取文件https://www.123pan.com/s/OZk2jv-aju4H
2.最新SPFlashToolexe刷机工具版本v5.1612免费下载最新SP_Flash_Tool_exe刷机工具 版本v5.1612 刷机包大小:37.0 MB 推荐星级: 更新时间:2016-06-03 22:32:50 刷机包类别: / MTK刷机工具 刷机包语言: 授权方式: 图片预览:【一键转帖到论坛】 插件情况: 相关Tags: (14)88% (2)13% 刷机包简介http://www.84x.cn/shuaji/3044.html
3.SPATAtoolsrcv2.1752.00安卓自动化测试工具SP_Flash_Tool_exe_Windows_v5.1528.00.000 MTK通用烧录工具,自己测试支持MTK67XX,65XX系列。 上传者:jeff_chou1990时间:2015-10-22 SP_Flash_Tool_exe_Windows_v5.1744.00.000.rar 使用此工具,让更多开源开发者便利的在各自的平台上完成刷机。 上传者:liuhuihlf时间:2019-09-16 ...https://www.iteye.com/resource/u010118836-10505642
4.联发科MTK(SPFlash万维手机维修?网站首页?工具专区?刷机工具?联发科MTK(SP_Flash_Tool)工具 收藏本版|订阅 联发科MTK(SP_Flash_Tool)工具今日下载量:0|固件:77|排名:39 1234/ 4 页下一页 返回 新窗全部主题最新热门热帖精华更多 最后下载 联发科(MTK)刷机工具 版本:SP_Flash_Tool_v5.1936...23456..83xiaobingxiang昨...https://www.rom100.com/forum.php?mod=forumdisplay&fid=2429&filter=lastpost&orderby=lastpost
5.SPFlashToolexeWindowsv5.1416.00工具使用说明.pdfSP_Flash_Tool_exe_Windows_v5.1416.00工具使用说明.pdf,SP_Flash_Tool_exe_Windows_v5.1416.00工具使用说明: 1.打开文件夹目录,选择flash_tool.exe文件,双击打开 2.打开后,页面如下显示: 3.打开Scatter-loading选项,在软件BIN文件目录下, 选择MT8582_Android_scatterhttps://max.book118.com/html/2021/1129/7032015130004053.shtm
6.SPATAtoolsrcv2.1752.00安卓自动化测试工具│ │ ├── ATATool.ico│ │ ├── ATATool.rc2│ │ ├── icon_lis.ico│ │ └── Thumbs.db│ ├── resource.h│ ├── ScanBarcode.cpp│ ├── ScanBarcode.h│ ├── Setup.ini│ ├── SPBootMode.dll│ ├── SPBootMode.lib│ ├── sp_brom.h│ ├── StdAfx....https://www.haolizi.net/example/view_224886.html
7.SPFlashTool刷机工具出现各种代码详解与解决方法刷机教程在给mtk平台的国产手机刷机时(比如红米1) 机油们常用的工具就是SP_ Flash_Tool,而在刷机失败时会弹出各种各样的错误提示,即便是英文水平较高的机油估计也很难看明白是什么意思,以下为常见的错误含义以及解决方法,希望对各位机油有所帮助。 (其他MTK机型线刷也可参考本贴) ...http://rom.7to.cn/jiaochengdetail/16894
8.用SPFlashToolv5.1524线刷卡红条出现以下错误BROM ERROR : S_BROM_DOWNLOAD_DA_FAIL (2004)[H/W] Fail to download DA to baseband chip's ...http://bbs.ydss.cn/thread-641271-1-1.html
9.Flash基础入门之SPFlashTool版本对应MTK处理器型号(SPFlash...摘要:本文主要向大家介绍了Flash基础入门之SP Flash Tool版本对应MTK处理器型号(SP Flash Tool 版本速查),通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。 本文主要向大家介绍了Flash基础入门之SP Flash Tool版本对应MTK处理器型号(SP Flash Tool 版本速查),通过具体的内容向大家展现,希望对大家学习...https://flash.zhizuobiao.com/flash-18102900266/
10.TippingTool(Tip&Spli...相似应用下载This tool calculates instantly the tip and total.Now you can quickly and easily determine the tip amount based on percentages YOU select, customized to your level of satisfaction! With a simple click you can calculate the tip amount based ON YOUR PERSONAL SATISFACTION AND PRE-DETERMINED TIP ...https://m.wandoujia.com/apps/6975640
1.通过SPFlashTool线刷失败解决方法Fl**成性上传25KB文件格式docx MTK SP_Flash_Tool download (0)踩踩(0) 所需:1积分 【SQLServer基础教程】T-SQL编程.pptx(共27页,实验类课件) 2024-11-12 13:10:02 积分:1 labelme智能标注版+图像标注工具+AI标注(自动使用SAM模型) 2024-11-12 09:57:47 ...https://www.coder100.com/index/index/content/id/1270639
2.Linux系统下的MTKSPFlashToolv5.2228安装与使用指南简介:MTKSP Flash Tool是一款专为基于Mediatek芯片的设备设计的固件刷写工具,支持在Linux系统上运行,为不使用Windows的用户提供便利。该工具常用于系统软件、基带和恢复模式的更新或修复。使用时需手动安装驱动,并通过命令行操作进行固件的加载和刷写。刷写前必须了解设备的兼容性和刷写过程的安全性,以免造成设备损坏。https://blog.csdn.net/weixin_34620658/article/details/142155200
3.[TUTORIAL]HowtosetupSPFlashToolCode: cd /sp_flash_toolWe make one file executable by typing: Code: chmod +x flash_toolIn order to avoid running the flash_tool as root user, you need to add a standard user to the usergroup "dialout" (thanks to @egalus for this bit!)Code...http://xdaforums.com/t/tutorial-how-to-setup-sp_flash_tool_linux-mtk-mediatek-soc.3160802/
4.SPMETATool怎么用SPMETATool好不好使用技巧SP META Tool软件特性 SP META Tool官方版是一款相当优秀的MediaTek平台手动测试工具,SP META Tool最新版功能全面,能够支持BT Tool、GPStool、Sensor Tool、DVB Tool等等测试,SP META Tool软件界面美观,便捷好用,支持用户自定义可选择USB或COM端口。 SP META Tool软件功能 ...https://xiazai.zol.com.cn/baike/582679.shtml
5.MTK刷机工具SPFlashTool下载SP_Flash_Tool_v5.1736 SP Flash Tool exe Windows v5.1736.00.000 下载 其他版本 SP_Flash_Tool目前更新了很多版本,包括 SP Flash Tool exe Windows v5.1640.00.000 SP Flash Tool exe Linux 64Bit v5.1640.00.100 SP Flash Tool exe Windows v5.1644.00.000 ...https://www.banxiayue.com/sp_flash_tool.html
6.使用SPFLASHTOOL写入系统文件将设备关机,并使用USB连接电脑 打开SP_Flash_Tool_v3.1312.0.139文件夹中的Flash_tool.exe文件 选择Download Agent:图1...https://www.jianshu.com/p/1ed58bd840f8
7.SPFlashToolerror"STATUSDAHASHI searched for a way to get a clean ROM install on it using SP Flash Tool (found a guide on GetDroidTips), but whenever the SP Flash Tool starts downloading, it gives me "STATUS_DA_HASH_MISMATCH" error. Does anybody know what might be causing this and what the error itself might ...http://forum.xda-developers.com/t/sp-flash-tool-error-status_da_hash_mismatch.3888759/
8.联发科(MTK)手机刷机工具SPFlashAndroid WinADBUSB FeaturePhoneDriver MT65xx Preloader New inst. win 7&8x64 SmartPhoneDriver usb_debugging XP 其中SP Flash Tool线刷必备的驱动程序已包含在 MT65xx Preloader 这个文件夹里面。最新的MTKUsbAll_0.9.2 也提供了一个自动安装程序,位于SmartPhoneDriver/Driver_Auto_Installer_SP_MTK/Driver_Auto...https://www.cnroms.com/mtk-sp-flash-tool-download-with-drivers-tutorials.html
9.mt6582刷机工具(SPFlashTool)官方电脑版mt6582刷机工具可用于联想S6000g平板电脑刷机,支持MT6582的移动叔叔SP_Flash_Tool_v3.1332.0.sn187刷机工具,可用于联想S6000的刷机操作。自带SP_Drivers_v1.5安卓驱动android_winusb、androidwinusb86。 相关热搜:miui一键刷机海马助手刷机精灵海马助手 mt6582刷机工具(SP Flash Tool)下载地址 ...https://www.jrxwxm.com/soft/987534.htm
10.SPFlashTool0xC0010001errorwithMT8516(hw0x8167...I disabled a protection by using this utility and than tried to readback using SP Flash Tool (UART mode) but constantly getting ERROR: STATUS_ERR (0xC0010001) According to this https://forum.hovatek.com/thread-439.html Error 0xC0010001) Message: ERROR: STATUS_ERR (0xC0010001) Meaning DA...https://github.com/MTK-bypass/bypass_utility/issues/29
11.flashingAndroid,SPFlashtoolI need to flash a new firmware for my china X-302 Tablet (detail below). From the producer i have got a package containing firmware, stock rom, sp flash tool, drivers etc. When I want to use flash_tool.exe select and add download agent (for example MTK_AllInOne_DA...https://stackoverflow.com/questions/35771892/android-sp-flash-tool-cannot-add-download-agent-s-fthnd-file-load-fail-500
12.SPFlashToolDownloadwithAuthentication(Latest)for...SP Tool Usage:- SP Flash Tool is used to Flash MTK cpu based Mobile & Tablet. 1- Download the package & Extract SP flash tool. 2- Out of the icon appearing, Double click on Flash_tool.exe 3- it will launch the tool on your PC, Click on Scatter-Loading appearing on the Right sid...http://repairmymobile.co/flash/sp-flashing-tool/
13.如何修复SPFlashTool报错问题?答:这种情况可以通过取下电池,然后重新安装上,进入REC后选择关机,再次尝试刷机来解决。 通过以上内容可以看出,在使用SP Flash Tool进行刷机时,遇到错误是常见的情况,了解每个错误代码的具体含义和相应的解决方案,可以帮助用户更顺利地完成刷机过程,如果遇到无法解决的问题,可以参考相关教程或寻求专业帮助。https://blog.huochengrm.cn/gz/760.html
14.MTK联发科SPFlashTool下载工具使用说明1、SP_Flash_Tool运行环境及配置说明 1、SP_FLASH_TOOL运行环境说明 1.1 操作系统:提供的下载工具包...https://bbs.16rd.com/thread-607210-1-1.html
15.MTK的线刷工具FlashTool的常见错误码51CTO博客MTK的线刷工具Flash_Tool的常见错误码 现在MTK平台应用是越来越广泛了,无论是国产山寨高仿手机,或者是新兴品牌,又或者是国际大品牌都有采用MTK平台的手机,那么我们在使用中如果想要升级或者刷机,都会用到MTK专业的刷机工具SP_Flash,也许你会碰到过各种各样的问题。https://blog.51cto.com/3078781/3286567
16.GSMHelpfulWait for the process to complete. Once done, disable protection as shown in the tool. 6. Prepare SP Flash Tool: Open the SP Flash Tool and click onScatter-loading. Select theMT6765_Android_scatter.txtfile from the extracted firmware folder. ...http://www.gsmhelpful.com/2021/02/oppo-a5s-unlock-when-forgot-pattern-lock-password-sp-flash-tool.html