|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 nicho_Y 于 2014-2-10 10:50 编辑
编写一个远程注入程序,利用ntdll.dll的NtCreateThreadEx函数,但是程序返回的线程句柄是0.以下是程序源代码,用的是code::block编写的.- #include "windows.h"
- #include "stdio.h"
- #include "tchar.h"
- #pragma comment(lib,"libadvapi32.a")
- BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
- {
- TOKEN_PRIVILEGES tp;
- HANDLE hToken;
- LUID luid;
- if( !OpenProcessToken(GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
- &hToken) )
- {
- _tprintf("OpenProcessToken error: %u\n", GetLastError());
- return FALSE;
- }
- if( !LookupPrivilegeValue(NULL,
- lpszPrivilege,
- &luid) )
- {
- _tprintf("LookupPrivilegeValue error: %u\n", GetLastError() );
- return FALSE;
- }
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- if( bEnablePrivilege )
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- else
- tp.Privileges[0].Attributes = 0;
- if( !AdjustTokenPrivileges(hToken,
- FALSE,
- &tp,
- sizeof(TOKEN_PRIVILEGES),
- (PTOKEN_PRIVILEGES) NULL,
- (PDWORD) NULL) )
- {
- _tprintf("AdjustTokenPrivileges error: %u\n", GetLastError() );
- return FALSE;
- }
- if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
- {
- _tprintf("The token does not have the specified privilege. \n");
- return FALSE;
- }
- return TRUE;
- }
- typedef DWORD (WINAPI *PFNTCREATETHREADEX)
- (
- PHANDLE ThreadHandle,
- ACCESS_MASK DesiredAccess,
- LPVOID ObjectAttributes,
- HANDLE ProcessHandle,
- LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter,
- BOOL CreateSuspended,
- DWORD dwStackSize,
- DWORD dw1,
- DWORD dw2,
- LPVOID Unknown
- );
- BOOL IsVistaOrLater()
- {
- OSVERSIONINFO osvi;
- ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&osvi);
- if( osvi.dwMajorVersion >= 6 )
- return TRUE;
- return FALSE;
- }
- BOOL MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
- {
- HANDLE hThread = NULL;
- FARPROC pFunc = NULL;
- if( IsVistaOrLater() ) // Vista, 7, Server2008
- {
- pFunc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCreateThreadEx");
- if( pFunc == NULL )
- {
- printf("MyCreateRemoteThread() : GetProcAddress("NtCreateThreadEx") 调用失败!错误代码: [%d]\n",
- GetLastError());
- return FALSE;
- }
- ((PFNTCREATETHREADEX)pFunc)(&hThread,
- 0x1FFFFF,
- NULL,
- hProcess,
- pThreadProc,
- pRemoteBuf,
- FALSE,
- NULL,
- NULL,
- NULL,
- NULL);
- if( hThread == NULL )
- {
- printf("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]\n", GetLastError());
- return FALSE;
- }
- }
- else // 2000, XP, Server2003
- {
- hThread = CreateRemoteThread(hProcess,
- NULL,
- 0,
- pThreadProc,
- pRemoteBuf,
- 0,
- NULL);
- if( hThread == NULL )
- {
- printf("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]\n", GetLastError());
- return FALSE;
- }
- }
- if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
- {
- printf("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]\n", GetLastError());
- return FALSE;
- }
- return TRUE;
- }
- BOOL InjectDll(DWORD dwPID, char *szDllName)
- {
- HANDLE hProcess = NULL;
- LPVOID pRemoteBuf = NULL;
- FARPROC pThreadProc = NULL;
- DWORD dwBufSize = strlen(szDllName)+1;
- if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
- {
- printf("[错误] OpenProcess(%d) 调用失败!错误代码: [%d]\n",
- dwPID, GetLastError());
- return FALSE;
- }
- pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize,
- MEM_COMMIT, PAGE_READWRITE);
- WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllName,
- dwBufSize, NULL);
- pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"),
- "LoadLibraryA");
- if( !MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pThreadProc, pRemoteBuf) )
- {
- printf("[错误] CreateRemoteThread() 调用失败!错误代码: [%d]\n", GetLastError());
- return FALSE;
- }
- VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);
- CloseHandle(hProcess);
- return TRUE;
- }
- int main(int argc, char *argv[])
- {
- SetPrivilege(SE_DEBUG_NAME, TRUE);
- // if( argc != 3 )
- // {
- // printf("用法 : %s <进程PID> <dll路径>/n", argv[0]);
- // return 1;
- // }
- // if( !InjectDll((DWORD)atoi(argv[1]), argv[2]) )
- // {
- // printf("InjectDll调用失败!/n");
- // return 1;
- // }
- if( !InjectDll((DWORD)atoi("3360"), "C:\\Windows\\firstdll.dll") ) //3360 是被注入程序的PID
- {
- printf("InjectDll调用失败!/n");
- return 1;
- }
- printf("InjectDll调用成功!/n");
- return 0;
- }
复制代码 在我附件有项目工程文件还有 firstdll.dll. 希望大牛们指点下小菜,谢谢
|
|