1. 程式人生 > >netStat逆向分析

netStat逆向分析

感覺 能力 就是 本地 沒有 都在 cat 解析 with

  netStat和Fport的功能差不多,據說xp上比fport少某些功能,但是我的xp可能比較特殊,fport的功能netStat上的都有,一頭霧水地抓起WIn7的netStat就開始分析。

  技術分享圖片

  目標是五個功能

  • 本地地址 [ip + 端口]
  • 外部地址 [ip + 端口]
  • 狀態
  • PID
  • 所有權信息

  還是先通過IDA和OD,找到程序關鍵的函數 DoConnection():

  技術分享圖片

  主要的邏輯就在這兒,先通過InternalGetTcpTableWithOwnerModule()獲取Tcp表,這點和Fport的AllocateAndGetTcpExTableFromStack分廠相似,這兩個函數都屬於 iphlpapi.dll,只不過後者最高支持xp系統,而前者在xp後才支持。

  通過OD調試查看輸出信息可以確定所有有用的信息應該都在這個表裏面,在MSDN上沒有查到(能力問題)合適的數據結構,還可以發現輸出是在DisplayTcpConnEntry裏完成的,每一個while循環輸出一個表項,所以確定了while循環的退出條件也就是返回的表的第一個四字節顯示了表中表項的個數。最開始以為DisplayTcpConnEntry的參數就是具體的ip、port之類的,後來發現其實是傳入了表項的首地址,通過IDA反的C代碼可以確定第一個表項是從返回的表偏移兩個四字節處開始,並且表項長度為0XA0個字節,由此可以確定數據結構的結構。進入displayTcpConnEntry查看。

  技術分享圖片

  通過與輸出信息的比對可以發現v6為本地地址port,v7為本地地址ip,所以表項偏移一個四字節為本地ip,偏移兩個四字節為port的大端存儲【第一項√】(事後發現高興的太早了)。

  技術分享圖片

  然後是一長串的switch,通過比對函數的返回值發現執行了這個函數之後出現了狀態字串(如LISTENLING),然後發現給FormatMessage()傳入適當參數可以返回這個狀態字串(這兒偷了個懶沒有調用這個接口,通過更改即時的數據獲得了TCP表項中的數字與狀態的關系)【第三項√】,之後的函數調用發現他喵的有點眼熟啊

  技術分享圖片

  這他喵的就是傳本地ip和port的那個函數啊,大膽猜測是外部地址好吧【第二項√】(還是太天真)。

  之後調用了一個output的函數輸出了上述的三種信息,繼續跟蹤發現在DisplayOwnerInfo裏面輸出了pid和所有權信息,進入

  技術分享圖片

  在裏面看到一個老朋友,dwProcessId就是pid,而這個參數是函數的形參,再回去看函數調用

  技術分享圖片

  哦你他嗎就是偏移五個四字節嘛【第四項√】,回到displayOwnerInfo()

  技術分享圖片

  K32GetModuleBaseNameA()就返回了所有者的那個*.exe的信息【第五項√】,這兒有個判斷,如果是svchost.exe或者rundll32.exe就會輸出相應的模塊信息,用後面的那啥不說的打開一個advapi32.dll然後使用I_QueryTagInformation,這兒偷懶了沒做這個功能

  至此Tcp表所有信息解析完畢,與此類似的還有Tcp6表、Udp表、Udp6表。感覺馬上就可以寫程序好吧,但是

  技術分享圖片

  技術分享圖片

  技術分享圖片

netStat逆向分析