最近学习Android的一些基础的文件格式。本文以dex文件格式的修改为例,破解一个简单的程序。
重点在于利用脚本对DEX的修改修正校验。
unzip -d ./out app-release.apk 解压apk文件
- 用ida打开
classes.dex 文件,alt+T 查找字符串ID0x7f06002c ,结合查找makeText 等特征,找到相应代码,并通过Patch Program 将原来if-nez 的机器码39 00 0f 00 修改为if-eqz 对应的38 00 0f 00 。此处,if-nez 的Opcode 为39 ,if-eqz 的Opcode 为38
- 修改后的DEX,其DexHeader头部的checksum和signature字段是错误的,需要修正。
有两种方法:
DexFixer.1sc 脚本
int endian = ReadInt(0x28); //endian_flag
if (endian == 0x12345678) {
LittleEndian();
} else {
BigEndian();
}
uchar sha1[20];
ReadBytes(sha1, 0xc, 20);
Printf("src sha1: ");
uint i=0;
for (i=0; i<20; i++)
{
Printf("%02x", sha1[i]);
}
Printf("\n");
uchar checksum[20];
ChecksumAlgBytes(CHECKSUM_SHA1, checksum, 0x20);
Printf("calced sha1: ");
for (i=0; i<20; i++)
{
Printf("%02x", checksum[i]);
}
Printf("\n");
int adler32 = ReadInt(0x8);
if (Memcmp(checksum, sha1, 20) != 0) {
WriteBytes(checksum, 0xc, 20);
} else {
Printf("same sha1\n");
}
//uchar adler32_[4];
//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");
|