iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Security

打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理系列 第 10

【Day 10】- 藏起來的 Process 真的看不見摸不著?(講解找出斷鏈後的 Process 方法)

Agenda

  • 資安宣言
  • 測試環境與工具
  • 學習目標
  • 前情提要
  • 技術原理與程式碼
  • References
  • 下期預告

資安宣言


撰寫本系列文章目的在於提升資訊安全之實務能力,
並透過實作體悟到資訊安全領域的重要性,
本系列所有文章之內容皆有一定技術水平,
不得從事非法行為、惡意攻擊等非法活動,
「一切不合法規之行為皆受法律所約束」,
為了避免造成公司、廠商或玩家之間困擾,
所有實作不會拿已上市產品、Online Game 等等來作範例學習,
且部分具有深度、價值之內容,將會提升一定閱讀門檻(不對該技術做分析、解說),
請勿透過本系列文章所學,從事任何非法活動,請不要以身試法!!!


測試環境與工具

學習目標

  • 1.找出斷鏈後隱藏的 Process
  • 2.了解 PsLookupProcessByProcessId 與 NtOpenProcess 部分運作原理

前情提要

昨天講了第一種隱藏 Process 的方法,
也就是【Day 09】- 今天來創造 Ghost Process(基於斷鏈隱藏 Process 的手法)

這個方法是修改 EProcess 中的 ActiveProcessLinks 來達成隱藏效果,

那麼今日就來講講如何找出透過上述方法隱藏的 Process!

技術原理與程式碼

首先開始前要先說一下,
小弟我目前還屬於菜鳥階段,正不斷努力學習中,
若有發現錯誤或不妥之處還請不吝賜教。
歡迎大家多多留言,互相交流交流。

那就開始今天的主題吧~~
/images/emoticon/emoticon35.gif

大家都知道一個 Process 都有一組「身分證」,
身分證 = EProcess Address
只要拿到 EProcess Address 就能獲得 Process 資訊!

一般在寫 CODE 的時候都是 CALL API 列舉 Process,
拿到 PID 後再 CALL PsLookupProcessByProcessId
這樣就能順利拿到 EProcess Address。

所以不知道大家有沒有想到方法來找出隱藏的 Process?

1..

2... ... ..

3.... .... .... !

時間到 XD

公布解答:
簡單找出斷鏈隱藏後的 Process 方法如下:

  1. 暴力列舉 PID,然後 CALL PsLookupProcessByProcessId
  2. 暴力列舉 PID,然後 CALL OpenProcess

第一種 CALL PsLookupProcessByProcessId 的方法就能拿到 EProcess Address,
要什麼資訊都有~~~

第二種 CALL OpenProcess 能直接在 User mode 實現,
但如果 Process 有保護那就 ...會失敗!

我們來看一下效果:
隱藏前:

隱藏後:

隱藏後在 R0 下,暴力列舉 PID,然後 CALL PsLookupProcessByProcessId

隱藏後在 R3 下,暴力列舉 PID,然後 CALL OpenProcess

所以~
要如何加強隱藏技術呢?
/images/emoticon/emoticon39.gif

既然現在知道以上兩個 API 可以透過 PID 找到 Process 了,
那現在就來看看以上兩個 API 的實作方式
從中找到方法,再來好好處理這個方法 :D

以下講講懶人逆向法 XDDD(應該不算是逆向 哈哈)

在很久很久以前~不知是哪個年代~
有間電腦科技公司針對某個系統課程,
提供了學習 Windows Kernel 底層運作的機會,
那間電腦科技公司叫做:Microsoft

然後不知道為什麼,
網路上就開始流傳了一份文件,它叫做:WRK v1.2(Windows Research Kernel)

/images/emoticon/emoticon34.gif

這份 Source code 是可以修改、編譯一個屬於自己的 wrkx86.exe,
是真的可以拿來跑在 Windows Server 2003 、XP 上的 Source code ,
涵蓋內容包含以下:

  • cache - cache manager
  • config - registry implementation
  • dbgk - user-mode debugger support
  • ex - executive functions (kernel heap, synchronization, time)
  • fsrtl - file system run-time support
  • io - I/O manager
  • ke - scheduler, CPU management, low-level synchronization
  • lpc - local procedure call implementation
  • mm - virtual memory manager
  • ob - kernel object manager
  • ps - process/thread support
  • se - security functions
  • wmi - Windows Management Instrumentation
  • inc - NTOS-only include files
  • rtl - kernel run-time support
  • init - kernel startup

所以 Source code 在哪裡??
大家自己找吧 >.< 直接放這裡我會怕 XD

找到 PsLookupProcessByProcessId 與 NtOpenProcess 會發現:

  1. PsLookupProcessByProcessId 會從 PspCidTable 拿對應 PID 的 Object
  2. NtOpenProcess 會 CALL PsLookupProcessByProcessId

所以很明顯惹吧~
明天 Day 11 要來解決、學習的項目就是:PspCidTable

補充1:
如果是 zwquerysysteminformation 能不能找出斷鏈後藏起來的 Process 呢?
答案是:No!
為什麼呢?交給各位找答案了 我就不在這講了 哈哈

補充2:
這份 Source code 這麼久了還適用喔?
答:改了很多東西呢,不過有些東西架構基礎上還是有點像~

好了,這篇就講到這結束了,
大家若有發現哪裡寫得不好或錯誤的地方,都留個言討論一下吧 XD
那我們下期見 o( ̄▽ ̄)ブ

References

下期預告


上一篇
【Day 09】- 今天來創造 Ghost Process(基於斷鏈隱藏 Process 的手法)
下一篇
【Day 11】- 再次創造 Ghost Process,這次找不到了吧哈哈(基於修改 PspCidTable 隱藏的 Rookit)
系列文
打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理15

尚未有邦友留言

立即登入留言