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*,不然嘿嘿嘿....