65,211
社区成员
发帖
与我相关
我的任务
分享 #include <windows.h>
#include <stdio.h>
// 远线程参数结构
typedef struct _RemoteThreadPara{
char pMessageBox[12];
DWORD dwMessageBox;
}RemotePara;
// 远程线程
DWORD __stdcall ThreadProc( RemotePara *lpPara )
{
// 对MessageBox()函数做函数指针
typedef int (__stdcall *MMessageBoxA)(HWND,
LPCTSTR, LPCTSTR, DWORD );
// 声明函数指针对象
MMessageBoxA myMessageBoxA;
// 指针赋值
// 得到函数入口地址
myMessageBoxA = (MMessageBoxA)lpPara->dwMessageBox;
// 调用MessageBox(....);
myMessageBoxA( NULL,
lpPara->pMessageBox,
lpPara->pMessageBox,
0 );
return 0;
}
//提升应用级调试权限
int EnableDebugPriv();
int main( int argc, char** argv[] )
// 注入进程内存实现本地进程隐藏
{
// 线程运行需要从宿主进程
// 划拨的内存大小
const DWORD THREADSIZE = 1024*4;
DWORD byte_write;
HANDLE hWnd;
HANDLE hThread;
HINSTANCE hUser32;
void *pRemoteThread;
RemotePara myRemotePara;
RemotePara *pRemotePara;
// 提升权限
EnableDebugPriv();
// 打开进程
hWnd = OpenProcess (
// 拥有所有权限
PROCESS_ALL_ACCESS,
// 不被继承
FALSE,
// 进程ID
1436 );
// 打开进程失败
if(!hWnd)
{
fprintf( stderr, "There is no such Process\n" );
return -1;
}
// 划拨进程内一块内存并清0
pRemoteThread = VirtualAllocEx(
hWnd,
NULL, // 让程序决定开始划拨内存地址
THREADSIZE, // 划拨的大小
MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE );
// 划拨内存失败
if( !pRemoteThread )
return -1;
// 写进程内存(注入线程)
if( !WriteProcessMemory(
// 打开的进程句柄
hWnd,
// 内存地址
pRemoteThread,
// 线程函数
&ThreadProc,
// 写入数据大小
THREADSIZE,
// 实际写入数(这里忽略)
0 ) )
return -1;
// 线程参数缓冲区清0
ZeroMemory( &myRemotePara, sizeof(RemotePara) );
// 装载user32.dll
hUser32 = LoadLibrary ("user32.dll");
// 装载程序地址
myRemotePara.dwMessageBox =(DWORD)GetProcAddress (hUser32 , "MessageBoxA");
// 字符参数
strcat( myRemotePara.pMessageBox, "hello\0" );
// 再次划拨内存存储参数
pRemotePara = (RemotePara *)VirtualAllocEx (
hWnd,
0,
sizeof(RemotePara),
MEM_COMMIT,
// 空间页面属性
PAGE_READWRITE );
// 参数内存划拨失败
if( !pRemotePara )
return -1;
// 写内存(注入线程参数)
if( !WriteProcessMemory(
// 进程句柄
hWnd,
// 内存地址
pRemotePara,
// 数据
&myRemotePara,
// 大小
sizeof myRemotePara,
// 实际写入量
0) )
return -1;
// 创建远程线程
hThread = CreateRemoteThread (
hWnd, // 进程句柄
0, // 默认安全级
0, // 默认栈
// 线程函数
(DWORD (__stdcall *)(void *))pRemoteThread,
pRemotePara,// 线程参数
0, // 立即执行
&byte_write );
// 启动远程线程失败
if( !hThread )
return -1;
return 0;
}
// 提升权限
// 使在internet、winLogin、lsass中注入线程得以实现
int EnableDebugPriv( void )
{
// 句柄
HANDLE hToken;
LUID sedebugnameValue;
// 权限信息结构
TOKEN_PRIVILEGES tkp;
// 打开进程访问权限
if ( ! OpenProcessToken(
// 获取当前进程句柄
GetCurrentProcess(),
// 请求获取并改变权限
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
// 存储当前进程权限信息
&hToken ))
return -1;
// 查询标识符
if ( ! LookupPrivilegeValue(
NULL,
SE_DEBUG_NAME,
// 标识符
&sedebugnameValue ))
{
CloseHandle( hToken );
return -1;
}
// 设置权限信息
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// 请求设定进程权限
if ( ! AdjustTokenPrivileges(
hToken,
FALSE,
&tkp,
sizeof(tkp),
NULL,
NULL ))
CloseHandle( hToken );
return 0;
}