- 注册时间
 - 2010-7-22
 
- 最后登录
 - 2017-5-10
 
- 在线时间
 - 3 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 9206 
 
 
 
 | 
 
学写智辅有好几天,最近2天一直在找智辅呼出思路,无奈网上的代码的太少,鲜有C++的,只好自己摸索写出了一个DEMO,献给与我一样迷茫的菜鸟.  
 
一.  注入代码常用三种形式  
 
•    Windows 钩子 :将代码放入DLL,然后通过 Windows 钩子映射该DLL到远程进程  
•    CreateRemoteThread 和 LoadLibrary , 将代码放入DLL,然后通过CreateRemoteThread,调用 LoadLibrary函数,让远程进程加载DLL  
•    CreateRemoteThread 和 WriteProcessMemory, 可以直接将你的代码拷贝到远程进程——通过 WriteProcessMemory——并用 CreateRemoteThread 启动它的执行.    
本文所用的第一种方法,HOOK键盘注入DLL.并在DLL中创建对话框,用于智辅显示  
 
二.    详细过程  
第一步,我们需要一个DLL用于注入,这个DLL封装了我们智辅的界面  
 
(1) 建MFC DLL工程  
建立新工程  
创建MFC(dll),选择  
Regular DLL using shared mfc DLL  
 
(2首先,我们导出两个函数,用于HOOK键盘,代码片段如下:  
注意,这里的参数是线程ID(不是进程ID,这里要搞清楚),也就是要传入远程进程一个线程ID,理论上任意一个线程ID都可以  
WG_HOOK BOOL WINAPI InstallHook(DWORD dwID)  
{  
    if (g_hhook == NULL)  
    {  
        g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, dwID);  
        if (g_hhook == NULL)  
        {  
            return FALSE;  
        }      
        MessageBox(NULL,"成功HOOK,请按F12进行测试","提示",MB_OK);  
    }  
    return TRUE;  
}  
 
 
WG_HOOK BOOL WINAPI UninstallHook()  
{  
    return ::UnhookWindowsHookEx(g_hhook);  
}  
 
(3)在资源中建立一个对话框,设置其类为CWGMainDlg,用于捕捉到键盘F12时显示  
HOOK键盘显示代码片段:  
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)  
{  
    BOOL bKeyUp = lParam & (1 << 31);  
    if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)  
    {  
        if (pMainDlg == NULL)   
        {  
            //更改当前有效模块状态到DLL中  
            //以便正确的读取对话框的资源  
            AFX_MANAGE_STATE(AfxGetStaticModuleState());  
            //找到当前的有效激活窗口  
            CWnd *pCWnd = CWnd::GetForegroundWindow();  
            //生成CS3DHookDlg类的对象实例  
            //此处应该生成一个非模态对话框  
            pMainDlg = new CWGMainDlg();  
            pMainDlg->Create(IDD_DIALOG1, pCWnd);  
 
        }  
        else   
        {  
            //根据当前呼出窗口的状态来显示或隐藏呼出窗口  
            pMainDlg->ShowWindow(pMainDlg->IsWindowVisible() ? SW_HIDE : SW_SHOW);  
        }  
    }  
    return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);  
}  
 
第二步,我们需要一个EXE程序用于挂勾注入DLL.  
新建一个MFC对话框程序,添加一个按钮,并添加按钮事件  
代码片段:  
 
    char szExeName[MAX_PATH];  
    strcpy(szExeName,"ListForCrack.exe");//假定我们注入的目标进程是这个  
    DWORD dwProcessId = processNameToId(szExeName);//通过进程名找进程ID  
      
    if( 0 == dwProcessId )  
    {  
        MessageBox("找不到进程");  
        return;  
    }  
      
    DWORD dwThreadID =  GetThreadIDByProcssID(dwProcessId);//通过进程ID找一个线程ID  
    InstallHook(dwThreadID);  
 
这里要特别注意的是GetThreadIDByProcssID这个函数,得到进程的一个线程ID进行HOOK  
 
DWORD GetThreadIDByProcssID(DWORD dwProcessID)  
{  
    DWORD dwThreadID = 0;  
    THREADENTRY32 te32 = {sizeof(te32)};  
    HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);  
    if( Thread32First( hThreadSnap, &te32) )  
    {  
        do{  
            if( dwProcessID == te32.th32OwnerProcessID )  
            {  
                dwThreadID = te32.th32ThreadID;  
                break;  
            }  
        }while( Thread32Next( hThreadSnap, &te32) );  
    }   
      
    return dwThreadID;  
} 
 |   
 
 
 
 |