用jadx打开apk
很明显gogogoJNI.check_key()返回值为1是我们想要的
查看check_key(),是个native方法,需要分析so
其中sayHello()返回值为http://127.0.0.1:8000(分析so得到的)
IDA打开so,找到check_key
发现该函数只要输入值不为空,就返回1,明显是故意放出来,混肴我们视线的。
众所周知,so是先加载.init、init_array、JNI_OnLoad(),一个个查看分析
发现JNI_OnLoad()最终调用了inti_proc()
查看inti_proc(),socket和创建线程引起我的注意
进入nullsub_()函数
很明显,是个网页,mm0为关键
右击mm0,查找引用,发现inti_proc()一开始做了些事情
手动导出解密一下mm0处的数据,发现是个html。对其进行分析,发现关键点——check_key()
再仔细看了一下,呵,居然是披着html皮的WASM文件!
主要逻辑在WebAssembly中, 保存下来用wasm2c反编译成c代码,使用gcc编译获得中间文件dump.o,将dump.o拖入ida进行分析。
wasm2c链接:https://github.com/WebAssembly/wabt/releases
wasm2c dump.wasm -o dump.c
找到check_key(),代码如下:
__int64 check_key()
{
int ret;
if ( ++wasm_rt_call_stack_depth > 0x1F4u )
wasm_rt_trap(7);
o(1024, 1025, 1026, 1027);
oo(1028, 1029, 1030, 1031);
ooo(1032, 1033, 1034, 1035);
oooo(1036, 1037, 1038, 1039);
ooooo(1040, 1041, 1042, 1043);
oooooo(1044, 1045, 1046, 1047);
ooooooo(1048, 1049, 1050, 1051);
oooooooo(1052, 1053, 1054, 1055);
ret = xxx();
--wasm_rt_call_stack_depth;
return ret;
}
几个o函数做了一些异或,xxx函数是解方程组,然后异或一下。
使用z3,整理一下得到答案:K9nXu3_2o1q2_w3bassembly_r3vers3
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法