- 注册时间
- 2010-7-22
- 最后登录
- 2017-5-10
- 在线时间
- 3 小时
编程入门
- 魔鬼币
- 9134
|
学写智辅有好几天,最近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;
}
|
|