我想实现对当前进程已加载的DLL进行隐藏的功能,网上已有32位系统的代码,我想在64位系统使用。于是我对https://www.cnblogs.com/onetrainee/p/11674211.html进行了略微的更改,而且将Intel汇编语法改为AT&T语法(这样DevC++才支持)。这是目前的代码:
/* 所需要的结构体
1. _LDR_DATA_TABLE_ENTRY 链表指向数据
2. _PEB_LDR_DATA 表示其 PEB0x处指向的数据表
3. _LIST_ENTRY 指针指向的链表
都已经在winternl.h中有定义,无需手动定义
*/
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;
using QWORD= unsigned long long;
using ADDRESS = QWORD; //因为是64位系统,所以只好用这个了
bool HideModule(char* szModule)
{
HMODULE hMod = GetModuleHandleA(szModule);
PLIST_ENTRY Head, Cur;
PPEB_LDR_DATA ldr;
PLDR_MODULE ldm;
SetColor(7,0);
ADDRESS* PEB;
cout<<"\n获取PEB...";
asm volatile(
"movq %%gs:0x60, %0\n\t" //64位系统上0x30偏移变成了0x60
: "=r" (PEB)
:
:
); //ChatGPT 3.5帮忙修改
SetColor(14,0);
cout<<"\nPEB:"<<*PEB; //成功获取!
ldr = ((PPEB_LDR_DATA)((BYTE*)PEB+0x0C));
SetColor(6,0);
cout<<"\nLDR="<<ADDRESS(ldr); //成功获取!
Head = &(ldr->InMemoryOrderModuleList);
Cur = Head->Flink;
SetColor(8,0);
cout<<"\nDo...";
do
{
ldm = CONTAINING_RECORD(Cur, LDR_MODULE, InLoadOrderModuleList);
SetColor(11,0);
cout<<"\n0 ldm="<<ADDRESS(ldm); //输出不是空指针。
if (hMod == ldm->BaseAddress) //<!> 这里崩溃了!!
{
SetColor(14,0);
cout<<"\n1"; //还没输出这句话就崩了
// 三个链表同时给断掉
ldm->InLoadOrderModuleList.Blink->Flink =
ldm->InLoadOrderModuleList.Flink;
ldm->InLoadOrderModuleList.Flink->Blink =
ldm->InLoadOrderModuleList.Blink;
SetColor(14,0);
cout<<"\n2";
//
ldm->InInitializationOrderModuleList.Blink->Flink =
ldm->InInitializationOrderModuleList.Flink;
ldm->InInitializationOrderModuleList.Flink->Blink =
ldm->InInitializationOrderModuleList.Blink;
SetColor(14,0);
cout<<"\n3";
//
ldm->InMemoryOrderModuleList.Blink->Flink =
ldm->InMemoryOrderModuleList.Flink;
ldm->InMemoryOrderModuleList.Flink->Blink =
ldm->InMemoryOrderModuleList.Blink;
break;
}
Cur = Cur->Flink;
} while (Head != Cur);
return true;
}
我比较菜,没学过汇编,连汇编语法转换都是问ChatGPT的(
ChatGPT3.5拒绝提供完整代码,说断链不道德(doge)祖母入睡法试过了没用
程序在输出0 ldm之后,输出1之前崩溃(代码中已标出)。
带佬们帮帮忙,在下感激不尽!!