记录一次通过反编译处理线上问题

问题: 研发公司单独做了控制关停接口,因为他们域名未备案缘故导致接口无法正常调用,游戏不能正常登陆。
但是对方因为合作终止暂时不能积极的处理。
只能自己尝试编译处理

解决办法:找对对应的接口文件,尝试重新编译解决

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.<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-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请求响应头以及数据

  1. sudo tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
  2. sudo tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

猜你喜欢

转载自blog.51cto.com/holy2010/2439880
今日推荐