iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Security

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

【Day 13】- 有了這個,就沒有打得開的程式了 XD(SetCreateProcessNotifyRoutine)

Agenda

  • 資安宣言
  • 測試環境與工具
  • 技術原理
  • References
  • 下期預告

資安宣言


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


測試環境與工具

技術原理

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

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

大家一定都知道防毒軟體會監控 Process 的新建,
假設發現惡意(黑名單)的 Process 就不能讓它跑起來,
想要實現這樣的技術有幾個方法:

  1. Hook 某些 Func(Kernl mode 不好處理)
  2. SetCreateProcessNotifyRoutine

我們今天就要來來談談:CreateProcessNotifyRoutine

在 Kernel 中有個東西叫做 PsSetCreateProcessNotifyRoutineEx
我們來看看它在 MSDN 中寫的資訊:

NTSTATUS PsSetCreateProcessNotifyRoutineEx(
  PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
  BOOLEAN                           Remove
);

當一個 Process 正要跑起來卻還沒跑起來與要結束的時候,
系統都會 CALL 指向 PCREATE_PROCESS_NOTIFY_ROUTINE_EX 的這個 NotifyRoutine Func,
第二個 Remove 參數是指定要設置還是要移除這個 NotifyRoutine Func。

我們來看看 PCREATE_PROCESS_NOTIFY_ROUTINE_EXMSDN 中的資訊:

PCREATE_PROCESS_NOTIFY_ROUTINE_EX PcreateProcessNotifyRoutineEx;

void PcreateProcessNotifyRoutineEx(
  PEPROCESS Process,
  HANDLE ProcessId,
  PPS_CREATE_NOTIFY_INFO CreateInfo
)
{...}

當一個 Process 正要跑起來卻還沒跑起來與要結束的時候,
這個 Func 會收到系統給的 EProcess、ProcessID 與 CreateInfo,
當 Process 正在退出,CreateInfo 為 NULL。

我們來看看 PPS_CREATE_NOTIFY_INFOMSDN 中的資訊:

typedef struct _PS_CREATE_NOTIFY_INFO {
  SIZE_T              Size;
  union {
    ULONG Flags;
    struct {
      ULONG FileOpenNameAvailable : 1;
      ULONG IsSubsystemProcess : 1;
      ULONG Reserved : 30;
    };
  };
  HANDLE              ParentProcessId;
  CLIENT_ID           CreatingThreadId;
  struct _FILE_OBJECT *FileObject;
  PCUNICODE_STRING    ImageFileName;
  PCUNICODE_STRING    CommandLine;
  NTSTATUS            CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

um... 有點多呢...

講這次實作的重點就好:CreationStatus
CreationStatus 這個是這次操作要返回的 NTSTATUS Values,
這個 NTSTATUS Values 可以決定這次操作的成功與否。

所以~\(0^◇^0)/
把它改成:STATUS_ACCESS_DENIED !!!
這樣 Process 就無法啟動拉~~~

來看個效果圖:

哈哈哈 成功!
/images/emoticon/emoticon01.gif

在 ARK 工具中可以看到:

但是這樣不就會被發現了嗎??
有沒有什麼辦法不要讓它彈出對話框?
把它改成:STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY
這樣就不會有對話框出現惹。

NTSTATUS Values 還可以填什麼?
這裡有一大堆:NTSTATUS Values

編譯提示:

  1. 要使用 PsSetCreateProcessNotifyRoutineEx 需要為 Driver 簽上數位簽章
  2. 要在命令列加上 /INTEGRITYCHECK
  3. 開測試模式、停用數位簽章檢查,就可以載入這個沒有簽章的 Driver
  4. ...
  5. ... ...

這個實作網路上滿多範例的~~可以搜尋看看或許可以找到能用的?XD

最後,
這次鐵人賽所寫的 Project 已在考慮是否要公開,
會在 Day 30 公布最後的決定... 敬請期待!!

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

References

下期預告


上一篇
【Day 12】- 找出看不見也摸不著的 Process,終極辦法!
下一篇
【Day 14】- 今天來實作一個鍵盤監聽器
系列文
打通任督二脈奇幻之旅 - 用 30 天探索 Windows 底層運作原理15

尚未有邦友留言

立即登入留言