前言

最近分析了一款外挂软件的卡密校验,过程挺有趣的,故记录下来。

正文

该软件的界面如下图:

登录卡密是该界面的一个按钮,首先是获取该界面的类名,如下:

该界面所在的类是com.app.batman.MainActivity,获取到该界面所在的类之后,下一步的目标是定位到发送请求的方法,这一次我的定位方法不同于以往,以前我的定位方法是搜索字符串或者hook关键函数打印调用栈,这一次我所采用的方法是trace,那么什么是trace呢?hook了大量的函数就是trace,使用的脚本是r0trace(项目地址)。我trace了MainActivity类下的所有的函数,从而定位到SignUp这个关键函数,如下图:

在jadx中反编译的代码如下:

该方法是一个native方法,所以要找到注册该函数的so文件,首先我们假设它是动态注册的,因此可以使用frida hook RegistNatives,这里使用yang神的脚本(项目地址),运行结果如下:

发现找不到SignUp函数,那么该函数大概率是静态注册的,那么静态注册的方法该如何定位so文件呢?可以使用frida-trace,还需要注意,静态注册的函数命名是有规则的:Java_ + 包名 + 类名 + 方法名,并且".“都替换成”_",运行结果如下:

可以看到,静态注册该函数的so文件是ban,命名很奇怪,在jadx中找到该so文件的加载位置,如下:

ban文件是经过System.load进行动态加载的,一般都是把该文件进行加密,然后在动态加载是进行解密,先把cache目录下的ban文件放在IDA中看一眼,如下:

我采取的对抗手段是dump出内存中的ban文件,因为程序已经运行起来了,这时候内存中的ban文件是已经解密了的,frida dump脚本如下:

function dumpso(so_name){var libso = Process.findModuleByName(so_name);if (libso == null) {return -1;}Memory.protect(ptr(libso.base), libso.size, 'rwx');var libso_buffer = ptr(libso.base).readByteArray(libso.size);libso.buffer = libso_buffer;var f = new File("/data/data/com.tencent.tmgp.pubgmhd/cache/ban.so","wb")f.write(libso.buffer)f.flush()f.close()console.log("success dump ban.so")console.log("ban.so base address --> " + libso.base)
}
function main(){dumpso("ban")
}
setImmediate(main)

但这个时候的so是不能分析的,还需要修复一下,修复工具使用的是elf-dump-fix(项目地址),把修复后的so文件放进IDA中进行反编译,SignUp的伪代码如下:

发现已经能够正常识别了,下面就是找到发送请求的逻辑,关键代码如下:

上面图中标注的很清楚了,核心逻辑就是判断响应体中的内容的长度是否为32,如果长度为32位,则卡密校验成功,否则卡密校验失败。卡密校验成功之后调用了MainActivity类下面的TOAC方法,下面看看该函数的逻辑:

代码很简单,就是开启了一个服务,那么有没有什么办法看到服务开启后的效果呢?很简单,使用frida进行主动调用就行了,脚本代码及运行效果如下:

在主动调用了TOAC方法之后,外挂的功能模板就弹出来了。那么我们只要修改登录卡密之后的逻辑,让其不论校验成功还是校验失败都调用TOAC方法,这样也就绕过了卡密的校验,具体的过程不再展示。

修改并重打包之后,功能一切正常,但在点开绘制初始化开关之后软件直接闪退了,因此可以判断该软件有签名校验。那么我判断的依据是什么呢?很简单,就是之前我使用frida进行主动调用过卡密校验的时候软件并没有闪退,开关也能正常打开,但是在重打包之后打开开关就闪退。

下面开始绕过签名校验,首先尝试在jadx中搜索signatures,如下:

直接根据包名进行过滤,在java层中并没有我们想要的结果,那么在ban这个so文件里面进行搜索,如下:

可以看到,程序调用了android.content.pm.Signature类下的hashcode方法获取了签名的hash值,并且拿该值与一个特定的值进行比较,如果不相等则直接退出程序,因此这里就是签名校验的关键点。

既然找到了程序校验签名的逻辑,那么我们该如何绕过呢?起初我想的是直接修改so文件,把exit的调用直接nop掉,但是别忘了这个so文件是从内存中dump出来的,其原本的状态是加密的,所以是没办法直接进行修改。那么就可以写xposed模块,去hook hashcode这个方法,让其返回那个正确的hash值,这样也能绕过检验。但是考虑到使用Xposed的环境要求比较苛刻,需要手机进行root,因此我也抛弃了这个方案。

其实即使不root也是能够去hook的,这个方案也被许多知名的软件应用了,比如太极、VirtualXposed、应用转生等等,这也就是我采用的方案,我使用的AOP框架是epic(项目地址),核心代码如下:

然后把编译好的dex文件添加进软件中,并主动调用这段代码也就实现了非root下的hook。

重打包后程序正常运行,至此逆向分析结束。

某直装外挂卡密校验逆向分析相关推荐

  1. 手游直装破解手段分析

    导语 近期朋友公司的多款手游出现直装破解挂的困扰,朋友公司对接的是某鹅的反外挂系统,理论来说大厂不应该出现这类问题,于是我找了下市场流行的一些直装挂分析了一下,发现大多数的直装挂是利用某管理器的过签名 ...

  2. 网易云加密--Android安卓移动应用程序加密加壳保护方案防破解防逆向分析防游戏外挂

    网易云加密--Android安卓移动应用程序加密加壳保护方案防破解防逆向分析防游戏外挂 一.服务简介 网易云加密为网易公司旗下产品,致力于为移动应用程序提供专业保护方案,让加固变得更简单,一键搞定.目 ...

  3. 2019年末逆向复习系列之Boss直聘Cookie加密字段__zp_stoken__逆向分析

    郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关. 这篇文章是公众号<云爬虫技术研究笔记>的<2019 ...

  4. 一文带你了解对游戏外挂的逆向分析的详细步骤。

    详细的逆向分析步骤,可以点击下面文字链接进行查看. 链接:游戏外挂样本逆向详细步骤

  5. boss直聘__zp_stoken__逆向分析2021.10版

    1.前言: 本分析过程仅供学习交流使用,切勿用于非法行为 我的另一篇文章boss直聘zp_stoken逆向分析源码放送讲的更详细且含源码 博客所写的所有算法还原均已开源在GitHub,地址 https ...

  6. (最新)唯品会WEB端加密参数逆向分析

    最新某品会商品详情接口加密参数逆向分析 一.明确加密参数 二.加密参数的逆向分析和算法还原 2.1 authorization的逆向分析和还原 2.2 mars_sid 的逆向分析和还原 2.3 ma ...

  7. 【验证码逆向专栏】极验三代、四代点选类验证码逆向分析

    声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...

  8. Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

    原文:http://blog.zhaiyifan.cn/2016/02/09/android-reverse-1/ 本系列文章是<Android软件安全与逆向分析>的实践笔记(一些工具的版 ...

  9. 【JavaScript 逆向】网易易盾滑块逆向分析

    声明 本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除! 案例目标 验证码:aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc= 以上 ...

  10. 从微信扔骰子看iOS应用安全与逆向分析

    前言 在之前<免越狱调试与分析黑盒iOS应用>以及前几篇文章中已经介绍了如何开始分析iOS应用,不过都是基于非越狱的机器,其本意是为了能够在自己的主力设备中进行简单的分析和调试.但是执着于 ...

最新文章

  1. Javascript中二进制数据处理方法
  2. python常用内置模块-Python-常用的内置模块
  3. Hadoop之道--MapReduce之Hello World实例wordcount
  4. Linux监控服务命令
  5. unity android ndk的作用,Unity中编写Android下使用的so插件
  6. 好看的论文千篇一律,有趣的Github项目万里挑一!
  7. struts2.2.1关于sitemesh和freemarker整合的细节
  8. 谈谈微服务中的 API 网关(API Gateway)
  9. Mysql 休眠连接过多,有可能导致“Too many connections”的错误
  10. 方法引用、构造器引用和数组引用
  11. 基于vue2.0 + elementUI 后台管理平台
  12. centos7 开机启动文件路径_centos7定时运行python脚本
  13. 高斯-赛得尔迭代式 c++_高斯混合模型(聚类、密度估计)
  14. 记录几个贴代码比较美观的网站
  15. 网上下载或自己编程实现任意一种多变量决策树算法,并观察其在西瓜数据集3.0上产生的结果。
  16. Windows照片查看器无法显示此图片
  17. CATIA二次开发—API梳理
  18. blast2go下载和本地安装
  19. Oracle练习题及答案
  20. 深度学习模型与湿实验的结合,有望用于代谢通量分析

热门文章

  1. SQL面试经典题(含答案)
  2. 北理乐学c语言答案猴子,【北理乐学】机智的大师
  3. 谈谈如何使用 opencv 进行图像识别
  4. caxa自动保存的文件在哪里_CAXA2011突然退出如何找回未保存文件,新建菜单里的文档恢复没有存档。...
  5. 组态软件MCGS(昆仑通态)初识
  6. Web版Telnet工具设计与实现
  7. Telnet 工具远程连接服务器
  8. CorelDRAWX4的VBA插件开发(八)更改尺寸与移动
  9. java8新特性及汪文君Google Guava项目实战
  10. GB28181协议简介及实践