各位帮帮忙!!谢谢!!
#include <windows.h>
#include <stdio.h>
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA,*PPEB_LDR_DATA;
typedef struct _LDR_MODULE
{
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
void* BaseAddress;
void* EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
HANDLE SectionHandle;
ULONG CheckSum;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
int main(int argc, char* argv[])
{
PEB_LDR_DATA *pPEBLDR;
LDR_MODULE *pLdrMod;
LIST_ENTRY *pListEntry,*pStart;
DWORD dwKernelBase;
PWSTR fakemodulename=L"假名字啊";
PWSTR fakemodulepath=L"这是假路径,看能骗到谁";
///////////////////////////////////////////////////
_asm
{
mov eax,fs:[0x30] //TEB->PEB
mov eax,[eax+0xC] //PEB->Ldr 问题1: 请具体讲一讲他的实现与作用!!!!!
mov pPEBLDR,eax
}
////////////////////////////////////////////////////
printf("准备改名字了...\n");
dwKernelBase=(DWORD)GetModuleHandle("kernel32.dll");
printf("Base of kernel32.dll is 0x%08x\n",dwKernelBase);
pStart=pListEntry=(LIST_ENTRY*)(PUCHAR)&(pPEBLDR->InLoadOrderModuleList);问题2:为什么要做与运算呢???作用是什么???
do
{
pListEntry=pListEntry->Flink;
pLdrMod=(LDR_MODULE*)(pListEntry);
问题3.pListEntry是LIST_ENTRY *结构,怎么看出他又是LDR_MODULE*结构????
通过WinDbg我们可以看看nt!_PEB的结构
0: kd> dt nt!_PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged : UChar
+0x003 SpareBool : UChar
+0x004 Mutant : Ptr32 Void
+0x008 ImageBaseAddress : Ptr32 Void
+0x00c Ldr : Ptr32 _PEB_LDR_DATA
+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
……
+0C处是一个_PEB_LDR_DATA结构指针,里面包含了和LDR相关的一些数据,进程的模块链表就保存在Ldr中。下面是_PEB_LDR_DATA的结构:
0: kd> dt nt!_PEB_LDR_DATA
+0x000 Length : Uint4B
+0x004 Initialized : UChar
+0x008 SsHandle : Ptr32 Void
+0x00c InLoadOrderModuleList : _LIST_ENTRY
+0x014 InMemoryOrderModuleList : _LIST_ENTRY
+0x01c InInitializationOrderModuleList : _LIST_ENTRY
+0x024 EntryInProgress : Ptr32 Void
if ((DWORD)pLdrMod->BaseAddress==dwKernelBase)
{
printf("Found kernel32.dll...");
lstrcpyW(pLdrMod->BaseDllName.Buffer,fakemodulename);
lstrcpyW(pLdrMod->FullDllName.Buffer,fakemodulepath);
printf("Change OK.\n");
break;
}
} while(pListEntry!=pStart);
printf("现在你可以用工具来看看本进程的模块列表\n");
while (1)
{
Sleep(1000);
}
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!