問題: 研發公司單獨做了控制關停接口,因爲他們域名未備案緣故導致接口無法正常調用,遊戲不能正常登陸。
但是對方因爲合作終止暫時不能積極的處理。
只能自己嘗試編譯處理
解決辦法:找對對應的接口文件,嘗試重新編譯解決
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請求響應頭以及數據
- 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)'