2017年10月30日360最新虚拟壳脱壳后完全修复

本文详细介绍了针对2017年10月30日360最新加固助手1.5.3.0版本的虚拟壳脱壳修复过程。首先,通过360加固样本获取指令映射表,然后使用解密和修复工具解析被抽取的指令。最后,通过填充修复后的指令到DEX文件中,完成脱壳。文章还提供了关键步骤和部分指令的示例。
摘要由CSDN通过智能技术生成

20181129加入

今天发现一个hens很神奇事情,我这篇文章当时是最早详细说明,制作映射表然后用映射表修复的文章,然后有一些csdn的博主就拿很久以前比如2017年年初的文章编辑,然后把我写的指令映射表和办法写到他的文章里面,然后他就变成了原创而且比我的时间还早,神操作啊o(╯□╰)o,好神奇啊

---------------------------------------------------------------------------------------------------------------------------------------

在csdn也发一份吧,留作备份

一.说明

网上关于360的脱壳文章一大堆一大堆的,但是早在2016年秋季,360就已经虚拟化oncreate函数的指令到so层去运行了,却没有关于如何完全修复的文章,于是就有了本文,仅供于学习交流啥,希望为加固技术的发展贡献力量,欢迎转载,为了防止被和谐建议保存~

二.概述

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

三.修复详细过程

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

 

第一步:得到最新360加固的指令映射表

(注意360的每个版本的指令映射表都是一样的)

1. 得到加密的指令

附件manualProduceSmali文件夹前面已经说过,其内包含绝大多数指令,将其用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条

0x00,0x02,0x360c8,0x3fc,"nop"

//二、数据操作指令13条

0x01,0x02,0x360ce,0x402,"move"

0x02,0x04,0x360e6,0x41a,"move/from16"

0x03,0x06,0x36102,0x436,"move/16"

0x04,0x02,0x36126,0x45a,"move-wide"

0x05,0x04,0x36146,0x47a,"move-wide/from16"

0x06,0x06,0x3616a,0x49e,"move-wide/16"

0x07,0x02,0x36196,0x4ca,"move-object"

0x08,0x04,0x361aa,0x4de,"move-object/from16"

0x09,0x06,0x361c4,0x4f8,"move-object/16"

0x0a,0x02,0x361e8,0x51c,"move-result"

0x0b,0x02,0x36200,0x534,"move-result-wide"

0x0c,0x02,0x3621e,0x552,"move-result-object"

0x0d,0x00,0x0,0x0,"move-exception"

//三、返回指令4条

0x0E,0x02,0x38b36,0x2e6a,"return-void"

0x0F,0x02,0x0,0x0,"return vAA"

0x10,0x02,0x0,0x0,"return-wide"

0x11,0x02,0x0,0x0,"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 这两个结构体即可

Struct DexMethod{

U4 methodIdx; //361没有处理

U4 accessFlags; //访问标志,被360改成了84 02,也就是0x104本来是04

U4 codeOff; //指向DexCode结构的偏移

}

//这个结构体360没有改动他

struct DexCode {

u2  registersSize;           

u2  insSize;        

    u2  outsSize;                

    u2  triesSize;               

u4  debugInfoOff;      

u4  insnsSize;          指令集个数以2字节为单位,实际为0x4

    u2  insns[1];            指令集,被360加密了的

 };

.结尾

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

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

 

 

 

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

 

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

# virtual methods

.method protected onCreate(Landroid/os/Bundle;)V

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

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

    .locals 14

    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

 

    .prologue

    

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

    nop #opcode=0x00

 

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

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

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

const v2,0x3   #opcode=0x14 #存入int 3到v2

const/high16 v3,0x41200000     #opcode=0x15 #存入float 10.0f到v3

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

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

const-wide v3,0x002bdc545d6b4b87L #opcode=0x18 #存入long 12345678901234567到v3,v4

const-wide/high16 v3,0x4024000000000000L #opcode=0x19 #存入long 10.0常量到v3,v4

const-string v5, "snow_test" #opcode=0x1A

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

    

    

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

move v6, v0 #opcode=0x01 v0移动到v6

move/from16 v6, v0 #opcode=0x02 v0移动到v6

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

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

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

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

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

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

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

    

   

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

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

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

    

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

move-result-wide v7 #opcode=0

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值