〖专业教程〗围棋 cnvcs版 爆破签名校验 so修改 so调用dex广告

查看 110|回复 9
作者:芽衣   
软件下载地址:http://www.cnvcs.com/go.html
他家基本上都是用这种逻辑,用围棋做例子吧,玩的人比较多。

准备工具:
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聊起

下载次数, 下载附件

刀大喵   

一看标题 我啪一下  就进来了 很快呀! 然后...骂骂咧咧的走了
芽衣
OP
  


长夜行 发表于 2020-11-26 16:29
一指禅的帖子怎么没了...

被丢到福利区了。app原版有公众号不给发
a7zy   

这两天一直在看楼主帖子,支持
长夜行   

一指禅的帖子怎么没了...
芽衣
OP
  

@正己 @zhangxu888
一起来玩啊,都是用过ida的,正好练手。
小冰冰丶   

[i]
zhangxu888   


芽衣 发表于 2020-11-26 16:34
@正己 @zhangxu888
一起来玩啊,都是用过ida的,正好练手。

这.....@正己
S1280P   

占位等更新……
木小歌   


刀大喵 发表于 2020-11-26 17:02
一看标题 我啪一下  就进来了 很快呀! 然后...骂骂咧咧的走了

骂骂咧咧?那到底是谁不讲武德?
您需要登录后才可以回帖 登录 | 立即注册