之后我们使用DetourCreateProcessWithDll来让DLL注入到进程中,其实最开始用DetourSetDll程序设置程序import注入Dll,结果发生了黑屏图片显示不正常的问题,这个是因为修改了文件头,破坏了最初的拿图片数据的结构,所以只能动态去注入Hook
/
/
DllMain
glm::vec3 cameraPos
=
glm::vec3(
0.0f
,
0.0f
,
3.0f
);
glm::vec3 cameraFront
=
glm::vec3(
0.0f
,
0.0f
,
-
1.0f
);
glm::vec3 cameraUp
=
glm::vec3(
0.0f
,
1.0f
,
0.0f
);
float
fov
=
50.0f
;
typedef DWORD(__cdecl
*
pfnglfwGetKey)(DWORD p_windows, DWORD KeyValue);
pfnglfwGetKey m_glfwGetKey;
DWORD p_windows;
HMODULE hModule_EXE;
PVOID p_windows_HookPoint
=
NULL;
PVOID p_GetKey_HookPoint
=
NULL;
PVOID p_Setprojection
=
NULL;
PVOID p_Setview
=
NULL;
glm::mat4 projection;
glm::mat4 view;
VOID NAKED Get_p_windows()
{
STACK_FRAME_BEGIN
__asm {
mov p_windows, eax
}
STACK_FRAME_END
__asm {
push p_windows_HookPoint
ret
}
}
VOID NAKED prcessInPut()
{
STACK_FRAME_BEGIN
if
(m_glfwGetKey(p_windows, GLFW_KEY_W)
=
=
GLFW_PRESS)
{
cameraPos
+
=
cameraFront;
}
if
(m_glfwGetKey(p_windows, GLFW_KEY_S)
=
=
GLFW_PRESS)
{
cameraPos
-
=
cameraFront;
}
if
(m_glfwGetKey(p_windows, GLFW_KEY_A)
=
=
GLFW_PRESS)
{
cameraPos
-
=
glm::normalize(glm::cross(cameraFront, cameraUp));
}
if
(m_glfwGetKey(p_windows, GLFW_KEY_D)
=
=
GLFW_PRESS)
{
cameraPos
+
=
glm::normalize(glm::cross(cameraFront, cameraUp));
}
if
(m_glfwGetKey(p_windows, GLFW_KEY_R)
=
=
GLFW_PRESS)
{
fov
-
=
1.0
;
}
if
(m_glfwGetKey(p_windows, GLFW_KEY_T)
=
=
GLFW_PRESS)
{
fov
+
=
1.0f
;
}
view
=
glm::lookAt(cameraPos, cameraFront
+
cameraPos, cameraUp);
projection
=
glm::perspective(glm::radians(fov), (
float
)
800.0
/
(
float
)
600.0
,
0.1f
,
200.0f
);
STACK_FRAME_END
__asm {
push p_GetKey_HookPoint
ret
}
}
VOID NAKED Setprojection()
{
__asm {
mov ecx, offset projection
push p_Setprojection
ret
}
}
VOID NAKED Setview()
{
__asm
{
mov ecx, offset view
push p_Setview
ret
}
}
BOOL
DetourHook()
{
if
(DetourTransactionBegin()
=
=
NO_ERROR)
{
DetourAttach(&p_windows_HookPoint, Get_p_windows);
DetourAttach(&p_GetKey_HookPoint, prcessInPut);
DetourAttach(&p_Setprojection, Setprojection);
DetourAttach(&p_Setview, Setview);
if
(DetourTransactionCommit()
=
=
NO_ERROR)
{
return
TRUE;
}
}
return
FALSE;
}
BOOL
APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hModule_EXE
=
GetModuleHandle(NULL);
m_glfwGetKey
=
(pfnglfwGetKey)((DWORD)hModule_EXE
+
RVA_glfwGetKey);
p_windows_HookPoint
=
(PVOID)((DWORD)hModule_EXE
+
RVA_Get_p_windows_HookPoint);
p_GetKey_HookPoint
=
(PVOID)((DWORD)hModule_EXE
+
RVA_Key_HookPoint);
p_Setprojection
=
(PVOID)((DWORD)hModule_EXE
+
RVA_Setprojection_HookPoint);
p_Setview
=
(PVOID)((DWORD)hModule_EXE
+
RVA_SetView_HookPoint);
DetourHook();
break
;
case DLL_THREAD_ATTACH:
break
;
case DLL_THREAD_DETACH:
break
;
case DLL_PROCESS_DETACH:
break
;
}
return
TRUE;
}