HOOK注入!
来源:互联网 发布:au软件的功能 编辑:程序博客网 时间:2024/05/25 19:56
这段时间研究了一下注入技术,今天有空来写一下心得,以免以后忘记.
用HOOK进行注入的思路主要如下:
1.首先,写一个钩子,放在DLL中,然后,导出设置钩子的函数SetHook。
2.在我的应用程序中,通过FindWindow来找出要注入的目标进程的ThreadId;
3.在自己的程序中调用SetHook,传入ThreadId;
4.在SetHook中设置目标进程的线程钩子,设置完成之后,通过 PostThreadMessage来对注入的线程发一个WM_NULL消息,激活钩子过程,在钩子过程中创建一个窗口,用于接受我的应用程序发送给他的消息。这样基本的模型就是这样。
然后给部分代码这里。
首先是DLL中的代码:
// InjectDLL.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#include "resource.h"
#define INJECT_API
#include "InjectDLL.h"
#include <fstream>
using namespace std;
////////////////////////////////////////
fstream fReport(TEXT("d:/TraceInfo.txt"), ios::out);
#pragma data_seg("Shared")
HHOOK g_hHook = NULL;
DWORD g_dwThreadID = 0;
HINSTANCE g_hInst = NULL;
DWORD g_dwCurrThreadID = 0;//当前线程ID
#pragma data_seg()
#pragma comment(linker,"/SECTION:Shared,rws")
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hInst = hModule;
break;
default:
break;
}
return TRUE;
}
LRESULT CALLBACK GetMsgProc(int code ,WPARAM wParam,LPARAM lParam);
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
/////////////////////////////////////////////////////////////////////////////
void SetHook(DWORD dwThreadID)
{
if(dwThreadID == 0)//卸载钩子
{
if(g_hHook != NULL)
{
::UnhookWindowsHookEx(g_hHook);
fReport<<"Has UnhookWindow "<<endl;
fReport.close();
}
return ;
}
g_dwCurrThreadID = ::GetCurrentThreadId();//获取调用线程ID
g_dwThreadID = dwThreadID;
g_hHook = ::SetWindowsHookExW(WH_GETMESSAGE,GetMsgProc,g_hInst,dwThreadID);
if(g_hHook != NULL)
{
::PostThreadMessageW(dwThreadID,WM_NULL,0,0);//触发钩子过程
}
else
{
if(g_hHook != NULL)
::UnhookWindowsHookEx(g_hHook);
}
}
//////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK GetMsgProc(int code ,WPARAM wParam,LPARAM lParam)
{
static BOOL bIsFirstLoad = TRUE;
static unsigned long nCount = 0;
int x,y;
x = lParam & 0x0000FFFF;
y = lParam & 0xFFFF0000;
fReport<<"X-Cordinary:"<<x<<"/n/t"<<"Y-Cordinary:"<<y<<endl;
//fReport<<"Get Message nCount:"<<nCount++<<endl;
if(bIsFirstLoad)
{
bIsFirstLoad = FALSE;
HWND hDlg = NULL;
DWORD dwErr = 0 ;
hDlg = ::CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DLG_INJECT),NULL,DialogProc);
fReport<<"hDlg:"<<hDlg<<endl;
::PostThreadMessageW(g_dwCurrThreadID,WM_NULL,0,0);//告诉我们DLL已经创建好了对话框,准备接受消息了
}
return ::CallNextHookEx(g_hHook,code,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_APP:
fReport<<"WM_APP: I has Hooked iexplore/n"<<endl;
break;
case WM_CLOSE:
fReport<<"WM_CLOSE"<<endl;
::DestroyWindow(hwndDlg);
break;
default:
break;
}
return FALSE;
}
控制DLL行为的应用程序主要代码:
OnInitDialog中:
HWND hParent = NULL, hChild = NULL;
DWORD dwThreadId = 0, dwProcessId = 0;
hParent = ::FindWindow(TEXT("Progman"),NULL);
hChild = ::FindWindowEx(::FindWindowEx(hParent,NULL,NULL,NULL),NULL,NULL,NULL);
m_hDesktop = hChild;
dwThreadId = ::GetWindowThreadProcessId(hChild, &dwProcessId);
SetHook(dwThreadId);
MSG msg;
::GetMessageW(&msg,NULL,0,0);
::SetWindowTextW(::GetDlgItem(m_hWnd,IDC_STC_READY),TEXT("已经成功注入/n可以开始操作"));
m_bOK = TRUE;
void CTestInjectDLLDlg::OnBnClickedBtnSend()
{
// TODO: 在此添加控件通知处理程序代码
if(m_bOK)
{
HWND hInject =::FindWindow(NULL,TEXT("INJECTDLG"));
::SendMessage(hInject,WM_APP,(WPARAM)m_hDesktop,0);
}
}
void CTestInjectDLLDlg::OnBnClickedBtnUnhook()
{
if(m_bOK)
{
HWND hInject = ::FindWindow(NULL,TEXT("INJECTDLG"));
::SendMessage(hInject,WM_CLOSE,0,0);
SetHook(0);
}
// TODO: 在此添加控件通知处理程序代码
}
这样运行,然后在
点击对话框上的按钮,发现D盘中TraceInfo.txt中出现了我想要的结果,注入成功O(∩_∩)O哈哈~
- HOOK注入!
- 注入HOOK
- HOOK API DLL 注入
- HOOK API DLL 注入
- 线程注入、HOOK APIs
- Hook : APC注入技术
- Android注入和HOOK
- 注入Hook技术 -- DLL注入
- 游戏注入教程(二)--HOOK注入
- 进程注入方法之 hook
- 关于dll注入的hook
- 寄存器、注入和Hook结构图
- R3进程DLL注入HOOK
- 注入进程 远程线程注入 与 hook注入
- HOOK登陆器来注入DLL -HOOK CreateProcessA
- 内存注入之IAT Hook和Inline Hook综合程序
- 用hook实现dll注入详解
- 用hook实现dll注入详解
- HTML&&JavaScript实现一个简单的计算器
- jclouds BlobStore介绍
- Android Studio 哪些文件不需要加入版本控制中
- Android Volley完全解析(三),定制自己的Request
- 数据收集-升级Nginx服务器,添加HTTPS过程中遇到的问题
- HOOK注入!
- tabview 的简单定义。
- mysql数据优化方案
- Android多activity间数据的传送
- Visual Studio .gitignore样例
- 自定义的View 重写UIView的方法
- ZOJ 2966 Build The Electric System(最小生成树)
- redis单机搭建--详细
- 2、Maven在MyEclipse的集成,并建立一个简单的Maven项目