Android二代壳对方法体的静态抽取和动态回填过程

创建 Dex

Android Studio 中新建工程,添加一个类,内容如下,功能很简单,只输出一行日志。

1
2
3
4
5
6
7
8
9
package dev.svip.dextest;

import android.util.Log;

public class test {
    public void testFunc(){
        Log.i("sviplog", "hi, I'm from testFunc");
    }
}

image-20211227142218175-16407573329731

编译项目,进入 app/build/intermediates/javac/debug/classes 目录,使用 dxclass 文件打包成 dex

1
java -jar /root/Android/Sdk/build-tools/30.0.2/lib/dx.jar --dex --output=test.dex dev/svip/dextest/test.class

此时我们可以使用 jadx 查看生成的 test.dex,可以直接看到原始内容。

image-20211227142733082

置空方法指令

复制一份 test.dex,使用 010 Editor 打开,使用模板加载后定位到以下位置

image-20211227160526526

将该字段全部置为 0

image-20211227160709945

保存后再使用 jadx 打开,会发现已全部被置空成 nop

image-20211227160812452

image-20211227160859599

修改 CheckSum

使用以下代码计算修改后的 dexchecksum ,需要使用 python2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#! /usr/bin/python
# -*- coding: utf8 -*-
import binascii

def CalculationVar(srcByte,vara,varb):
    varA = vara
    varB = varb
    icount = 0
    listAB = []

    while icount < len(srcByte):
        varA = (varA + srcByte[icount]) % 65521
        varB = (varB + varA) % 65521
        icount += 1

    listAB.append(varA)
    listAB.append(varB)

    return listAB

def getCheckSum(varA,varB):
    Output = (varB << 16) + varA
    return Output

if __name__ == '__main__':
    filename = 'new.dex'
    f = open(filename, 'rb', True)
    f.seek(0x0c)
    VarA = 1
    VarB = 0
    flag = 0
    CheckSum = 0
    while True:
        srcBytes = []
        for i in range(1024):               #一次只读1024个字节,防止内存占用过大
            ch = f.read(1)
            if not ch:                      #如果读取到末尾,设置标识符,然后退出读取循环
                flag = 1
                break
            else:
                ch = binascii.b2a_hex(ch)   #将字节转为int类型,然后添加到数组中
                ch = str(ch)
                ch = int(ch,16)
                srcBytes.append(ch)
        varList = CalculationVar(srcBytes,VarA,VarB)
        VarA = varList[0]
        VarB = varList[1]
        if flag == 1:
            CheckSum = getCheckSum(VarA,VarB)
            break
    print('[*] DEX FILENAME: '+filename)
    print('[+] CheckSum = '+hex(CheckSum))

image-20211227164628315

修改 dex 文件中的 checksum

image-20211227165238953

to be continued

十里青山远,潮平路带沙。数声啼鸟怨年华。又是凄凉时候,在天涯。白露收残月,清风散晓霞。绿杨堤畔问荷花。记得年时沽酒,那人家。

updatedupdated2022-05-172022-05-17