問題: 研發公司單獨作了控制關停接口,由於他們域名未備案緣故致使接口沒法正常調用,遊戲不能正常登錄。
可是對方由於合做終止暫時不能積極的處理。
只能本身嘗試編譯處理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)'