最近發現這個模塊比較有趣,還是個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,