日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R3获取kernel32地址

發布時間:2025/6/17 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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掉服務進程了。好了就這樣,廢話說多了。回來找kernel32地址。

大體姿勢是這樣:

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地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。