首页
社区
课程
招聘
[原创]DLL注入
发表于: 2020-6-12 15:07 9602

[原创]DLL注入

2020-6-12 15:07
9602

/****************************************************************

前提:准备注入的dll存放在临时目录里面,命名为inject.dll

步骤一 去临时目录查看要注入的dll

步骤二 查找要注入的进程

步骤三 注入dll

***************************************************************/



#define _CRT_SECURE_NO_DEPRECATE

#include<windows.h>

#include <Tlhelp32.h>

#include <comdef.h>

#include <io.h>

#define DllPathSize 1024



int GetDllPath(char* DllPath);

int FindTargetPid(const char* FileName);                   

int InjectDll(int targetid,const char * DllPath);

int targetid = 0;


int main()

{

char DllPath[DllPathSize] = { 0 };

if (GetDllPath(DllPath))                                           // 准备注入的dll名称为inject.dll,存放在临时目录里面

{

if (FindTargetPid("XXXX.exe"))                       // 查找准备注入的进程

{

InjectDll(targetid, DllPath);                    // 注入dll

}

}

return 1;

}



int GetDllPath(char * DllPath)

{

GetTempPathA(DllPathSize -1 , DllPath);

strcat(DllPath, "inject.dll");

if (_access(DllPath, 0) == 0)

{

printf("DllPath: %s\n", DllPath);

return 1;

}

else 

{

printf("File do not exist\n");

return 0;

}

}



int FindTargetPid(const char * FileName)

{

PROCESSENTRY32 pi;

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapshot == INVALID_HANDLE_VALUE)

{

printf("can not reateToolhelp32Snapshot \n");

targetid = 0;

return 0;

}



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (11)
雪    币: 3310
活跃值: (3908)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
创建远程线程这种注入方式太简单粗暴了,隐蔽性差
2020-6-12 17:38
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
巧了我昨天远程线程注入也是使用的创建进程快照然后遍历的
2020-6-19 02:14
0
雪    币: 1979
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请问大牛,是否可以给个实际软体和dll,然後实际将dll注入当作范例?
2020-7-31 22:11
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5

 小白已学习  谢谢楼主分享的源码

附上学习理解的 代码

#define _CRT_SECURE_NO_DEPRECATE
//头文件区
#include<windows.h>

#include <cstdlib>

#include <Tlhelp32.h>

#include <comdef.h>

#include <io.h>

#define DllPathSize 1024//常量值




//声明的子程序
int 取系统临时目录(char* 参数_输出结果); //整数型 函数名 (字节指针型 参数名)

int 取进程PID(const char* 进程名称);

int InjectDll(int targetid, const char * DllPath);

int 进程PID = 0;


//程序开始函数入口
int main()

{

	char 局部_临时目录[DllPathSize] = { 0 };//局部变量_字节型_1024长度

	if (取系统临时目录(局部_临时目录))                                           // 准备注入的dll名称为inject.dll,存放在临时目录里面
	{
		if (取进程PID("xxxxx.exe"))                       // 查找准备注入的进程

		{

			InjectDll(进程PID, 局部_临时目录);                    // 注入dll
			system("pause");
		}

	}

	return 1;

}




//取系统临时目录
int 取系统临时目录(char * 参数_输出结果)

{

	GetTempPathA(DllPathSize - 1, 参数_输出结果);//API 取临时目录(常量值, 参数_输出结果)

	strcat(参数_输出结果, "inject.dll");//API 字符串相加(参数_输出结果,自定义常量)

	if (_access(参数_输出结果, 0) == 0)            //判断 文件是否存在(参数_输出结果,判断类型)

	{

		printf("DLL路径: %s\n", 参数_输出结果);     //文件存在  打印输出数据  并返回 1

		return 1;

	}

	else

	{

		printf("inject.dll文件不存在\n");            //文件不存在  打印输出数据  并返回 0

		return 0;

	}

}




//取进程PID
int 取进程PID(const char * 参数_进程名称)
{
	PROCESSENTRY32 类型_进程信息;//进程信息结构体

	HANDLE  局部_快照句柄 = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//拍摄指定进程以及这些进程使用的堆,模块和线程的快照。

	if (局部_快照句柄 == INVALID_HANDLE_VALUE)                            //如果局部_快照句柄=无效的句柄

	{

		printf("can not reateToolhelp32Snapshot \n");                      //打印输出字符 

		进程PID = 0;                                                       //进程PID=0 返回

		return 0;

	}



	类型_进程信息.dwSize = sizeof(PROCESSENTRY32);                         //数据类型长度=取结构体数据长度

	BOOL 句柄_是否成功 = Process32First(局部_快照句柄, &类型_进程信息);            //此函数检有关系统快照中遇到的第一个进程的信息。

	while (句柄_是否成功)
	{
		_bstr_t 局部_进程名称(类型_进程信息.szExeFile);                                 //从进程信息结构体当中取出进程名称

		if (strcmp(局部_进程名称, 参数_进程名称) == 0)                                //判断进程信息结构体当中的进程名是否和参数进程名称相等
		{
			进程PID = 类型_进程信息.th32ProcessID;                                   //从结构体当中取出PID赋值给全局变量

			printf("进程PID: %d\n", 进程PID);                                     //打印输出数据

			CloseHandle(局部_快照句柄);                                          //关闭打开的快照句柄

			return 1;                                                  //返回1

		}

		句柄_是否成功 = Process32Next(局部_快照句柄, &类型_进程信息);

	}

	printf("进程快照句柄获取失败\n");

	return 0;

}






//远程线程注入DLL
int InjectDll(int 进程PID, const char * DLL路径)
{
	HANDLE 局部_进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, false, 进程PID); //获取进程句柄

	if (!局部_进程句柄)                                                    //判断进程句柄            
	{
		printf("获取进程句柄失败\n");
		return 0;
	}
	LPVOID 局部_新内存地址 = VirtualAllocEx(局部_进程句柄, NULL, DllPathSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//远程申请内存地址



	if (局部_新内存地址 == NULL)
	{
		printf("申请内存失败\n");
		return 0;
	}



	bool 局部_写内存 = WriteProcessMemory(局部_进程句柄, 局部_新内存地址, DLL路径, DllPathSize, NULL);//写进程内存

	if (局部_写内存 == 0)

	{
		printf("写内存失败\n");
		return 0;
	}



	HMODULE 局部_模块句柄 = GetModuleHandleA("kernel32.dll");

	LPTHREAD_START_ROUTINE 局部_函数地址 = (LPTHREAD_START_ROUTINE)GetProcAddress(局部_模块句柄, "LoadLibraryA");



	if (局部_函数地址 == 0)
	{
		printf("获取函数地址失败\n");
		return 0;
	}



	HANDLE 局部_线程句柄 = CreateRemoteThread(局部_进程句柄, NULL, 0, 局部_函数地址, 局部_新内存地址, 0, NULL);//创建远程线程

	if (局部_线程句柄 == NULL)
	{
		printf("创建远程线程失败\n");
		return 0;
	}
	CloseHandle(局部_进程句柄);
	return 1;
}


最后于 2020-8-1 00:04 被HmbGK编辑 ,原因:
2020-8-1 00:02
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上易语言大手子,...........
2020-8-2 13:38
0
雪    币: 148
活跃值: (1597)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
这种办法感觉很容易检测出来
2020-8-5 16:17
0
雪    币: 12356
活跃值: (5879)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
琳宇 这种办法感觉很容易检测出来
不用感觉,我直接告诉你一种检测办法,hook NtOpenFile,查AccessMask的FILE_EXECUTE标志位,为真则取文件哈希值,不在白名单,芜湖起飞
2020-8-5 23:51
0
雪    币: 3310
活跃值: (3908)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
hhkqqs 不用感觉,我直接告诉你一种检测办法,hook NtOpenFile,查AccessMask的FILE_EXECUTE标志位,为真则取文件哈希值,不在白名单,芜湖起飞[em_41]
多数?情况下是hook CreateRemoteThread
2020-8-6 16:44
0
雪    币: 12356
活跃值: (5879)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
Mr.hack 多数?情况下是hook CreateRemoteThread
也就应付下那些初级的c&p罢了,call入口点还可以插apc/hijack rip/iat hook/…… hook NtOpenFile基本能废掉LdrLoadDll
2020-8-6 23:46
0
雪    币: 667
活跃值: (327)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
5楼的写法其实很正常,支持全球化的开发工具,都支持这种写法。变量和函数名只是链接符号
2020-10-18 11:33
0
雪    币: 148
活跃值: (1597)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
hhkqqs 也就应付下那些初级的c&p罢了,call入口点还可以插apc/hijack rip/iat hook/…… hook NtOpenFile基本能废掉LdrLoadDll
loaddll倒是简单,大不了自己写一个。
2021-8-9 12:58
0
游客
登录 | 注册 方可回帖
返回
//