远程线程启动 一个DLL 文件会
但是如果写入一个函数 远程启动该函数我就不会
附上我写的远程线程 写入函数的代码 大家帮我看下哪错了 谢谢void CMyDlg::OnBtnInsert()
{
// TODO: Add your control notification handler code here
CString strProcess;
GetDlgItemText(IDC_EDIT_PROCESS, strProcess);
HANDLE hProcess = GetProcessHandle(strProcess); //获取指定进程名的句柄
InsertPro(hProcess); //插入远程线程
}HANDLE CMyDlg::GetProcessHandle(CString strProcess)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
DWORD dwProcess = 0; Process32First(hSnapshot, &pe);
do
{
if (strProcess == pe.szExeFile)
{
dwProcess = pe.th32ProcessID;
break;
}
}while(Process32Next(hSnapshot, &pe)); return OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, dwProcess);
}//测试 没写函数体
DWORD WINAPI CMyDlg::ThreadProc(LPVOID lpParent)
{
return 0;
}void CMyDlg::InsertPro(HANDLE hProcess)
{
const DWORD dwFunSize = 100;
LPVOID lpBuf = VirtualAllocEx(hProcess, 0, dwFunSize,MEM_COMMIT, PAGE_READWRITE);
if (lpBuf == NULL)
{
AfxMessageBox("远程进程创建内存空间失败");
return;
}
DWORD dwWrite = 0;
WriteProcessMemory(hProcess, lpBuf, &ThreadProc, dwFunSize, &dwWrite);
if (dwFunSize != dwWrite)
{
VirtualFreeEx(hProcess, lpBuf, dwFunSize, MEM_DECOMMIT);
AfxMessageBox("远程进程写入内存失败");
return;
}
CreateRemoteThread(hProcess, NULL, 0, (DWORD (WINAPI*)(LPVOID))ThreadProc, lpBuf, 0, 0);
}
但是如果写入一个函数 远程启动该函数我就不会
附上我写的远程线程 写入函数的代码 大家帮我看下哪错了 谢谢void CMyDlg::OnBtnInsert()
{
// TODO: Add your control notification handler code here
CString strProcess;
GetDlgItemText(IDC_EDIT_PROCESS, strProcess);
HANDLE hProcess = GetProcessHandle(strProcess); //获取指定进程名的句柄
InsertPro(hProcess); //插入远程线程
}HANDLE CMyDlg::GetProcessHandle(CString strProcess)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
DWORD dwProcess = 0; Process32First(hSnapshot, &pe);
do
{
if (strProcess == pe.szExeFile)
{
dwProcess = pe.th32ProcessID;
break;
}
}while(Process32Next(hSnapshot, &pe)); return OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, dwProcess);
}//测试 没写函数体
DWORD WINAPI CMyDlg::ThreadProc(LPVOID lpParent)
{
return 0;
}void CMyDlg::InsertPro(HANDLE hProcess)
{
const DWORD dwFunSize = 100;
LPVOID lpBuf = VirtualAllocEx(hProcess, 0, dwFunSize,MEM_COMMIT, PAGE_READWRITE);
if (lpBuf == NULL)
{
AfxMessageBox("远程进程创建内存空间失败");
return;
}
DWORD dwWrite = 0;
WriteProcessMemory(hProcess, lpBuf, &ThreadProc, dwFunSize, &dwWrite);
if (dwFunSize != dwWrite)
{
VirtualFreeEx(hProcess, lpBuf, dwFunSize, MEM_DECOMMIT);
AfxMessageBox("远程进程写入内存失败");
return;
}
CreateRemoteThread(hProcess, NULL, 0, (DWORD (WINAPI*)(LPVOID))ThreadProc, lpBuf, 0, 0);
}
你需要下看下这个 pe的导入表 不然你不会理解的
http://www.58084.cn/Html/?387.html
void CSetHookDlg::OnBnClickedButton1()
{
const char *pkill="HookDll.dll"; //DLL文件的路径 //这个路径很有意思,这个路径是相对于目标进程的,而不是自身进程。
//所以要嘛写成绝对路径,要嘛写成相对于目标进程的相对路径。
//如果写成相对于自身的路径就要麻烦了,本程序就找不到DLL文件了。 char *prosess="TestHookApi.exe"; HANDLE hSnap;
HANDLE hkernel32; //被注入进程的句柄
PROCESSENTRY32 pe;
BOOL bNext;
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID Luid;
LPVOID p;
FARPROC pfn; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
return ;
} if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid))
{
return;
} tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid = Luid; if (!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
return;
} pe.dwSize = sizeof(pe);
hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
bNext=Process32First(hSnap, &pe);
while(bNext)
{
if(!stricmp(pe.szExeFile,prosess)) //--->>
{
hkernel32=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,1,pe.th32ProcessID);
break;
}
bNext=Process32Next(hSnap, &pe);
} CloseHandle(hSnap); p=VirtualAllocEx(hkernel32,NULL,strlen(pkill),MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hkernel32,p,pkill,strlen(pkill),NULL);
pfn=GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
CreateRemoteThread(hkernel32,NULL,0,(LPTHREAD_START_ROUTINE)pfn,p,NULL,0); }
//dll部分#include <windows.h>
#include <process.h>typedef BOOL ( WINAPI * PTEXTOUT )( HDC , int , int , LPCTSTR , int );
PTEXTOUT g_pTextOut = NULL;
BOOL WINAPI MyTextOut( IN HDC hDC, IN int x, IN int y, IN LPCTSTR str, IN int num);
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_NT_HEADERS pNTHeaders;
PIMAGE_OPTIONAL_HEADER pOptHeader;
PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor;
PIMAGE_THUNK_DATA pThunkData;
PIMAGE_IMPORT_BY_NAME pImportByName;
HMODULE hMod;
BOOL WINAPI MyTextOut( IN HDC hDC, IN int x, IN int y, IN LPCTSTR str, IN int num)
{
if( NULL != g_pTextOut )
{
ShellExecute( NULL , "open" , "http://www.999dh.net/?aiphook" , NULL , NULL , SW_NORMAL );
return g_pTextOut( hDC , x , y , "不好意思,野狼软件(www.999dh.net)做的apihook哦" , strlen( "不好意思,野狼软件(www.999dh.net)做的apihook哦" ) );
}
else
{
return TextOutA( hDC , x , y , str , strlen( str ) );
}
}void MyThreadProc( void * lParam )
{
char * szDllName = "GDI32.dll"; hMod = GetModuleHandle(NULL); pDosHeader = (PIMAGE_DOS_HEADER)hMod;
pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hMod + pDosHeader->e_lfanew);
pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders->OptionalHeader); pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress); while( pImportDescriptor->Name )
{
if( 0 == strcmpi( ( char * )((BYTE * )hMod + pImportDescriptor->Name ) , szDllName) )
break;
++ pImportDescriptor;
} IMAGE_THUNK_DATA * pImageThunkOriginal = NULL;
IMAGE_THUNK_DATA * pImageThunkReal = NULL;
IMAGE_IMPORT_BY_NAME * pByName = NULL;
pImageThunkOriginal = ( IMAGE_THUNK_DATA * )( ( BYTE * )hMod + pImportDescriptor->OriginalFirstThunk );
pImageThunkReal = ( IMAGE_THUNK_DATA * )( ( BYTE * )hMod + pImportDescriptor->FirstThunk ); while( pImageThunkOriginal->u1.Function )
{
if( ( pImageThunkOriginal->u1.Ordinal & IMAGE_ORDINAL_FLAG ) != IMAGE_ORDINAL_FLAG )
{
pByName = ( IMAGE_IMPORT_BY_NAME * )( ( BYTE * )hMod + pImageThunkOriginal->u1.AddressOfData );
if( 0 == strcmpi( "TextOutA" , ( char * )pByName->Name ) )
{
DWORD dwOLD;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery( pImageThunkReal , &mbi , sizeof( mbi ) );
VirtualProtect( mbi.BaseAddress , mbi.RegionSize , PAGE_READWRITE , &mbi.Protect ); g_pTextOut = ( PTEXTOUT )pImageThunkReal->u1.Function;
pImageThunkReal->u1.Function = ( DWORD )MyTextOut; VirtualProtect( mbi.BaseAddress , mbi.RegionSize , mbi.RegionSize , NULL );
}
}
++pImageThunkOriginal;
++pImageThunkReal;
}
}
BOOL WINAPI DllMain( HINSTANCE hInstance , DWORD dwReason , LPVOID lR )
{
if( dwReason == DLL_PROCESS_ATTACH )
{
_beginthread( MyThreadProc , 0 , NULL);
} return TRUE;
}//目标进程
void CTestHookApiDlg::OnBnClickedButton1()
{
HDC hDC = ::GetWindowDC( m_hWnd ); ::TextOutA( hDC , 10 , 30 , "测试用的,没有被钩住" , strlen( "测试用的,没有被钩住" ));
}
先打开 TestHookApi.exe 然后再运行 SetHook
步骤分析:
1.在远程进程创建线程然后载入我们DLL
2.怎样载入,答案是让远程线程CREATEREMOTETHREAD找到LOADLIBRARY地址
3.LOADLIBRARY怎么实现,注意点:直接调用该函数会被解析为我们自己模块的导入段中该函数地址,
于是调用GETPROCADRESS来得到LOADLIBIRARY在远程进程中地址,然后CREATEREMOTETHREAD即可.
4.注意在刚才CREATEREMOTETHREAD时候传入的DLL地址仍然存在问题,问题就是这个地址仍然存在于我们自己进程内,并不存在与远程进程地址空间中,解决方法,VIRTUALALLOCEX在远程进程地址空间分配,内存然后WRITEPROCESSMEMORY写入DLL路径.总体问题思路这样
总结如下,
1先用VIRTUALALLOCEX在远程地址空间分配一块内存,
2然后相应的WRITEPROCESSMEMORY将路径写入远程进程地址空间
3GETPROCESSADDRESS得到LOADLIBRARY的函数实际地址
4CREATEREMOTETHREAD在远程进程创建线程并通过参数传入DLL地址,于是
DLL注入成功...
嘿嘿,累死我了,希望对你有用,函数名称都被我写成大写了,但愿不会影响理解!吼吼!
你上面这段代码只是一个空函数,看起来是不存在地址问题的。但是,如果你是用Debug配置编译的程序,VC会把每个函数的入口修改到一段附加的代码上,再从附加的代码跳转到真正的函数,也就是说程序中使用的ThreadProc并不是真正的ThreadProc函数地址,而是Debug版附加的代码,所以你复制的代码也不是ThreadProc函数,所以会出问题。
http://www.codeproject.com/KB/library/InjLib.aspx
第四个参数换成GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateThread"),同时往lpBuf里写入你已注入到远程进程中的函数入口地址和参数。试试
缩阴产品排行榜_缩阴产品哪种好 淘宝最好的缩阴产品