听说这个是这个题是2016年腾讯游戏移动安全赛的题
主要是注册机的编写
以前自己学习拿来练习ARM汇编和算法逆向的
自己写的ARM的汇编的就不贴了 这里主要是F5后的
夜神模拟器安装apk 输入name和code

打开androidkiller搜索字符串Check Fail!

找到关键点,发现了一个NativeCheckRegister

找到NativeCheckRegister的声明的地方

我们发现是一个Native函数,在so层,因此我们只能去so层用ida去分析
libCheckRegister.so 拖入IDA中
找到相关函数,因为函数不多我们可以直接看,如果函数多可以用ctrl+f搜索

双击进去

由于是jni函数,因此我们导入相关结构体并重命名
按insert快捷键,导入JNI相关结构体



参数,变量,函数名都重命名得到如下所示

我们重命名的check里面就是我们想要的算法了
点击进去具体分析
首先也是参数变量函数名重新命名
我们发现这里识别错误 数组大量使用了[j*4] 我们可以将数组类型转化为int
最后我们得到代码是

4. 注册机思路
我们这里梳理下流程逻辑和思路
s[] <--用户名name
v15[]<--密码pwd
v12[]<--s[]
v13[]<--v15[]
v13[]<--v12[]
我们的注册机是已知name求pwd
根据上面的逻辑我们可以得到求解过程
用户名name -> s[] -> v12[] -> v13[]->v15[]->密码pwd
那么v12[]和v13[]的关系怎么得到 ?

v15[]->pwd怎么获得?
那就要我们分析上面那两个函数了

一开始看到头都大了 这个算法的计算量又大了
不过当看到一个数组的时候,立马就点进去看看有什么特征

里面除了一些0x40外 其他的字符特别像base64的表
即使是base64表也不能保证这个表没有变形
还是看代码吧
解码的具体代码 里面注释了详细的解码过程


4. 总结与心得
算法逆向真的是体力活,坐不住根本分析不下,这里是F5后分析的比较简单,干看ARM汇编更吃体力
常用加解密的算法还是要了解啊,最好熟悉,这样对逆向的帮助很大
注册机的编写心得:
能用现有可以利用的代码就用
算法逆向有时候就像做数学题,就是已知条件求未知,通过找他们之间的关系,一步一步打通关系,最后得到解,但是有时候这个解并不是完美的解。
练习的时候还是要少用F5 多看ARM汇编,这才是基本功
书读百遍其义自见,同样逆向百遍其义自见
本文由看雪论坛 lcdxsun 原创
原文链接:https://bbs.pediy.com/thread-250740.htm
网友评论