R3获取kernel32地址
獲取Kernel32地址
? ? 如果是搞PE變形或者PE重構,再或者代碼注入,很多時候我們要動態獲取Loadlibrary()以及GetPeocAddress()兩個函數的地址,通過這兩個函數再動態獲取其他函數地址,這樣就可以免導入了。不然導入表里會暴露自己的調用。
? ? 對于靜態PE文件重組來說,可以通過查看原有的PE文件是不是調用了這兩個,或者加載了Kernell32.dll(通常都是已經加載了的),然后獲取原來的地址,再自己調用。
而對于代碼注入這種內存里跑的,通常是在注入程序里自己獲取了相關函數的地址(同一一個運行的系統中,多個進程獲取到的這兩個函數的地址是一樣的)so....
這次是直接通過其他方法獲取kernel32的地址,通常用在PE文件變形中。主要還是處理內嵌機器碼對導入表的依賴問題。
? ? Ok就在剛剛搜索相關資料的時候,我發現有人通過類似姿在R3層隱藏DLL的調用。一會總結完這個再學習下那個東西。
? ? 獲取Kernel32的地址網上也有很多姿勢,我總結一個我覺得靠譜的,之前一直在研究驅動相關,想在R0搞一些事情,很多時候都要通過統配標識符來定位相關地址,比如Hook?SSDT,64位里很多東西都要通過尋找特征碼來找,要么就通過回調,但是因為是要搞事情,很多時候回調搞不定。So...,但是面臨的問題就是尋找特征碼這個姿勢并不穩定,很容易就出問題。你分析了XP?win7?win10?那么寫了個代碼,測試OK敢上線嗎?一個問題是不同系統之間可能不一樣,同一個系統之間不同版本也可能不同,沒有公開的東西,微軟有權利隨便更改結構(雖然通常不會改,以為沒必要)。最后導致的不兼容等藍屏問題,這個鍋當然也是自己背,尤其是做產品,很多時候我們要記住,自己是產品,不是什么外掛和小眾軟件。很多時候,用戶并不懂,藍屏了的話就是你產品不行,不管你采取了多底層的保護方式,所以很多安全廠商也不想在自己的產品上做減法。這也是為什么如果你搞對抗,就會發現64位出來之后,很多殺軟都變得低調了很多,經過測試,在R0里的話,90%的殺軟你直接一個基本結束線程的函數就能KO掉服務進程了。好了就這樣,廢話說多了?;貋碚襨ernel32地址。
大體姿勢是這樣:
FS--->TEB--->PEB--->?PEB_LDR_DATA.InInitialzationOrderModuleList
1.FS寄存器指向的是TEB的地址。
2.TEB的偏移[0x30]處是PEB地址。
3.PEB里面偏移[0xc]處是PEB_LDR_DATA地址。
4.PEB_LDR_DATA結構體里面偏移[0xc]是InLoadOrderModuleList地址,得到這個鏈表地址之后往下走兩個位置就是kernel32.dll模塊了,到了這個模塊之后偏移[0x18]就是存的地址。
我寫了個C++函數。
?
HMODULE GetKernel32BaseAddress() { HMODULE hsKernel32BaseAddress = 0; __asm { mov ebx, fs:[0x30] //得到peb結構體的地址 mov ebx, [ebx + 0xc] //得到Ldr結構體的地址 mov ebx, [ebx + 0xc] //得到ldr.InLoadOrderModuleList.Flink 第一個模塊,當前進程 mov ebx, [ebx] //得到第二個模塊地址 ntdll.dll mov ebx, [ebx] //得到第三個模塊地址 kernel32.dll mov ebx, [ebx + 0x18] //得到第三個模塊地址(kernel32模塊的dllbase) mov hsKernel32BaseAddress, ebx } return hsKernel32BaseAddress; }?
?
?
測試代碼如下:
int?main()?{
HMODULE?hdKernel32BaseAddress1?=?GetKernel32BaseAddress();
HMODULE?hdKernel32BaseAddress2?=?LoadLibrary(L"Kernel32.dll");
hdKernel32BaseAddress1?==?hdKernel32BaseAddress2??
MessageBox(NULL,?L"yes",?L"hi",?MB_OK)?:
MessageBox(NULL?,L"no"?,L"hi"?,MB_OK);
return?0;
}
OK這樣就可以了,我是隨機測了幾個系統XP?Win7?Win10。
如果是要上線到產品模塊,記得要詳細測試。最后是提供三個結構體定義,方便看細節。PEB_LDR_DATA、TEB、PEB。
?
typedef struct _PEB_LDR_DATA {ULONG Length;UCHAR Initialized;PVOID SsHandle;LIST_ENTRY InLoadOrderModuleList;LIST_ENTRY InMemoryOrderModuleList;LIST_ENTRY InInitializationOrderModuleList;PVOID EntryInProgress; } PEB_LDR_DATA, *PPEB_LDR_DATA;// // Thread Environment Block (TEB) // typedef struct _TEB {NT_TIB Tib; /* 00h */PVOID EnvironmentPointer; /* 1Ch */CLIENT_ID Cid; /* 20h */PVOID ActiveRpcHandle; /* 28h */PVOID ThreadLocalStoragePointer; /* 2Ch */struct _PEB *ProcessEnvironmentBlock; /* 30h */ULONG LastErrorValue; /* 34h */ULONG CountOfOwnedCriticalSections; /* 38h */PVOID CsrClientThread; /* 3Ch */struct _W32THREAD* Win32ThreadInfo; /* 40h */ULONG User32Reserved[0x1A]; /* 44h */ULONG UserReserved[5]; /* ACh */PVOID WOW32Reserved; /* C0h */LCID CurrentLocale; /* C4h */ULONG FpSoftwareStatusRegister; /* C8h */PVOID SystemReserved1[0x36]; /* CCh */LONG ExceptionCode; /* 1A4h */struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */UCHAR SpareBytes1[0x28]; /* 1ACh */GDI_TEB_BATCH GdiTebBatch; /* 1D4h */CLIENT_ID RealClientId; /* 6B4h */PVOID GdiCachedProcessHandle; /* 6BCh */ULONG GdiClientPID; /* 6C0h */ULONG GdiClientTID; /* 6C4h */PVOID GdiThreadLocalInfo; /* 6C8h */ULONG Win32ClientInfo[62]; /* 6CCh */PVOID glDispatchTable[0xE9]; /* 7C4h */ULONG glReserved1[0x1D]; /* B68h */PVOID glReserved2; /* BDCh */PVOID glSectionInfo; /* BE0h */PVOID glSection; /* BE4h */PVOID glTable; /* BE8h */PVOID glCurrentRC; /* BECh */PVOID glContext; /* BF0h */NTSTATUS LastStatusValue; /* BF4h */UNICODE_STRING StaticUnicodeString; /* BF8h */WCHAR StaticUnicodeBuffer[0x105]; /* C00h */PVOID DeallocationStack; /* E0Ch */PVOID TlsSlots[0x40]; /* E10h */LIST_ENTRY TlsLinks; /* F10h */PVOID Vdm; /* F18h */PVOID ReservedForNtRpc; /* F1Ch */PVOID DbgSsReserved[0x2]; /* F20h */ULONG HardErrorDisabled; /* F28h */PVOID Instrumentation[14]; /* F2Ch */PVOID SubProcessTag; /* F64h */PVOID EtwTraceData; /* F68h */PVOID WinSockData; /* F6Ch */ULONG GdiBatchCount; /* F70h */BOOLEAN InDbgPrint; /* F74h */BOOLEAN FreeStackOnTermination; /* F75h */BOOLEAN HasFiberData; /* F76h */UCHAR IdealProcessor; /* F77h */ULONG GuaranteedStackBytes; /* F78h */PVOID ReservedForPerf; /* F7Ch */PVOID ReservedForOle; /* F80h */ULONG WaitingOnLoaderLock; /* F84h */ULONG SparePointer1; /* F88h */ULONG SoftPatchPtr1; /* F8Ch */ULONG SoftPatchPtr2; /* F90h */PVOID *TlsExpansionSlots; /* F94h */ULONG ImpersionationLocale; /* F98h */ULONG IsImpersonating; /* F9Ch */PVOID NlsCache; /* FA0h */PVOID pShimData; /* FA4h */ULONG HeapVirualAffinity; /* FA8h */PVOID CurrentTransactionHandle; /* FACh */PTEB_ACTIVE_FRAME ActiveFrame; /* FB0h */PVOID FlsData; /* FB4h */UCHAR SafeThunkCall; /* FB8h */UCHAR BooleanSpare[3]; /* FB9h */ } TEB, *PTEB;typedef struct _PEB {UCHAR InheritedAddressSpace; // 00hUCHAR ReadImageFileExecOptions; // 01hUCHAR BeingDebugged; // 02hUCHAR Spare; // 03hPVOID Mutant; // 04hPVOID ImageBaseAddress; // 08hPPEB_LDR_DATA Ldr; // 0ChPRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10hPVOID SubSystemData; // 14hPVOID ProcessHeap; // 18hPVOID FastPebLock; // 1ChPPEBLOCKROUTINE FastPebLockRoutine; // 20hPPEBLOCKROUTINE FastPebUnlockRoutine; // 24hULONG EnvironmentUpdateCount; // 28hPVOID* KernelCallbackTable; // 2ChPVOID EventLogSection; // 30hPVOID EventLog; // 34hPPEB_FREE_BLOCK FreeList; // 38hULONG TlsExpansionCounter; // 3ChPVOID TlsBitmap; // 40hULONG TlsBitmapBits[0x2]; // 44hPVOID ReadOnlySharedMemoryBase; // 4ChPVOID ReadOnlySharedMemoryHeap; // 50hPVOID* ReadOnlyStaticServerData; // 54hPVOID AnsiCodePageData; // 58hPVOID OemCodePageData; // 5ChPVOID UnicodeCaseTableData; // 60hULONG NumberOfProcessors; // 64hULONG NtGlobalFlag; // 68hUCHAR Spare2[0x4]; // 6ChLARGE_INTEGER CriticalSectionTimeout; // 70hULONG HeapSegmentReserve; // 78hULONG HeapSegmentCommit; // 7ChULONG HeapDeCommitTotalFreeThreshold; // 80hULONG HeapDeCommitFreeBlockThreshold; // 84hULONG NumberOfHeaps; // 88hULONG MaximumNumberOfHeaps; // 8ChPVOID** ProcessHeaps; // 90hPVOID GdiSharedHandleTable; // 94hPVOID ProcessStarterHelper; // 98hPVOID GdiDCAttributeList; // 9ChPVOID LoaderLock; // A0hULONG OSMajorVersion; // A4hULONG OSMinorVersion; // A8hULONG OSBuildNumber; // AChULONG OSPlatformId; // B0hULONG ImageSubSystem; // B4hULONG ImageSubSystemMajorVersion; // B8hULONG ImageSubSystemMinorVersion; // C0hULONG GdiHandleBuffer[0x22]; // C4hPVOID ProcessWindowStation; // ??? } PEB, *PPEB;?
宋孖健,13
?
總結
以上是生活随笔為你收集整理的R3获取kernel32地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE变形练手1-用PE自
- 下一篇: R3抹掉加载的DLL