IDA去除so签名验证(新手向)
众所周知,签名校验是一个对安卓逆向人超级头大的一个问题,与其用工具去除,不如用了解签名校验的原理后用ida去除
Part 0 原理
签名验证必须调用系统api
Java层一般通过getPackageManager().getPackageInfo.signatures来获取签名信息。
NDK层一般调用Native方法/DLL/Lua脚本等通过获取Java的context/Activity对象,动态JNI反射调用getPackageInfo等来获取签名。
Part 1 查签名验证
我们拿到这个apk后重签名,发现无法正常运行,说明有签名验证。我们再安装原签名apk断网后正常运行,说明是本地验证
先用jeb打开
搜索signatures
并未找到,说明Java层面没有签名校验

接着,我们搜索loadLibrary,这是Java层面调用so的api

我们双击跳转

这段代码的大意是将JniTest赋值到寄存器0再将此作为参数传入LoadLibrary()
我们解压apk打开lib目录,选择对应手机型号的cpu,UP是armabi架构
用IDA pro打开libJniTest.so
用以下选项打开

如果没有Elf for arm 就安装ELF.b
我们搜索signature,勾选查找所有事件

我们会搜索出很多结果,一般只需要看一看函数(function)

我们先点开第一个函数,打开图标视图


发现没有关键跳转,接着往下看,我们会在图中所示的函数发现关键跳转

右键,转换为文本视图,按F5转换为伪C代码(前提你的IDA支持)

我们发现了签名校验的函数,按ESC退出反编译模式,因此我们要让跳转失效

BEQ指令是“相等(或为0)跳转指令”,
BNE指令是“不相等(或不为0)跳转指令”,
B指令是“无条件跳转指令”,
CBZ 指令是“比较,为零则跳转”,
CBNZ指令是“比较,为非零则跳转”。
通过工具,我们发现:
BNE跳转指令对应的HEX机器码是D1,
BEQ跳转指令对应的HEX机器码是D0,
CBZ跳转指令对应的HEX机器码是B1,
CBNZ跳转指令对应的HEX机器码是B9。
所以,我们需要把BNE改为BEQ,即把D1改为D0,IDA无法修改,只是为了定位

记住内存地址,用notepad++或mt的hex编辑器修改

最后,我们重签名,就不会退出了