首页
论坛
课程
招聘
[原创]Csgo(反恐精英:全球攻势)的游戏之旅----Dll注入和隐藏(Hacker) 下
2020-5-12 20:02 8161

[原创]Csgo(反恐精英:全球攻势)的游戏之旅----Dll注入和隐藏(Hacker) 下

2020-5-12 20:02
8161

接上一篇文章的注入,这篇文章写一下如何去隐藏DLL,实现注入的完美谢幕,这也是为了躲避一些外挂的检测机制来写的文章,如果不会注入的话,可以去看我的上一篇文章。


(二)注入HideModule.DLL到csgo游戏,通过断开PEB的三根链表,实现外挂DLL的隐藏

 因为我们要查找的是csgo进程中的三根链表中OneTap.su.dll的信息,想要断开我们还有去csgo进程中去,所以在这里我也使用了注入DLL的方法去实现,在dll中断开三根链表,也就是将立案链表中的下一个节点地址连到上一个节点指针域中去。大概就是这个意思。

第一步:注入DLL

HMODULE ModuleHandle = GetModuleHandle(_T("kernel32.dll"));

	LoadLibraryWAddress = GetProcAddress(ModuleHandle, "LoadLibraryW");
	IsOk = StartUpInject(MyDllPath, LoadLibraryWAddress);


    此处省略很多代码。....//再目标进程中启动一个线程
	HANDLE ThreadHandle = CreateRemoteThread
	(
		csgoHandle,  //线程所属进程的进程句柄
		NULL,           // 结构指定新线程的安全描述符,并确定子进程是否可以继承返回的句柄 NULL,则线程获取默认安全描述符,并且不能继承句柄
		0,              //线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小.
		(LPTHREAD_START_ROUTINE)FunctionAddress, //在远程进程的地址空间中, 该线程的线程函数的起始地址.
		VirtualAddress, // 
		0,              //控制线程创建的标志
		NULL);          //线程的创建标志  NULL则不返回线程标识符.

	if (ThreadHandle == NULL)
	{
		
		VirtualFreeEx(csgoHandle, VirtualAddress, BufferLength, MEM_RELEASE);		goto Exit;
	}	//等待远程线程结束
	WaitForSingleObject(ThreadHandle, INFINITE);
	IsOk = TRUE;



第二步: DLL实现,断开三根链表

找到PEB ,通过汇编代码实现找到PEB

//定位PEB
	__asm
	{		//fs位置保存着teb
		//fs:[0x30]位置保存着peb
		mov eax, fs:[0x30]
		mov PEB, eax
	}


完整DLL代码

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     ){    switch (ul_reason_for_call)
    {    case DLL_PROCESS_ATTACH:
	{	

		char* FileName = (char*)"OneTap.su.dll";
		HideModule(FileName);	break;
	}    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:        break;
    }    return TRUE;
}



void HideModule(char *szModule){
	DWORD *PEB = NULL;
	DWORD *Ldr = NULL;
	DWORD *Flink = NULL;
	DWORD *p = NULL;
	DWORD *BaseAddress = NULL;
	DWORD *FullDllName = NULL;	//定位PEB
	__asm
	{		//fs位置保存着teb
		//fs:[0x30]位置保存着peb
		mov eax, fs:[0x30]
		mov PEB, eax
	}

	HMODULE hMod = GetModuleHandleA(szModule);	//得到LDR
	Ldr = *((DWORD **)((unsigned char *)PEB + 0x0c));	//第二条链表
	Flink = *((DWORD **)((unsigned char *)Ldr + 0x0c));
	p = Flink;	do
	{
		BaseAddress = *((DWORD **)((unsigned char *)p + 0x18));
		FullDllName = *((DWORD **)((unsigned char *)p + 0x28));		if ((DWORD*)hMod == BaseAddress)
		{
			**((DWORD **)(p + 1)) = (DWORD)*((DWORD **)p);
			*(*((DWORD **)p) + 1) = (DWORD)*((DWORD **)(p + 1));			break;
		}

		p = *((DWORD **)p);
	} while (Flink != p);

	Flink = *((DWORD **)((unsigned char *)Ldr + 0x14));
	p = Flink;	do
	{
		BaseAddress = *((DWORD **)((unsigned char *)p + 0x10));
		FullDllName = *((DWORD **)((unsigned char *)p + 0x20));		if (BaseAddress == (DWORD *)hMod)
		{
			**((DWORD **)(p + 1)) = (DWORD)*((DWORD **)p);
			*(*((DWORD **)p) + 1) = (DWORD)*((DWORD **)(p + 1));			break;
		}
		p = *((DWORD **)p);
	} while (Flink != p);

	Flink = *((DWORD **)((unsigned char *)Ldr + 0x1c));
	p = Flink;	do
	{
		BaseAddress = *((DWORD **)((unsigned char *)p + 0x8));
		FullDllName = *((DWORD **)((unsigned char *)p + 0x18));		if (BaseAddress == (DWORD *)hMod)
		{
			**((DWORD **)(p + 1)) = (DWORD)*((DWORD **)p);
			*(*((DWORD **)p) + 1) = (DWORD)*((DWORD **)(p + 1));			break;
		}
		p = *((DWORD **)p);
	} while (Flink != p);
}


(三)远程卸载HideModule.DLL,实现无痕迹。

第一步:找到目标进程中的HideModule.dll加载地址,作为FreeLibrary的参数,传入CreateRemoteThread。

这里我用的是ToolHelp32的方法来,枚举目标进程模块的基址的。

SanpshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);	if (SanpshotHandle == INVALID_HANDLE_VALUE)
	{		goto Exit;
	}

	ME32.dwSize = sizeof(MODULEENTRY32);
	IsOk = Module32First(SanpshotHandle, &ME32);	while (IsOk)
	{		if (_tcscmp(ME32.szModule, DllName) == 0)
		{
			Flag = TRUE;			break;
		}
		IsOk = Module32Next(SanpshotHandle, &ME32);
	}	if (Flag == FALSE)
	{		
		goto Exit;
	}



第二步:HideModule.dll加载地址,作为FreeLibrary的参数,传入CreateRemoteThread。

LPTHREAD_START_ROUTINE FreeLibrary_ = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "FreeLibrary");

	ThreadHandle = CreateRemoteThread(ProcessHandle,		NULL, 0, FreeLibrary_,     //当前模块中导入函数
		ME32.modBaseAddr, 0, NULL);	if (ThreadHandle == NULL)
	{		
		goto Exit;
	}	else
	{		
		return TRUE;
	}
	WaitForSingleObject(ThreadHandle, INFINITE);


测试结果:


隐藏之前:

隐藏之后:


隐藏之后,可以看到在我们的csgo游戏中,还是存在外挂DLL的界面的,但是在火绒

[公告]名企招聘!

最后于 2020-5-18 18:13 被Bw编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (14)
雪    币: 3718
活跃值: 活跃值 (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Qz王大碗 活跃值 2020-5-12 22:27
2
0
雪    币: 256
活跃值: 活跃值 (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwCopyAll 活跃值 2020-5-12 22:33
3
0
感谢分享 
雪    币: 2030
活跃值: 活跃值 (204)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
不吃麻婆豆腐 活跃值 2020-5-13 06:46
4
0
雪    币: 1754
活跃值: 活跃值 (314)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whitehack 活跃值 2020-5-13 13:16
5
0
感谢分享
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_Mr Bai 活跃值 2020-5-13 16:01
6
0
niubility
雪    币: 5318
活跃值: 活跃值 (481)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
gamehack 活跃值 2020-5-14 14:14
7
0
感谢分享
雪    币: 1853
活跃值: 活跃值 (3832)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2020-5-15 10:15
8
0
文章中的图片丢失了几张,麻烦楼主补一下。
雪    币: 780
活跃值: 活跃值 (322)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Bw 活跃值 2020-5-18 18:16
9
0
图片就最后四张, 丢失的可能是因为编辑的原因。,
雪    币: 1937
活跃值: 活跃值 (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
青眼白龙 活跃值 2020-5-18 20:32
10
0
感谢分享
雪    币: 1496
活跃值: 活跃值 (411)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 活跃值 2020-5-21 17:36
11
0
感谢
雪    币: 40
活跃值: 活跃值 (130)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
网络游侠 活跃值 2020-6-9 21:01
12
0
pchunter直接扫出
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_jmovrudh 活跃值 2021-1-14 11:23
13
0
大佬能不能留个联系方式
雪    币: 142
活跃值: 活跃值 (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
落花满怀 活跃值 2021-1-16 11:45
14
0
骗自己好玩不....
雪    币: 205
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sumuer 活跃值 2021-1-24 11:40
15
0
厉害啊大佬!
游客
登录 | 注册 方可回帖
返回