怎么过反调试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原创奖励计划,禁止转载。