加载dll进入另一个进程的方式一般有两种:
第一种:主动加载,通过注入的方式加载,先启动目标进程,在注入目标进程。
第二种:被动加载,让目标自己主动去加载我们的dll
如何实现,让目标自动加载自己编写的dll呢?
一是:自己写一个系统dll的壳,自己的dll只是实现间接的调用系统dll的功能。替换掉系统的dll。
二是:编写一个LSP(分层服务提供程序)。这种方式实现比较容易。
三是:系统驱动,这个要相对复杂了
我今天要说的是第一种加载方式:主动加载
主动加载也分两种情况
(1):目标进程由我们主动启动,然后加载外挂dll
(2):目标进程已经启动,通过枚举目标进程,然后加载外挂dll
(1)实现方式的重要代码:
(2):枚举进程代码
pc版微信 数据库备份(8)源码分享
上一页
void GetFullName(const char
*
name, char
*
fullName,
int
len
)
{
memset(fullName,
0
,
len
);
GetCurrentDirectory(
260
, fullName);
lstrcat(fullName,
"\\"
);
lstrcat(fullName, name);
OutputDebugString(fullName);
}
/
/
加载dll到目标进程
void AttachDll(HANDLE hProcess)
{
if
(NULL !
=
hProcess)
{
char path[
260
];
GetFullName(g_dllName, path,
260
);
OutputDebugString(path);
DetourContinueProcessWithDll(hProcess, path);
CloseHandle(hProcess);
}
}
/
/
设置调试权限
void SetDebugPrivileges()
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
HANDLE hCurProcess
=
::GetCurrentProcess();
if
(::OpenProcessToken(hCurProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
::LookupPrivilegeValue(
0
,
"SeDebugPrivilege"
, &tp.Privileges[
0
].Luid);
tp.PrivilegeCount
=
1
;
tp.Privileges[
0
].Attributes
=
SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, false, &tp,
0
,
0
,
0
);
}
}
PROCESS_INFORMATION pi;
DWORD WINAPI attchDll(LPVOID lParam)
{
char aimFile[
260
];
char configFile[
260
];
STARTUPINFO si;
SetDebugPrivileges();
/
/
启动目标客户端
memset(&si,
0
, sizeof(si));
GetStartupInfo(&si);
memset(&pi,
0
, sizeof(pi));
memset(aimFile,
0
,
260
);
strcpy(aimFile,
"C:\\Program Files (x86)\\Tencent\\WeChat\\Wechat.exe"
);
/
/
MessageBox(
0
,wowFile,
"path"
,
0
);
CreateProcess(
0
, aimFile,
0
,
0
,
0
,
0
,
0
,
0
, &si, &pi);
Sleep(
3000
);
/
/
启动外挂
memset(g_dllName,
0
,
260
);
strcpy(aimFile,
"sqliteReverse.dll"
);
AttachDll(pi.hProcess);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return
0
;
}
void GetFullName(const char
*
name, char
*
fullName,
int
len
)
{
memset(fullName,
0
,
len
);
GetCurrentDirectory(
260
, fullName);
lstrcat(fullName,
"\\"
);
lstrcat(fullName, name);
OutputDebugString(fullName);
}
/
/
加载dll到目标进程
void AttachDll(HANDLE hProcess)
{
if
(NULL !
=
hProcess)
{
char path[
260
];
GetFullName(g_dllName, path,
260
);
OutputDebugString(path);
DetourContinueProcessWithDll(hProcess, path);
CloseHandle(hProcess);
}
}
/
/
设置调试权限
void SetDebugPrivileges()
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
HANDLE hCurProcess
=
::GetCurrentProcess();
if
(::OpenProcessToken(hCurProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
::LookupPrivilegeValue(
0
,
"SeDebugPrivilege"
, &tp.Privileges[
0
].Luid);
tp.PrivilegeCount
=
1
;
tp.Privileges[
0
].Attributes
=
SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, false, &tp,
0
,
0
,
0
);
}
}
PROCESS_INFORMATION pi;
DWORD WINAPI attchDll(LPVOID lParam)
{
char aimFile[
260
];
char configFile[
260
];
STARTUPINFO si;
SetDebugPrivileges();
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-1-18 09:29
被freeGod编辑
,原因: