Android ARM so Hacking修改
供应商提供了一个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的修改中,比较常用的三个方法是:
- 替换返回值
- 将部分指令替换成nop
- 修改cmp指令的比较值
通过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替换