Android逆向——网易云音乐排行榜api(上)

7,424 阅读2分钟

1. 抓包分析



抓包可见,发送报文的body都是params=xxxxxxx这种格式的,于是可以判断params是个逆向的关键字

2. JEB反编译原包,Java层静态分析

反编译之后发现,几乎所有的字符串都被加密了


但是,是通过了a.auu.a.c这个方法进行了解密操作,跟进去


获得解密流程,先用base64解码字符串,然后遍历字符串与关键字进行异或

用python写之,同时逆向能获取加密方式,

from binascii import b2a_hex
from base64 import b64decode,b64encode
def decrypt_string(d):
	v0 = b64decode(d)
	v5 = len(v0)
	v4 = "Encrypt"
	v2 = 0
	v3 = 0
	result = ""
	while v2 <v5:
		if v3 >= len(v4):
			v3 = 0
		result += chr(ord(v0[v2])^ord(v4[v3]))
		v2+=1
		v3+=1
	return result
def encrypt_string(e):
	v0 = e
	v5 = len(v0)
	v4 = "Encrypt"
	v2 = 0
	v3 = 0
	result = ""
	while  v2<v5:
		if v3 >= len(v4):
			v3 = 0
		result += chr(ord(v0[v2])^ord(v4[v3]))
		v2+=1
		v3+=1
	return b64encode(result)
# print decrypt_string("ZQcNBhwCAiQCWQ==")
print encrypt_string("params")

可得params加密后是NQ8RExQD,搜索NQ8RExQD,找到


解密,agsCAhBf对应/eapi/,ag8TG1Y=对应/api/,对比我们抓到的包url为/eapi/batch,怀疑是NeteaseMusicUtils.serialdata这个方法进行的加密,跟进去查看,发现调用了一个叫poison.so的native函数


3. Ida动静态分析so中加密函数


ida打开poison.so发现函数识别不正常,需要修复

由于试过在程序启动后附加ida并不能正常调试,我们要在程序启动的时候进入,看看是否有反调试

惯例,先开启android server

adb push android_server /data/local/tmp #将android server push到手机上
adb shell su # 登录手机
cd /data/local/tmp 
mv android_server as # 未免有检测android_server这个文件名的反调试,因此先改名
chmod 777 as # 赋予android server权限
./as -p221 # 未免有检测23946默认端口的反调试,因此改端口
adb forward tcp:221 tcp:221  # 转发端口到本地
am  start -D -n  com.netease.cloudmusic/.activity.LoadingActivity #将程序断在程序入口处,等待附加

部分手机(比如小米)可能会出现防火墙权限问题,如不行请执行setenforce 0这一句

打开IDA -> Debugger -> Attach -> Remote ARMLinux/Android debugger



把断点下在linker,等到poison.so加载到内存之后下断在poison.so的JNI_OnLoad(没啥理由,就是想让程序停下来,可以把poison.so从内存中dump下来)

开启DDMS,转发端口,然后jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700


发现在libneutil.so在加载之后调试器被断掉了,没有执行到poison.so里面,判断应该是先在libneutil.so有反调试(旧版的做了check_android_server、bsd_signal单步调试陷阱)

由于之前改了android_server,所以实际上只有一个单步调试陷阱

int handler()  {      return bsd_signal(5, 0);  }  int set_SIGTRAP()  {      int result;      bsd_signal(5, (int)handler);      result = raise(5);      return result;  
}  

这时候只要运行到BLX raise的时候把R0置0即可过掉反调试进入到poison.so里面


待续....


转载请注明出处*IC*,不然嘿嘿嘿....