问题: 研发公司单独作了控制关停接口,由于他们域名未备案缘故致使接口没法正常调用,游戏不能正常登录。
可是对方由于合做终止暂时不能积极的处理。
只能本身尝试编译处理php
解决办法:找对对应的接口文件,尝试从新编译解决html
一、一开始不知道游戏里为何卡在登录上,尝试抓包看信息
手机登录经过fiddler抓包工具在,能够看到一个登录连接报错500
------->问题引发的缘由是用户验证登录返回500,因为调用SDK不能请求到接口返回,这个SDK被研发那边私自接了控制SDK的代码。
http://www.test.com:10011/test/user.jsp?parm=%7B%22ppid%22:%22B4B42E782BD7234F%22,%22serverid%22:11,%22ver%22:%221.0.093%22,%22type%22:%22withid%22,%22zip%22:1,%22md5%22:%223868%22%7Djava
二、服务器上用tcpdump查看访问地址:
查看GET方式访问地址:
tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'git
查看到一个日志:19:17:46.139319 IP 10-35-56-221.39446 > 121.40.68.207.http: Flags [P.], seq 2665129300:2665129528, ack 2447934587, win 221, options [nop,nop,TS val 2436854501 ecr 3091776060], length 228br/>E.....@.@.a.
#8.y(D....P...T...{...........
.?r..H.<GET /test/switch.php HTTP/1.1
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.8.0_171
Host: www.a.com
Accept: text/html, image/gif, image/jpeg, ; q=.2, /*; q=.2
Connection: keep-alivegithub
观察到日志是一个去访问了 http://www.a.com/a/switch.phpweb
三、去服务器上查看上连接关键字哪里使用到
[root@10-35-72-167 s1_bak20190921]# grep -rn 'www.a.com' *
Binary file webapps/ssnc/WEB-INF/classes/com/phonepadgames/starwork/mvc/servlet/SwitchService.class matches服务器
四、把SwitchService.class 拉来本地进行反编译
用JD-GUI 反编译工具: 下载地址:https://github.com/java-decompiler/jd-gui/releases
安装会提示下载对应的JDKmvc
反编译保存获得一个SwitchService.java 文件, 修改这个文件里的访问地址app
#########################
import com.phonepadgames.starwork.common.util.WebUtil;
import com.phonepadgames.starwork.mvc.servlet.SwitchService;webapp
public class SwitchService
{
public static String switchStrng = "1";
public static String URL = "http://www.acom/a/switch.php";
public static void reload() {
try {
String str = WebUtil.postData(URL, 5000);
switchStrng = str;
}
catch (Exception exception) {
switchStrng = "1"; }
}
public static boolean open() { return "0".equals(switchStrng); }
}
################
修改http://www.a.com/aswitch.php 为你本身部署的这个地址
另外要看下http://www.a.com/a/switch.php 这个文件是什么样子的, 能不能拿到源文件,侥幸的是这个文件只是获取一个0和1来控制的值,比较好办了
修改为本身部署的文件(找过能够跑这个PHP的环境部署上)http://test.com/a/switch.php
switcc.php 里面的内容1为关闭接口, 0 为开启接口
咱们须要作打开, 里面switch.php 为0
五、从新编译SwitchService(这个过程比较复杂,我是在Linux上部署了对应带JDK1.8.0.221的环境,通常线上跑的上面jdk就什么JDK,大版本相似就行) 会碰到各种包的依赖, 如上面使用到了WebUtil; WebUtil.class 文件里还会用到其余引用类
参考以下编译方式(引用到了log4j-1.2.16.jar和WebUtil.class(用一个com.zip把WebUtil.class 整个带路径的文件给打包zip让其引用调用了) )
root@VM-0-14-debian:/usr/local/jdk1.8.0_221/test# javac -classpath /usr/local/jdk1.8.0_221/lib/log4j-1.2.16.jar:/usr/local/jdk1.8.0_221/test/com.zip com/phonepadgames/starwork/mvc/servlet/SwitchService.java
不报错就会在com/phonepadgames/starwork/mvc/servlet/ 下尝试一个队员的CLass文件
有报错就看报错,一个个的对应处理了
六、以上编译没有问题,拉下那个SwitchService.class对应的看是否修改掉了里面的接口地址
若改掉了,那就大功告成, 能够尝试把这个文件替换到线上验证下是否成功(切记以前的那个SwitchService.class文件必定要作个备份)
更新到线上,游戏正常登录了, 也认了我修改的地址去作判断了
#tcpdump小知识:
查看HTTP GET请求
sudo tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
查看HTTP POST请求
sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
查看HTTP请求响应头以及数据
sudo tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'