这个app是啥就不说了【滑稽
之前0xffff上也讨论过对应PC版本的逆向过程,这次来说说android客户端。
首先是抓包。
我用的是BurpSuite.
这里要配置一下,把代理的监听地址改为手机可以访问的地址,然后WLAN那里设置一下。
然后因为走的是https,还需要安装一下证书。
按如图示导出一个,然后装上即可。
但这样还是抓不了,因为这个软件开启了ssl pinning,一番搜索之后发现了这个JustTrustMe,装上之后发现可以抓了hiahiahia.
(然而装一个xp框架弄了一天...高版本的系统刷进去变砖卡第一屏想降系统版本,找了半天才找到线刷包,然而又是万恶的某度网盘..下载龟速..
搞定了抓包问题,那么试着提交一次成绩,康康内容都有啥。
可以看到有两个参数,后面那个tasksJson里面就包含了有score之类的一堆,直接send to Repeater改一下
失败了..盲猜ut参数是校验用的
拖进jadx,无壳,然后搜一下字符串
逻辑很清晰,调用了StringUtils.getUt
跟进getUt看一下
最后会发现调用了native函数。
把so拖进ida看一下,emmm...有点复杂,分析了一下没弄下去。(后面再写一些分析过程,最后没有逆下去
那如果要修改数据还有没有别的方法呢?如果能够直接模拟调用getUt岂不妙哉?这时候就需要用到frida了。
关于frida框架,可以康这里。
搭建好frida运行环境,开始扶着文档写脚本
import frida
import sys
import urlparse
session = frida.get_usb_device().attach("com.xxx.xxxxxx")
hook = """
Java.perform(function () {
var ob = Java.use("com.xxx.common.StringUtils");
ob.getUt.implementation = function(v,a){
send("parameter="+v+"type="+a);
var result=ob.getUt.call(this,v,a);
send("res="+result);
return result;
};
});
"""
call = '''
console.log("Script loaded successfully ");
function callEnc(a) {
Java.perform(function () {
var ob = Java.use("com.xxxx.common.StringUtils");
ob.getUt.implementation = function(v,a){
send("parameter="+v+"type="+a);
var result=ob.getUt.call(this,v,a);
send("res="+result);
return result;
};
var instance=ob.$new();
console.log(a);
var result=instance.getUt.call(instance,a,11);
console.log(result);
});
}
rpc.exports = {
callgetut: callEnc
};'''
script = session.create_script(call)
def on_message(message, data):
print message
script.on("message", on_message)
script.load()
t="urlencoded parameter"
print(t)
t=urlparse.unquote(t)
print(t)
print(test)
script.exports.callgetut(t)
sys.stdin.read()
上面的代码都是照着文档写的,应该比较好理解,然而还有几个坑点需要注意一下:
- url编码问题(如果是直接把url解码后的参数用''' '''括起来声明一个字符串变量的话因为参数里面有\\"这样的内容,会被转义
- burpsuite发包的时候行末不要有空格(我是逐byte比较才发现这个问题
以上就可以通过服务器的校验,修改的数据能够在统计中查看。