反調試方案:
我們最通常使用的動態工具是IDA, IDA的動態調試端口默認為23946,我們可以通過/pro/net/tcp 查看android 系統所有TCP Socket

啟動android_server之后,/proc/net/tcp ,端口號是0x5D8A,十進制為23946
我們可以利用默認的調試端口23946 來實現反調試。
實現代碼如下, 實現原理: Android操作系統不允許一個IP可能同時存在多個相同的端口的套接字


解決方案:
最常見的解決的解決方案, 我們不使用默認轉發端口23946。 android_server 提供命令指定轉發端口
命令: ./android_server -p12345 ,注意端口號和參數之間沒有空格

端口號變為0x3039,即12345

雖然這種做法很簡單,但是對於一個崇尚簡約的程序員而言,每次都要都要指定端口,煩不煩。我們能不能和之前的通過逆向android_server, 通過修改android_server的默認端口來永久改變端口號。
不同IDA版本的android_server 使用指令集不太一樣,比如IDA6.6 使用是ARM指令集, IDA6.8 使用的是Thumb指令集。不過修改方案是一致的, 筆者以使用
Thumb指令集的IDA6.8的android_server.
1. IDA打開android_server, 找到main函數,如下:

對應的二進制指令代碼
2.這里需要知道一點關於ARM指令的知識,這里的LDR R5, =5D8A, 一條偽指令, =5D8A指的指令和變量(存儲值為5D8A)的相對偏移地址,這句為什么同一條ARM匯編對應16進制不一樣了,因為指令地址不一樣,導致偏移地址不一樣。 按照慣例,這個存儲5D8A的地址就在所在函數結束的后面.如下:
右側有個DATA_XREF可知,這里有兩處被應用,即兩個偽指令LDR, R5, =0x5D8A的地址, 雙擊可以驗證。
3.接下來我們用二進制編輯工具010 Editor 編輯文件偏移B8D8

將這個值改成我們指定端口號:12345(0x3039),保存,測試

3. 測試OK
