他家基本上都是用这种逻辑,用围棋做例子吧,玩的人比较多。
准备工具:
1、IDA(需要keypatch补丁)
2、16进制编辑器
论坛有去广告教程和成品,我就不掺和了。我主要是想分析一下为什么去广告删dex的类会闪退,以及如何不使用一键hook爆破签名校验。
注意:此教程难度较大,不适合小白萌新,看看就好。
一、dex删广告后偶尔闪退
1.png (96.24 KB, 下载次数: 0)
下载附件
2020-11-27 15:11 上传
其实这app广告不多,就1个广告类。删除qq文件夹以后,再清一下权限和dex的调用,还是有偶尔闪退的现象,不是每次启动都闪退。
全局搜索com/qq/e,发现so里面有关键词,于是用ida加载so看看怎么回事。
1.png (29.79 KB, 下载次数: 0)
下载附件
2020-11-27 15:22 上传
so加载完毕后搜索字符串
com/qq/e
,有几个结果,分别是腾讯的开屏广告和横幅广告。不用分析也知道肯定是so调用了这个路径,但是so找不到,于是就崩溃了。把广告写进so可能是想阻止一些人删掉类去广告,但是去qq广告我相信很多人都知道怎么做。
所以,如果你要删dex广告类,so的那些字符串得填充00去掉,可以用16进制编辑器,或者nop掉BLX。
1.png (66.7 KB, 下载次数: 0)
下载附件
2020-11-27 15:37 上传
因为这个是偶尔出现的问题,我就不实际测试了。但是改法应该不会错。当然你也可以通过跳转绕过去,比如绕过函数调用、绕过分支,如果不闪退说明可行。
二、爆破so签名校验
ida不要关闭,字符串继续搜索
Signature
,有3个结果,随便点一个进去。
1.png (114.55 KB, 下载次数: 0)
下载附件
2020-11-27 15:48 上传
字符串来源是
sub_151A18
函数,双击进入。
1.png (81.7 KB, 下载次数: 0)
下载附件
2020-11-27 15:53 上传
从代码可以看出这个函数主要进行了一个获取签名的行为,和smali类似。为了方便阅读,我重命名了函数,sub_151A18重命名为GET_SIGNATURES。然后查找引用,只有1个,双击进入sub_805E0。
1.png (53.02 KB, 下载次数: 0)
下载附件
2020-11-27 16:02 上传
1.png (44.07 KB, 下载次数: 0)
下载附件
2020-11-27 16:08 上传
下面还有个函数sub_14AF4C,进去看看。
bool __fastcall sub_14AF4C(_BOOL4 result, const char *a2)
{
if ( result )
{
if ( a2 )
result = strcmp(result, a2) == 0;
else
result = 0;
}
return result;
}
strcmp,比较字符串。所以这里主要负责比较字符串的任务。为了方便识别,我把他重命名为Check。
通过x查看引用,发现有很多函数调用了这里,所以不能直接修改这个地方。
返回sub_805E0,因为有个跳转判断,所以最开始我改CMP R0, #1,让他往反方向跳,能进app了,刚想笑,结果发现触屏无响应……
1.png (254.72 KB, 下载次数: 0)
下载附件
2020-11-27 16:36 上传
看来这里无论如何都要验证获取到的签名值是否正确。f5看一下sub_805E0的伪代码,他的部分代码如下:
v31 = sub_14D18A(dword_399414, 1);
sub_933BC(v31);
v32(R8) = sub_14A19C(dword_3993C4, "data", &unk_1D1F9A);
GET_SIGNATURES(&v40, 1024, v33(R2));
v34(R6) = Check(v32(R8), &v40);
if ( v34(R6) )
{
dword_39952C = dword_3993F8;
v34(R6) = sub_13DD2A(dword_3993F8);
1.png (34.37 KB, 下载次数: 0)
下载附件
2020-11-27 17:02 上传
R8应该就是正确的签名值,R7就是获取到的签名值,然后这两个进入Check进行了一个对比。
既然这样,那我就让这个so左右互搏。具体做法是把R8的数据拷贝到R7里面,让so自己跟自己校验,这样就不怕数据对不上了。
双击
GET_SIGNATURES
函数进入,这个函数原本是获取签名值的,我现在要让他把R8的数据拷贝到R7里面去。
先确定开始和结束。
PUSH
压栈,R4-R11和LR。出栈和原来保持一致
POP
,R4-R11和PC。
1.png (47.66 KB, 下载次数: 0)
下载附件
2020-11-27 17:28 上传
接着MOVS R3, #0改成MOV R2, R0
LDR R5, =(dword_399384 - 0x151A2A)改成
MOV R3, R8
,把正确的签名值放到R3里面去
1.png (73.81 KB, 下载次数: 0)
下载附件
2020-11-27 18:08 上传
继续,MOV R8, R0改成MOVS R1, #0
STRB R3, [R0]改成LDR R1, [R3],#1
1.png (93.59 KB, 下载次数: 0)
下载附件
2020-11-27 18:14 上传
因为长度不一样,所以汇编变了,不用管,继续改。ADD R5, PC改成STR R1, [R2],#1
1.png (83.43 KB, 下载次数: 0)
下载附件
2020-11-27 18:16 上传
BL sub_1531EC改成
CMP R1, #0
DCB 0xDF, 0xFB改成BNE,变成一个循环,如果没有拷贝完就继续拷贝。
1.png (105.18 KB, 下载次数: 0)
下载附件
2020-11-27 18:23 上传
注意,因为要循环到loc_151A22,但是直接写这个地址是没有办法汇编进去的,所以先循环到loc_151A6A。
1.png (64.46 KB, 下载次数: 0)
下载附件
2020-11-27 18:27 上传
现在ida有点精神错乱,无法识别这个是什么意思。不用理,最后出栈。MOV R4, R0改成POP {R4-R11,PC}
1.png (86.37 KB, 下载次数: 0)
下载附件
2020-11-27 18:29 上传
1.png (86.89 KB, 下载次数: 0)
下载附件
2020-11-27 18:30 上传
现在差不多大功告成了,保存修改,关闭ida,然后再重新打开ida加载修改后的so。重新进入原来的函数,看看变成什么样了。
1.png (108.36 KB, 下载次数: 0)
下载附件
2020-11-27 18:36 上传
现在正常识别了,但是还有一个问题,就是循环的地址不正确。现在箭头指向的是text:00151A6A,现在我要把它变成text:00151A22。右键BNE loc_151A6A,利用ida插件(keypatch 2.2)可以快速移动跳转地址。
如果你想往上移,就直接在后面写上负数,比如-10,-30都可以,反之写正数,多调几次,直到151A22为止。
1.png (99.24 KB, 下载次数: 0)
下载附件
2020-11-27 18:42 上传
1.png (54.5 KB, 下载次数: 0)
下载附件
2020-11-27 18:42 上传
效果如上面2张图,指针已经往上移动了。看来还不够,继续调一下,如果出现错误还原了继续调。
1.png (86.15 KB, 下载次数: 0)
下载附件
2020-11-27 18:45 上传
最终效果如上,这是一个简单的拷贝汇编。
为了有更好的视觉效果,我关闭ida再重新加载so,再看一下变成什么样了。
.text:00151A18
.text:00151A18 ; =============== S U B R O U T I N E =======================================
.text:00151A18
.text:00151A18
.text:00151A18 sub_151A18 ; CODE XREF: sub_805E0+356↑p
.text:00151A18 ; __unwind {
.text:00151A18 PUSH.W {R4-R11,LR}
.text:00151A1C MOV R2, R0
.text:00151A1E MOV R3, R8
.text:00151A20 MOVS R1, #0
.text:00151A22
.text:00151A22 loc_151A22 ; CODE XREF: sub_151A18+14↓j
.text:00151A22 LDR.W R1, [R3],#1
.text:00151A26 STR.W R1, [R2],#1
.text:00151A2A CMP R1, #0
.text:00151A2C BNE loc_151A22
.text:00151A2E POP.W {R4-R11,PC}
.text:00151A2E ; End of function sub_151A18
.text:00151A2E
1.png (109.38 KB, 下载次数: 0)
下载附件
2020-11-27 18:54 上传
2.png (50.77 KB, 下载次数: 0)
下载附件
2020-11-27 18:54 上传
上图分别是文本视图和图表视图,看起来就很美观了。现在把改好的so丢回去,重签名后安装试试看。
1.png (338.08 KB, 下载次数: 0)
下载附件
2020-11-27 18:56 上传
成功!
相关参考资料:
ARM汇编指令(ARM寻址方式、汇编指令、伪指令)
C语言调用汇编语言实现字符串拷贝
从汇编指令BNE聊起