ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

逆向 | 通过inlinehook opengl实现cs1.6透视

2022-08-14 23:00:40  阅读:175  来源: 互联网

标签:dwOldAddr opengl cs1.6 LPVOID PATCH LENGTH mode DWORD inlinehook


逆向 | 通过inlinehook opengl实现cs1.6透视

之前一直想弄没弄的,今天给弄了。
inlinehook的原理与上一篇文章基本相同。https://www.cnblogs.com/Mz1-rc/p/16586411.html

cs1.6可以是对d3d可以是opengl,先调成opengl,然后开始下面的操作。
主要就是hook glBegin这个函数,然后判断一下mode,对实体强行渲染一下,就可以了。

被注入的dll代码如下:

// inject_dll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <stdio.h>
#include <gl/glut.h>


DWORD g_dwOldAddr;         // 原始函数地址
DWORD g_dwNewAddr;         // Hook函数地址
DWORD g_dwHookFlag;     // 标志有没有被hook


#define PATCH_LENGTH 5

DWORD dwRetAddress;
BOOL setInlineHook(DWORD dwOldAddr, DWORD dwNewAddr){
	BOOL bRet = FALSE;
	dwRetAddress = dwOldAddr + PATCH_LENGTH;       // hook结束以后的返回地址
	BYTE byJmpCode[PATCH_LENGTH] = {0xe9};
	DWORD dwOldProtect;
	
	// 之前的字节码
	static BYTE byOriginalCode[PATCH_LENGTH] = {0};
	static BOOL bHookFlag = FALSE;

	// 测试用
	char buf[1024] = {0};

	
	// 1. 初始化byJmpCode
	memset(&byJmpCode[1], 0x90, PATCH_LENGTH-1);
	
	// 2. 存储跳转地址
	*(DWORD*)&byJmpCode[1] = (DWORD)dwNewAddr - (DWORD)dwOldAddr - 5;
	
	// 3. 备份被覆盖的code
	memcpy(byOriginalCode, (LPVOID)dwOldAddr, PATCH_LENGTH);
	

	// 4. 开始patch
	if (!bHookFlag)
	{
		// hook
		VirtualProtect((LPVOID)dwOldAddr,
			PATCH_LENGTH, PAGE_EXECUTE_READWRITE, &dwOldProtect);     // 这个是成功执行的

		// 好了它又没问题了,不知道咋回事之前会崩溃
		memcpy((LPVOID)dwOldAddr, byJmpCode, PATCH_LENGTH);     // 这里拷贝的时候有问题,会出现不可写的问题

		
		VirtualProtect((LPVOID)dwOldAddr, PATCH_LENGTH, dwOldProtect, 0);
		bHookFlag = TRUE;
		bRet = TRUE;
	}else{
		// 取消hook
		VirtualProtect((LPVOID)dwOldAddr,
			PATCH_LENGTH, PAGE_EXECUTE_READWRITE, &dwOldProtect);
		memcpy((LPVOID)dwOldAddr, byOriginalCode, PATCH_LENGTH);
		VirtualProtect((LPVOID)dwOldAddr, PATCH_LENGTH, dwOldProtect, 0);
		bHookFlag = FALSE;
		bRet = TRUE;
	}

	return bRet;
}

char szNewText[] = "Hook!";
void __declspec(naked) MyglBegin(GLenum mode){
	// GL_TRIANGLE_STRIP 0x0005
	// GL_TRIANGLE_FAN 0x0006
	__asm{
		// 1. 保存寄存器
		pushad;
		pushfd;
		// 2. 修改数据
		
		// 判断mode 原[esp+8] 现在的[esp+32+4+4]
		mov eax, dword ptr [esp+32+4+4];   // eax=mode
		cmp eax, 5;
		jz disable;
		cmp eax, 6;
		jz disable;
		jmp back_to_func;
	}
disable:
	// 调用glDisable
	glDisable(GL_DEPTH_TEST);
	__asm{

back_to_func:
		// 3. 恢复寄存器
		popfd;
		popad;
		// 4. 执行覆盖的代码
		mov edi, edi;
		push ebp;
		mov ebp, esp;
		// 5. 返回执行
		jmp dwRetAddress;
	}
}


/*
void WINAPI MyglBegin(GLenum mode)
{
	MessageBox(0,"获取到调用",0,0);
	if(mode==GL_TRIANGLE_STRIP||mode==GL_TRIANGLE_FAN)
	{
		glDisable(GL_DEPTH_TEST);
		MessageBox(0,"获取到调用",0,0);
	} 
	
	glBegin(mode);
}
*/


// 线程函数
DWORD WINAPI ThreadProc(LPVOID lpParameter){
	// 保存原始函数地址
	DWORD pOldFuncAddr = (DWORD)GetProcAddress(LoadLibrary("opengl32.dll"), "glBegin");
	//DWORD pOldFuncAddr = (DWORD)GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxA");
	char buf[1024] = {0};
	sprintf(buf, "获取到函数地址:%p ", pOldFuncAddr);
	MessageBox(0, buf, 0, 0);
	
	// 安装或者卸载HOOK
	BOOL ret;
	if (!g_dwHookFlag){
		ret = setInlineHook(pOldFuncAddr, (DWORD)MyglBegin);
		if (ret){
			MessageBox(0, "安装hook成功!", 0, 0);
		}else{
			MessageBox(0, "安装hook失败!", 0, 0);
		}
		
	}

	return 0;
}




BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch ( ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(NULL,0,
            (LPTHREAD_START_ROUTINE)ThreadProc,
            NULL, 0,NULL);//创建新线程执行代码
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
	}
    return TRUE;
}


标签:dwOldAddr,opengl,cs1.6,LPVOID,PATCH,LENGTH,mode,DWORD,inlinehook
来源: https://www.cnblogs.com/Mz1-rc/p/16586633.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有