記錄一次通過反編譯處理線上問題

問題: 研發公司單獨做了控制關停接口,因爲他們域名未備案緣故導致接口無法正常調用,遊戲不能正常登陸。
但是對方因爲合作終止暫時不能積極的處理。
只能自己嘗試編譯處理

解決辦法:找對對應的接口文件,嘗試重新編譯解決

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章