pcy190 发表于 2019-5-22 20:15

DEX文件的修改

最近学习Android的一些基础的文件格式。本文以dex文件格式的修改为例,破解一个简单的程序。
重点在于利用脚本对DEX的修改修正校验。
1. `unzip -d ./outapp-release.apk`解压apk文件
2. 用ida打开`classes.dex`文件,`alt+T`查找字符串ID`0x7f06002c`,结合查找`makeText`等特征,找到相应代码,并通过`Patch Program`将原来`if-nez`的机器码`39 00 0f 00`修改为`if-eqz`对应的`38 00 0f 00`。此处,`if-nez`的`Opcode`为`39` ,` if-eqz`的`Opcode`为`38`
3. 修改后的DEX,其DexHeader头部的checksum和signature字段是错误的,需要修正。
有两种方法:
-   可以使用`DexFixer.1sc`的010 Editor脚本来实现对EDX的修改。010 Editor打开DEX文件,在文件上执行DexFixer.1sc脚本即可。(脚本贴在文末)
- 使用dex2jar提供的工具d2j-dex-recompute-checksum
[此处下载](https://sourceforge.net/projects/dex2jar/)
```
d2j-dex-recompute-checksum -f ./classes.dex
```
命令执行后,会在当前目录生成修正后的文件`classes-rechecksum.dex`。更名为`classes.dex`后重新打包APK并签名即可。

## `DexFixer.1sc`脚本
```
int endian = ReadInt(0x28); //endian_flag
if (endian == 0x12345678) {
    LittleEndian();
} else {
    BigEndian();
}

uchar sha1;
ReadBytes(sha1, 0xc, 20);

Printf("src sha1: ");
uint i=0;
for (i=0; i<20; i++)
{
    Printf("%02x", sha1);
}
Printf("\n");

uchar checksum;
ChecksumAlgBytes(CHECKSUM_SHA1, checksum, 0x20);

Printf("calced sha1: ");
for (i=0; i<20; i++)
{
    Printf("%02x", checksum);
}
Printf("\n");


int adler32 = ReadInt(0x8);
if (Memcmp(checksum, sha1, 20) != 0) {
    WriteBytes(checksum, 0xc, 20);
} else {
    Printf("same sha1\n");
}

//uchar adler32_;
//ChecksumAlgBytes(CHECKSUM_ADLER32, adler32_, 0xc);
int adler32_ = Checksum(CHECKSUM_ADLER32, 0xc);
Printf("src adler32: %x\n", adler32);
Printf("calced adler32: %x\n", adler32_);

if (adler32_ != adler32) {
    WriteInt(0x8, adler32_);
} else {
    Printf("same adler32\n");
}

Printf("Done.\n");

```

jics007 发表于 2019-5-22 21:40

纯支持!希望可以多发技术帖子!!中华大神其实很多都是比较低调的!

心里乐开花 发表于 2019-5-23 11:25

感谢大佬的分享,支持一下!虽然看不懂。。。

voice 发表于 2019-5-23 17:08

支持支持

ZY新势力 发表于 2019-5-23 17:24

支持一下

weiwei321 发表于 2019-5-23 19:04


谢谢楼主提供分

hkdg009 发表于 2019-5-24 09:20

支持一下啊!!!!

灯笼小鱿 发表于 2019-5-24 13:50

支持支持

qwe112312 发表于 2019-9-18 22:05

下载链接了

maxshihe 发表于 2020-1-2 13:46

页: [1] 2
查看完整版本: DEX文件的修改