[原创]2016腾讯游戏安全竞赛android第一题分析
2016年游戏安全技术竞赛第一轮——Android方向分析文档
1.App要求输入一个name和一个code,然后在java层调用native中的方法NativeCheckRegister来验证输入的name和code。所以主要工作就是在native中分析验证算法。
2.在nativecheckregister中主要逻辑在子过程中

3.在check中首先检查name的长度必须在6~20之间

4.接下来对name做了一些变形处理

大致作用就是(0x1339e7e + idx) * name[idx % len(name)] * len(name) + 上一步结果的高三个字节。每一步的结果存储的时候都会覆盖上一步结果的高地址的三个字节。所以16次循环后就会产生19个字节的数据1个字节0。
5.之后一个子过程开始处理code

这个子过程的返回值和0x14比较,相等就进入后面的验证逻辑。分析子过程的逻辑后计算得到code的长度为27。
6.进入上一步的子过程分析

首先通过查表得到code的长度,表中的数据都是小于0x40的,0-9,a-z,A-Z,与一些符号,分别映射向了小于0x40的值。
7.接着通过一个压缩算法,把4个字节数据压缩成3个字节。因为上一步的映射关系都是小于0x40(01000000)的,所以所有的数据每个字节只需要6位,4*6==3*8。


8.code数据压缩完之后,对之前处理过的name数据再除以10,然后通过两个方程组和一个方程来验证code。

方程组一:
X8 = X10 + cipher_name[0]
X8 + cipher_name[1] = 2X10
方程组二:
X0 = Xc + cipher_name[2]
X0 + cipher_name[3] = 2Xc
方程:
X4 + cipher_name[4] = 3cipher_name[3]
keygen_src.zip
