通过HOOK来注入DLL的一点心得!!!!!!

news/2024/7/20 22:12:10 标签: dll, hook, null, callback, linker, ios

这段时间研究了一下注入技术,今天有空来写一下心得,以免以后忘记.

用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哈哈~

 

 


http://www.niftyadmin.cn/n/1345669.html

相关文章

8086算术运算类指令

算术运算指令 ①加法类指令 ②减法类指令 ③乘法指令 ④除法指令 ⑤BCD吗指令 一、加法类指令 首先我么们先看加法类指令三个&#xff08;add&#xff0c;adc&#xff0c;inc&#xff09; 1&#xff09;不带进位位的加法指令ADD add用来执行2个字节或2个字的相加操作&#xff0…

CListCtrl理解nItem 和nSubItem!!!

一直对nItem,nSubItem这两个关系不太清楚&#xff01;今天总算是明白了&#xff01;&#xff01; 以ListCtrl为例&#xff1a; 其中MFC对于其nItem 对应的实际上插入的每一行&#xff0c; 而nSubItem 对应的是插入的一行中对应的单元&#xff0c;或者说是对应这一行有几列的…

blender show normals

https://blenderartists.org/forum/showthread.php?193096-Blender-2-5-how-to-show-normals-in-viewport转载于:https://www.cnblogs.com/wantnon/p/7616552.html

Python协程-greenlet

greenlet Greenlet是python的一个C扩展&#xff0c;提供可自行调度的协程 当一个greenlet遇到IO操作&#xff0c;如访问网络、文件操作时&#xff0c;就自动切换到其他greenlet&#xff0c;等IO操作完成&#xff0c;再在适当的时间切换回来继续执行 为了更好使用协程来完成多任…

bzoj1937 [Shoi2004]Mst 最小生成树(KM)

Description Input 第一行为N、M&#xff0c;其中 表示顶点的数目&#xff0c; 表示边的数目。顶点的编号为1、2、3、……、N-1、N。接下来的M行&#xff0c;每行三个整数Ui&#xff0c;Vi&#xff0c;Wi&#xff0c;表示顶点Ui与Vi之间有一条边&#xff0c;其权值为Wi。所有…

Python协程-gevent

gevent greenlet已经实现了协程&#xff0c;但是这个需要人工切换&#xff0c;是不是觉得太麻烦了&#xff0c;不要捉急&#xff0c;python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent 其原理是当一个greenlet遇到IO(指的是input output 输入输出&#xff0c;…

深入理解MFC中的消息映射原理!!!

今天抽空再次看了一下深入浅出MFC&#xff0c;从中又学到了新的东西&#xff01; 时间有限&#xff0c;很晚了&#xff0c;简单写一下&#xff1a; MFC中消息的WinMain函数实际上是被编译器自己添加进去的&#xff0c;MFC中我们看不到WinMain函数&#xff01; 大概的代码如下…

JavaScript 框架------------AngularJS(下)

前 言 JRedu Android今天接着上次没有时间说完的AngularJS来接着讲。 一、 Android AngularJS中的服务1.1Service &#xff08;1&#xff09;内置服务&#xff1a; 要使用服务必须要把服务名通过controller的构造函数的参数注入进来&#xff01;&#xff01;&#xff01;系统内…