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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)