问题: 研发公司单独做了控制关停接口,因为他们域名未备案缘故导致接口无法正常调用,游戏不能正常登陆。
但是对方因为合作终止暂时不能积极的处理。
只能自己尝试编译处理
解决办法:找对对应的接口文件,尝试重新编译解决
1、一开始不知道游戏里为什么卡在登陆上,尝试抓包看信息
手机登陆通过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%7D
2、服务器上用tcpdump查看访问地址:
查看GET方式访问地址:
tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
查看到一个日志: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.....@[email protected].
#8.y(D....P...T...{...........
.?r..H.
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-alive
观察到日志是一个去访问了 http://www.a.com/a/switch.php
3、去服务器上查看上链接关键字哪里使用到
[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
4、把SwitchService.class 拉来本地进行反编译
用JD-GUI 反编译工具: 下载地址:https://github.com/java-decompiler/jd-gui/releases
安装会提示下载对应的JDK
反编译保存得到一个SwitchService.java 文件, 修改这个文件里的访问地址
#########################
import com.phonepadgames.starwork.common.util.WebUtil;
import com.phonepadgames.starwork.mvc.servlet.SwitchService;
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
5、重新编译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文件
有报错就看报错,一个个的对应处理了
6、以上编译没有问题,拉下那个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 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
-
sudo tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'