16,548
社区成员




#define UNICODE
#include <windows.h>
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib, "user32.lib")
typedef struct {
BYTE a;
DWORD b;
BYTE c;
BYTE d;
} HACK;
PROC m_pfnOrig;
//BYTE m_btNewBytes[8];
HACK hack;
BYTE m_btOldBytes[8];
HMODULE m_hMod;
bool shutok;
HHOOK hHook;
HINSTANCE hInstance;
BOOL Rehook()
{
// 修改原API函数执行代码的前8个字节,使它跳向我们的函数
if(m_pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
// 写入新的执行代码
::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,
&hack, sizeof(HACK), NULL);
::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);
return true;
}
return FALSE;
}
BOOL WriteBack()
{
if(m_pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect);
// 写入原来的执行代码
::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,
m_btOldBytes, sizeof(DWORD)*2, NULL);
::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);
return true;
}
return false;
}
BOOL _declspec(naked) MyCreateProcessW(
LPCWSTR lpApplicationName, // pointer to name of executable module
LPWSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCWSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
)
{
WriteBack();
if (::MessageBoxW(NULL, GetCommandLineW(), lpApplicationName, 4) != 7)
{
BOOL shutok = ::CreateProcess(
lpApplicationName, // pointer to name of executable module
lpCommandLine, // pointer to command line string
lpProcessAttributes, // pointer to process security attributes
lpThreadAttributes, // pointer to thread security attributes
bInheritHandles, // handle inheritance flag
CREATE_SUSPENDED, // creation flags
lpEnvironment, // pointer to new environment block
lpCurrentDirectory, // pointer to current directory name
lpStartupInfo, // pointer to STARTUPINFO
lpProcessInformation // pointer to PROCESS_INFORMATION
);
//HANDLE hProcess1=ProcessInfo.hProcess;
//RemoteLoadLibrary(hProcess1,"hook.dll");
//ResumeThread(ProcessInfo.hThread);
}
Rehook();
__asm
{
push shutok
pop eax
ret 4
}
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//BYTE btNewBytes[8]={0xB8,0xE0,0x18,0x00,0x10,0xFF,0xE0,0x00};
//memcpy(m_btNewBytes,btNewBytes,8);
if (ul_reason_for_call == DLL_PROCESS_ATTACH) //当DLL加载时产生此事件
{
hInstance = (HINSTANCE)hModule;
m_hMod = ::LoadLibrary(TEXT("kernel32.dll")); //取API地址
if (m_hMod == NULL)
{
m_pfnOrig=NULL;
return true;
}
m_pfnOrig = ::GetProcAddress(m_hMod, "CreateProcessW");
if (m_pfnOrig != NULL)
{
ZeroMemory(&hack, sizeof(HACK));
DWORD lpNewApi = (DWORD)MyCreateProcessW;
hack.a = 0xB8;
hack.b = lpNewApi;
hack.c = 0xFF;
hack.d = 0xE0;
DWORD oldProc;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery (m_pfnOrig,&mbi,sizeof(mbi));
::VirtualProtect( m_pfnOrig,8,PAGE_READWRITE,&oldProc);
memcpy(m_btOldBytes,m_pfnOrig,8);
::WriteProcessMemory(::GetCurrentProcess(), (void*)m_pfnOrig, &hack, sizeof(HACK), NULL);
::VirtualProtect( m_pfnOrig,8,mbi.Protect ,0);
return true;
}
}
if (ul_reason_for_call == DLL_PROCESS_DETACH) //当DLL加载时产生此事件
{
WriteBack();
return TRUE;
}
return TRUE;
}
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam,LPARAM lParam)
{
return (LRESULT)CallNextHookEx(hHook, nCode, wParam, lParam);
}
void __declspec(dllexport) InstallHook()
{
hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstance, NULL);
}
void __declspec(dllexport) UninstallHook()
{
UnhookWindowsHookEx(hHook);
WriteBack();
}
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;