我们注意到通过页面请求的相关数据包都是加密的结果,为了方便对数据的处理,我们研究其中的编码,编写解码小工具
请求内容解码
通过查看 smartbi/freequery/filter/CheckIsLoggedFilter.class
定位到解码操作

public static void main(String[] args) throws Exception {
String encode = "zDp4Wp4gRip+-pkWQ~xQ6ikRw6D+/JV/uutjaO*a3a!/uu/JT";
String[] decode = RMICoder.decode(encode);
System.out.println(decode[0]);
System.out.println(decode[1]);
System.out.println(decode[2]);
}

请求内容编码
利用 smartbi.framework.rmi.RMICoder#encode
并没有办法利用成功
我们现在已经知道解码的函数 smartbi.framework.rmi.RMICoder#decode
经过不断测试发现编码值是一一对应的
所以我们将字符串
0123456789ABCDEF!'()*-.GHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
一一进行解码,找到其中对应的值
q1yNrpn0L7(Xxs)MW8aYTgjkGh54P63A!uilDZBSzQVfEwIm~-vdcRtK9'Oe.H*C2JoF_Ub

再根据这个对应关系,去进行查找替换
public class encode {
public static void main(String[] args) {
String encode = "0123456789ABCDEF!'()*-.GHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
String code = "q1yNrpn0L7(Xxs)MW8aYTgjkGh54P63A!uilDZBSzQVfEwIm~-vdcRtK9'Oe.H*C2JoF_Ub";
String encodestring = "user+";
StringBuilder decodestring = new StringBuilder();
for (int j = 0; j < encodestring.length();j++){
char charC = encodestring.charAt(j);
if(code.indexOf(charC)!=-1){
for (int i = 0; i < encode.length(); i++) {
char charA = encode.charAt(i);
char charB = code.charAt(i);
if(charC == charB){
decodestring.append(charA);
}
}
}else{
decodestring.append(charC);
}
}
System.out.print(decodestring);
}
}
响应包内容解码
import smartbi.framework.rmi.RMICoder;
public class decoderesponse {
public static void main(String[] args) {
String Estring = ":\"H~CxOm~\"{q,\"m2HECcO'\"{1}";
String decode = RMICoder.decodeResponse(Estring);
System.out.print(decode);
}
}


加上参数 jsonpCallback 使得返回值为解码后的结果

smartbi.framework.rmi.RMIServlet#doPost

当 jsonpCallback 的值为空时,会对返回值进行编码操作
smartbi.framework.rmi.RMIServlet#doGet

工具编写
写一个简单的小工具进行编码转换,同时加深对 javafx 的利用编写




