嵌入式 Linux C ARM 安卓开发手机移动程序开发

Android ARM so Hacking修改

2018-11-02  本文已影响0人  YANWeichuan

供应商提供了一个android的apk工具,大部分有代码,其中关键部分以so库的形式提供。但是该工具开发过去较长时间,供应商已经不再维护,又不能完全提供源代码。而该工具我们必须要使用,并碰到的问题有两个:

和供应商反复多次沟通后,除了重复帮忙申请序列号外,已无得到其他帮助的可能。如是只能自己想办法解决。首先想到的看看so里面干了什么。从供应商处得到了额外的信息有:1、序列号是有时间期限的;2、联网是为了获取时间。

之前了解过,so的反编译有一个强大的工具叫IDA,因此找一个尝试一下。比较幸运的是,在一个blog中找到了可用的版本,作者还推荐了一个二进制编辑工具,很好用。https://blog.csdn.net/jiangwei0910410003/article/details/49361281

IDA下载:http://pan.baidu.com/s/1qWEbuHY
二进制编辑工具:http://pan.baidu.com/s/1pJ28eoz

在so的修改中,比较常用的三个方法是:

通过IDA反汇编,看到了一个有意思的函数,叫isValidYear,猜猜估计判断时间序列号的,有三种返回值,一般情况下,正确返回0,错误返回负值。首先考虑把所有负值都替换成零。比较方便的是,返回零已经有二进制代码了,直接用编辑工具替换。

编辑器
isValidYear
isValidYear返回值修改

替换后,用过期的序列号也能,成功了!还需要解决联网的问题,在反汇编的符号中,看到了socket,sendto等函数,再找到实现函数,发现是调用一个zxctget的函数,将对应的调用替换成NOP。但是一般情况下,NOP是被优化掉的,不知道NOP的二进制指令。自己写上一段嵌入式汇编,编译出来,对比一下就知道了。

void asm_test()
{
    __asm__(
            "movw r0, #1001 \t\n"
            "movw r12, #2020 \t\n"
            "add r0, r0, r12 \t\n"
            "add r0, r0, r12 \t\n"
            "nop \t\n"
            "cmp r0, r0 \t\n"
            "bx lr \t\n");
}

反汇编代码:

asm

二进制代码:

二进制

既然只是获取时间,比较已经被跳过,需要解决网络获取时间的问题,直接跳过zxctget,将对应的调用BL命令换成NOP。验证后,成功!

BL跳转
NOP替换
上一篇下一篇

猜你喜欢

热点阅读