小编典典
我将在这里回答您的第一个问题:
应用程序的签名存储在APK的DEX(Dalvik可执行文件)文件中。DEX文件具有以下结构:
标头
数据部分 (包含字符串,代码指令,字段等)
*方法标识符,类标识符等的*数组
因此,这是DEX文件头的开头:
DEX_FILE_MAGIC 常数 -ubyte [8]
*您的应用程序的*Adler-32校验和 (DEX_FILE_MAGIC和校验和本身除外)-uint
*应用程序的*SHA-1签名 (DEX_FILE_MAGIC,校验和和哈希本身除外)-ubyte [20]
因此,要确定apk的签名,您应该从偏移量32开始计算DEX文件的SHA-1签名。
要从本地代码访问apk的DEX文件,您可以读取过程内存,该内存存储在/ proc / self / maps中:
FILE *fp;
fp = fopen("/proc/self/maps", "r");
proc / $ ID / maps文件中的每一行都具有以下结构:
地址
权限
抵消
设备
索引节点
路径名
在这里,您可以找到对proc / $ ID / maps文件结构的更好描述:了解Linux / proc / id /
maps
要检测DEX文件在进程内存中的位置,您应该在proc / self / maps文件的每一行中检出“
pathname”列。当找到与DEX文件对应的行时,您应该获得DEX文件区域的开始和结束地址:
while (fgets(line, 2048, fp) != NULL) {
// search for '.dex'
if (strstr(line, ".dex") != NULL) {
// get starting and ending addresses of the DEX file region
因此,当您具有apk字节码的起始地址和结束地址时,便可以计算apk的签名。
2020-12-03