远程线程启动 一个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);
}    

解决方案 »

  1.   

    哈哈  本大哥 这几天刚好在学这个  现在基本没有问题了
    你需要下看下这个 pe的导入表  不然你不会理解的 
    http://www.58084.cn/Html/?387.html
      

  2.   

    //寻找进程并且创建远程线程
    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  
      

  3.   

    回楼上 DLL注入我会 我问的是无DLL 写入一个函数 远程启动函数
      

  4.   

    目的:将DLL注入到目标进程中。
    步骤分析:
    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注入成功...
    嘿嘿,累死我了,希望对你有用,函数名称都被我写成大写了,但愿不会影响理解!吼吼!
      

  5.   

    理解错了,你不要通过DLL直接调用,那就关系到了可执行文件的存储格式了,看下PE文件结构体,和相应作用,不过很难,东西也比较多,祝你成功!
      

  6.   

    不知道LZ的汇编语言掌握的怎么样。一段代码从一个进程复制到另一进程后,通常情况下代码的地址是不会相同的,如果程序中使用了静态变量或者调用了其它函数,则需要重定位(修正地址偏移量)后才能正确运行。
    你上面这段代码只是一个空函数,看起来是不存在地址问题的。但是,如果你是用Debug配置编译的程序,VC会把每个函数的入口修改到一段附加的代码上,再从附加的代码跳转到真正的函数,也就是说程序中使用的ThreadProc并不是真正的ThreadProc函数地址,而是Debug版附加的代码,所以你复制的代码也不是ThreadProc函数,所以会出问题。
      

  7.   

    参考:
    http://www.codeproject.com/KB/library/InjLib.aspx
      

  8.   

    CreateRemoteThread(hProcess, NULL, 0, (DWORD (WINAPI*)(LPVOID))ThreadProc, lpBuf, 0, 0);
    第四个参数换成GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateThread"),同时往lpBuf里写入你已注入到远程进程中的函数入口地址和参数。试试
      

  9.   

    http://www.goojeje.com/
    缩阴产品排行榜_缩阴产品哪种好 淘宝最好的缩阴产品