一个完整的DLL远程注入函数
来源:互联网 发布:淘宝紫米商学院怎么样 编辑:程序博客网 时间:2024/04/25 13:33
函数名称: CreateRemoteDll()
返加类型:BOOL
接受参数: DLL路径,注入进程ID
其完整代码如下:
BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
...{
HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
...{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
}
HANDLE hRemoteProcess;
//打开远程线程
if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE, //允许远程VM写
FALSE, dwRemoteProcessId ) )== NULL )
...{
AfxMessageBox("OpenProcess Error!");
return FALSE;
}
char *pszLibFileRemote;
//在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if(pszLibFileRemote == NULL)
...{
AfxMessageBox("VirtualAllocEx error! ");
return FALSE;
}
//将DLL的路径名复制到远程进程的内存空间
if( WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)
...{
AfxMessageBox("WriteProcessMemory Error");
return FALSE;
}
//计算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
if(pfnStartAddr == NULL)
...{
AfxMessageBox("GetProcAddress Error");
return FALSE;
}
HANDLE hRemoteThread;
if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)
...{
AfxMessageBox("CreateRemoteThread Error");
return FALSE;
}
return TRUE;
}
...{
HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
...{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
}
HANDLE hRemoteProcess;
//打开远程线程
if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE, //允许远程VM写
FALSE, dwRemoteProcessId ) )== NULL )
...{
AfxMessageBox("OpenProcess Error!");
return FALSE;
}
char *pszLibFileRemote;
//在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if(pszLibFileRemote == NULL)
...{
AfxMessageBox("VirtualAllocEx error! ");
return FALSE;
}
//将DLL的路径名复制到远程进程的内存空间
if( WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)
...{
AfxMessageBox("WriteProcessMemory Error");
return FALSE;
}
//计算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
if(pfnStartAddr == NULL)
...{
AfxMessageBox("GetProcAddress Error");
return FALSE;
}
HANDLE hRemoteThread;
if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)
...{
AfxMessageBox("CreateRemoteThread Error");
return FALSE;
}
return TRUE;
}
- 一个完整的DLL远程注入函数
- 一个完整的DLL远程注入函数
- 封装好的DLL远程注入函数
- 远程线程注入dll的一个例子,netcat.dll
- DLL的远程注入
- DLL 远程注入相关函数
- win7 64 DLL的远程注入技术 及注入dll函数调用
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- 远程注入DLL的例子
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- IIS 服务器的权限检查
- 一个比较不错的JS时间控件
- 9210的Micaps第15类调色板数据
- StreamWriter输出中文乱码
- 深入浅出VA函数的使用技巧
- 一个完整的DLL远程注入函数
- 今天注册了
- 禁止运行多个实例最简单的方法
- J2EE应用程序中的性能提升
- Oracle查询中rownum与Order by查询的关系
- C#面试题
- 得到数据库所有表名和字段
- 访CodeGear大中华区CTO李维:不再错失Web2.0机会
- bmp文件格式