Turla中的rootkit_fdisk.sys分析(未完)

最近發現這個模塊比較有趣,還是個x64上的,正好可以練習一下x64的彙編,寫下來有個更好的理解。由於個人能力有限,這個過程可能會持續幾個月,或者更長,不知道能不能弄完。下面通過一些彙編片段來學習它的編程思路及技巧。

僅供參考,如有錯誤歡迎指出。

1,獲取系統信息,函數原型:

ULONG64 GetSystemInformation(ULONG InformationClass,PVOID64 Data);

InformationClass是系統信息的類型,Data指向存儲成功獲得的信息的地址。

解釋:默認Buffer大小爲0x4000,然後調用ZwQuerySystemInformation根據返回的數指決定接下的處理;成功返回系統信息內容。 

2, 附加進程

typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {
    USHORT UniqueProcessId;//進程號
    USHORT CreatorBackTraceIndex;
    UCHAR ObjectTypeIndex;
    UCHAR HandleAttributes;
    USHORT HandleValue;
    PVOID Object;
    ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;

typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG NumberOfHandles;
    SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

NTSTATUS
  ZwQueryObject(
    __in_opt HANDLE  Handle,
    __in OBJECT_INFORMATION_CLASS  ObjectInformationClass,
    __out_bcount_opt(ObjectInformationLength) PVOID  ObjectInformation,
    __in ULONG  ObjectInformationLength,
    __out_opt PULONG  ReturnLength
    ); 

typedef enum _OBJECT_INFORMATION_CLASS {
    ObjectBasicInformation,
    ObjectNameInformation,//1
    ObjectTypeInformation,
    ObjectTypesInformation,
    ObjectHandleFlagInformation,
    ObjectSessionInformation,
    ObjectSessionObjectInformation,
    MaxObjectInfoClass
} OBJECT_INFORMATION_CLASS;

typedef struct _OBJECT_NAME_INFORMATION {
    UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION

函數原型:NTSTATUS AttachProcess(PKPROCESS Process,PRKAPC_STATE ApcState);

 

 

解釋:首先判斷ProcessId是否合法,如果合法,(最開始的部分這裏)AllocatePool1()--->ApcState,PsLookupProcessByProcessId---->Process,

KeStackAttachProcess(Process,ApcState);如果不合法,GetSystemInformation--->HandleInformation,解析獲得句柄信息,

KeStackAttachProcess,ZwQueryObject---->NameInformation,KeUnstackDetachProcess,比較對象名是否爲"\Windows\ApiPort",

如果相同,保存當前句柄信息中進程號,接着執行最開始的部分;否則繼續解析句柄信息。

 3,

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