利用HOOK技术实现DLL远程进程注入

标签:
hookitccpp编程钩子注入dll注入 |
http://s12/middle/651cccf7gc8401d5a97db&690
MessageBox(NULL,”This is a messagebox from notepad.exe”,”hook”,MB_OK);
extern “C” __declspec(dllexport) LRESULT CALLBACK HookProc(int
nCode,WPARAM wParam,LPARAM lParam){
if(nCode<0)
return CallNextHookEx(hooker,nCode,wParam,lParam);
tagMSG* msg;
msg=(tagMSG*)lParam;
if(nCode==HC_ACTION &&
(msg->message==WM_CLOSE)){
if(handled==FALSE){
handled=TRUE;
MessageBox(NULL,”This is a messagebox from
notepad.exe”,”hook”,MB_OK);
}
UnhookWindowsHookEx(hooker);
msg->message=WM_NULL;
return CallNextHookEx(hooker,nCode,wParam,(LPARAM)msg);
}
return CallNextHookEx(hooker,nCode,wParam,lParam);
}
// notepadhook.cpp : Defines the entry point for the DLL
application.
//
#include “stdafx.h”
#include <stdio.h>
#include <stdlib.h>
HHOOK hooker;
HWND notepadhandle;
BOOL handled;
extern “C” __declspec(dllexport) LRESULT CALLBACK HookProc(int
nCode,WPARAM wParam,LPARAM lParam);
char* ConvertInttoChar(int i);
BOOL APIENTRY DllMain(HANDLE hModule,DWORD
ul_reason_for_call,LPVOID lpReserved){
if(ul_reason_for_call==DLL_PROCESS_ATTACH){
handled=FALSE;
notepadhandle=FindWindow(“Notepad”,NULL);
if(notepadhandle==NULL){
printf(“Notepad Not Found.\n”);
return TRUE;
}
hooker=SetWindowsHookEx(WH_GETMESSAGE,HookProc,(HINSTANCE)hModule,GetWindowThreadProcessId
if(hooker){
printf(“Hook Successfully.\nHookID:%d\n”,hooker);
}
else{
printf(“Hook Failed.\nError:%d\n”,GetLastError());
return TRUE;
}
PostMessage(notepadhandle,WM_CLOSE,0,0);
}
return TRUE;
}
extern “C” __declspec(dllexport) LRESULT CALLBACK HookProc(int
nCode,WPARAM wParam,LPARAM lParam){
if(nCode<0)
return CallNextHookEx(hooker,nCode,wParam,lParam);
tagMSG* msg;
msg=(tagMSG*)lParam;
if(nCode==HC_ACTION &&
(msg->message==WM_CLOSE)){
if(handled==FALSE){
handled=TRUE;
MessageBox(NULL,”This is a messagebox from
notepad.exe”,”hook”,MB_OK);
}
UnhookWindowsHookEx(hooker);
msg->message=WM_NULL;
return CallNextHookEx(hooker,nCode,wParam,(LPARAM)msg);
}
return CallNextHookEx(hooker,nCode,wParam,lParam);
}
http://s2/middle/651cccf7gfd2818054051&690
http://s8/middle/651cccf7gc84027def1a7&690
#include <stdio.h>
#include <windows.h>
int main(){
LoadLibrary(“notepadhook.dll”);
getchar();
return 1;
}
http://s12/middle/651cccf7gc840298ab60b&690
至此,我们的DLL注入已经完成了,但是还有一些问题。就算我们把所有的printf去掉,也把getchar去掉而改成Sleep,打开程序依然会有一个黑框,根本没办法做到隐蔽。作者经查阅资料得知这是因为编译器给EXE加上了某些参数,作者的解决办法是用RADASM编写一个一样功能的EXE:
http://s6/middle/651cccf7g7a6cd11d7655&690
.386
.model flat, stdcall
option casemap :none ;case sensitive
include windows.inc
include kernel32.inc
includelib kernel32.lib
assume cs:xCode
xCode segment
.data
xDllName db ’notepadhook.dll’,0
.code
start:
invoke LoadLibrary,offset xDllName
invoke Sleep,1000
invoke ExitProcess,NULL
end start