一、分析app逻辑代码
1.运行程序,输入任意符号,点verify看下报错。
2.反编译代码,搜索报错字符并查看相关方法。
1 | public void verifyClick(View v) { |
3.步入到生成activatedKey的方法,算法比较简单。
1 | public static byte[] xor(byte[] val, byte[] key) { |
4.生成activatedKey后,点击“premium content”按钮,会调用MainActivity中的方法,并将“Mac”与”key”传入MainActivity
1 | public void showPremium(View view) { |
其中getMac与getKey方法如下:
1 | private String getKey() { |
5.在MainActivity中通过调用setringFromJNI函数,计算出最终结果。
1 | public void onCreate(Bundle savedInstanceState) { |
6.梳理下流程,整个过程比较条理。
通过网络验证—>生成activatedKey—>获取mac值—>通过setringFromJNI计算得出最终结果。
二、实现:
虽然有更简单的实现方法,但这里是通过new一个实例,然后直接调用java方法,并调用native函数返回目标值,有些知识点还是值的学习的。
1 | function hook() { |
运行结果:
1 | message: {'type': 'send', 'payload': 'mac的值为:02:00:00:00:00:00'} data: None |
byte与string互相转换的小技巧
1
2
3
4
5
6
7
8
9
10
11function stringToBytes(str){
var javaString = Java.use('java.lang.String');
var bytes = [];
bytes = javaString.$new(str).getBytes();
return bytes;
}
function bytesToString(bytes){
var javaString = Java.use('java.lang.String');
return javaString.$new(bytes);
}