修改过程
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
的010 Editor脚本来实现对EDX的修改。010 Editor打开DEX文件,在文件上执行DexFixer.1sc脚本即可。(脚本贴在文末) - 使用dex2jar提供的工具d2j-dex-recompute-checksum
此处下载
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[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");
Comments | NOTHING