PVOID OriginAddr
=
0
;
void realHookThing()
{
printf(
"hello C#,I'm C++\n"
);
}
void __declspec(naked)MyTest()
{
__asm
{
call realHookThing;
mov ecx,
22b8h
;
jmp OriginAddr;
}
}
void showTest()
{
SYSTEM_INFO sysinfo
=
{
0
};
GetSystemInfo(&sysinfo);
char
*
p
=
(char
*
)sysinfo.lpMinimumApplicationAddress;
MEMORY_BASIC_INFORMATION meminfo
=
{
0
};
DWORD targetAddr
=
0
;
char DebugString[
1024
]
=
{
0
};
while
(p < sysinfo.lpMaximumApplicationAddress)
{
size_t size
=
VirtualQueryEx((HANDLE)
-
1
, p, &meminfo, sizeof(MEMORY_BASIC_INFORMATION));
if
(size !
=
sizeof(MEMORY_BASIC_INFORMATION))
break
;
if
(meminfo.Protect
=
=
PAGE_EXECUTE_READWRITE)
{
int
addr
=
(
int
)meminfo.BaseAddress;
for
(
int
i
=
0
; i < meminfo.RegionSize; i
+
+
)
{
if
(
*
(BYTE
*
)(addr
+
i)
=
=
0x55
&&
*
(BYTE
*
)(addr
+
i
+
1
)
=
=
0x8B
&&
*
(BYTE
*
)(addr
+
i
+
2
)
=
=
0xEC
&&
*
(BYTE
*
)(addr
+
i
+
3
)
=
=
0x83
&&
*
(BYTE
*
)(addr
+
i
+
4
)
=
=
0xEC
&&
*
(BYTE
*
)(addr
+
i
+
5
)
=
=
0x1C
&&
*
(BYTE
*
)(addr
+
i
+
6
)
=
=
0x33
&&
*
(BYTE
*
)(addr
+
i
+
7
)
=
=
0xC0
&&
*
(BYTE
*
)(addr
+
i
+
8
)
=
=
0x89
&&
*
(BYTE
*
)(addr
+
i
+
9
)
=
=
0x45
&&
*
(BYTE
*
)(addr
+
i
+
10
)
=
=
0xEC
&&
*
(BYTE
*
)(addr
+
i
+
11
)
=
=
0x89
&&
*
(BYTE
*
)(addr
+
i
+
12
)
=
=
0x45
&&
*
(BYTE
*
)(addr
+
i
+
13
)
=
=
0xE8
&&
*
(BYTE
*
)(addr
+
i
+
14
)
=
=
0x89
&&
*
(BYTE
*
)(addr
+
i
+
15
)
=
=
0x45
&&
*
(BYTE
*
)(addr
+
i
+
16
)
=
=
0xE4
&&
*
(BYTE
*
)(addr
+
i
+
17
)
=
=
0x89
&&
*
(BYTE
*
)(addr
+
i
+
18
)
=
=
0x4D
&&
*
(BYTE
*
)(addr
+
i
+
19
)
=
=
0xFC
)
{
targetAddr
=
addr
+
i;
break
;
}
}
}
p
+
=
meminfo.RegionSize;
if
(targetAddr)
break
;
}
sprintf_s(DebugString,
1024
,
"[+] : 0x%x\r\n"
, targetAddr);
OutputDebugStringA(DebugString);
if
(MH_Initialize() !
=
MH_OK)
{
return
;
}
/
/
Create a hook
for
MessageBoxW,
in
disabled state.
if
(MH_CreateHook((LPVOID)targetAddr, (LPVOID)MyTest, reinterpret_cast<LPVOID
*
>(&OriginAddr)) !
=
MH_OK)
{
return
;
}
if
(MH_EnableHook((LPVOID)targetAddr) !
=
MH_OK)
{
return
;
}
}
BOOL
APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
HANDLE hThread;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hThread
=
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)showTest, NULL, NULL, NULL);
CloseHandle(hThread);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break
;
}
return
TRUE;
}