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

问题: 研发公司单独作了控制关停接口,由于他们域名未备案缘故致使接口没法正常调用,游戏不能正常登录。
可是对方由于合做终止暂时不能积极的处理。
只能本身尝试编译处理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请求响应头以及数据

  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)'

相关文章
相关标签/搜索