Android逆向之旅—破解某应用加密算法(二)
然后用010Editor工具打开so文件,找到这个地址:
怎么修改成NOP指令呢?有一个牛逼的网站在线转换arm为hex值:http://armconverter.com:
这里看到转换BLX指令的HEX正好和上面看到的HEX值对应上了,这里修改NOP指令:
看到NOP指令对应的HEX值是C046,那就修改吧:
这里注意需要把那两条指令的所有HEX全部改成NOP指令,保存再用IDA打开查看:
修改成功,这两个函数就等于没调用了,在运行调用so还是崩溃,这时候需要想到的是有签名校验,而巧合的是在搜索JNI的时候无意发现了这个函数:
当然如果大家想知道so中有没有签名校验,可以直接Shift+F12查找字符串内容”signatures”:
一般有这类字符串信息都有签名校验功能了,我们继续看上面那个签名校验函数:
果然这里会获取签名信息,然后比对返回1表示正确的签名信息,这里我们不要直接修改返回值和那个v5变量值,因为我们知道strcmp函数执行的结果是-1,0,1;这里明显是需要让返回值是0才可以,那不如直接修改v3的初始值为1即可,修改方法和上面的指令修改类似:
记住这个地址,然后去010Editor工具中查看:
然后把赋值修改成1:
然后去010Editor修改即可:
修改之后保存,用IDA打开so:
看到已经修改成功了,然后在F5查看伪代码:
这里不管签名对不对,都直接返回1了,修改了之后我们在运行发现还是报错,这个需要再去看JNI_OnLoad函数了:
这里需要获取一个Java层的类,所以我们在工程中新建这个类即可,这个类可以没有任何方法:
然后运行成功,看看解密之后的内容是啥:
看到解密之后的内容是个字符串version内容,到此我们就成功的过掉了so中的一些检测调用so解密出来内容了,那么在这个过程中我们依然可以学到很多东西:
第一、修改指令,如果不想让一个函数执行,只需要把跳转指令修改成NOP空指令即可,前提是这个函数的执行结果和后面的逻辑没有半毛钱的关系,如果有那么就需要修改函数的返回值,一般需要修改跳转指令之后的MOVS指令的寄存器值,如果简单点可以直接修改变量的初始化值,比如这里的过掉签名校验。
第二、如果快速的知道so中是否有签名校验功能,可以直接在字符串列表中搜索”signatures”即可,现在也有很多应用会在so中调用Java层的类信息,所以需要去看JNI_OnLoad中arm指令,或者直接搜索字符串列表,因为一般Java层类信息,都是xxx/yyy/zzz/MMM这样的字符串格式,通过肉眼排查也是可以的。