core/CrazyDebugger.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Jul 15 08:00:26 2007 +0000 (2007-07-15)
changeset 1116 40cc5e9f0f1b
parent 1111 003e822e8a46
child 1231 17badaf66ce4
permissions -rw-r--r--
Removed strange debugging code
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     5  * ===============================================================
     6  *
     7  * This file is not open source and may not be copied without explicit
     8  * written permission of AlliedModders LLC.  This file may not be redistributed 
     9  * in whole or significant part.
    10  * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
    11  *
    12  * Version: $Id$
    13  */
    14 #if defined CRAZY_DEBUG
    15 #include "sm_globals.h"
    16 #include "sourcemm_api.h"
    17 #include "Tlhelp32.h"
    18 #include "LibrarySys.h"
    19 #include "minidump.h"
    20 
    21 BOOL
    22 WINAPI
    23 MiniDumpWriteDump2(
    24 				  IN HANDLE hProcess,
    25 				  IN DWORD ProcessId,
    26 				  IN HANDLE hFile,
    27 				  IN MINIDUMP_TYPE DumpType,
    28 				  IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
    29 				  IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
    30 				  IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
    31 				  )
    32 {
    33 	DumpType = (MINIDUMP_TYPE)((int)DumpType|MiniDumpWithFullMemory|MiniDumpWithHandleData);
    34 	return MiniDumpWriteDump(hProcess, ProcessId, hFile, DumpType, ExceptionParam, UserStreamParam, CallbackParam);
    35 }
    36 
    37 FARPROC WINAPI GetProcAddress2(HMODULE hModule, LPCSTR lpProcName)
    38 {
    39 	if (strcmp(lpProcName, "MiniDumpWriteDump") == 0)
    40 	{
    41 		return (FARPROC)MiniDumpWriteDump2;
    42 	}
    43 
    44 	return GetProcAddress(hModule, lpProcName);
    45 }
    46 
    47 class CrazyWindowsDebugger : public SMGlobalClass
    48 {
    49 public:
    50 	void OnSourceModAllInitialized()
    51 	{
    52 		HANDLE hModuleList = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
    53 		MODULEENTRY32 me32;
    54 
    55 		me32.dwSize = sizeof(MODULEENTRY32);
    56 
    57 		if (!Module32First(hModuleList, &me32))
    58 		{
    59 			Error("Could not initialize crazy debugger!");
    60 		}
    61 
    62 		bool found = false;
    63 
    64 		do
    65 		{
    66 			if (strcasecmp(me32.szModule, "steam.dll") == 0)
    67 			{
    68 				IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)me32.modBaseAddr;
    69 				if (dos->e_magic != IMAGE_DOS_SIGNATURE)
    70 				{
    71 					Error("[SM] Could not detect steam.dll with valid DOS signature");
    72 				}
    73 				char *base = (char *)dos;
    74 				IMAGE_NT_HEADERS *nt = (IMAGE_NT_HEADERS *)(base + dos->e_lfanew);
    75 				if (nt->Signature != IMAGE_NT_SIGNATURE)
    76 				{
    77 					Error("[SM] Could not detect steam.dll with valid NT signature");
    78 				}
    79 				IMAGE_IMPORT_DESCRIPTOR *desc = 
    80 					(IMAGE_IMPORT_DESCRIPTOR *)
    81 					(base + nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
    82 				if (base == (char *)desc)
    83 				{
    84 					Error("[SM] Could not find the steam.dll IAT");
    85 				}
    86 				while (desc->Name)
    87 				{
    88 					if (desc->FirstThunk != 0)
    89 					{
    90 						IMAGE_THUNK_DATA *data = (IMAGE_THUNK_DATA *)(base + desc->OriginalFirstThunk);
    91 						DWORD *iat = (DWORD *)(base + desc->FirstThunk);
    92 						while (data->u1.Function)
    93 						{
    94 							if ((data->u1.Ordinal & IMAGE_ORDINAL_FLAG32) != IMAGE_ORDINAL_FLAG32)
    95 							{
    96 								IMAGE_IMPORT_BY_NAME *import = (IMAGE_IMPORT_BY_NAME *)(base + data->u1.AddressOfData);
    97 								if (strcmp((char *)import->Name, "GetProcAddress") == 0)
    98 								{
    99 									DWORD oldprot, oldprot2;
   100 									VirtualProtect(iat, 4, PAGE_READWRITE, &oldprot);
   101 									*iat = (DWORD)GetProcAddress2;
   102 									VirtualProtect(iat, 4, oldprot, &oldprot2);
   103 									found = true;
   104 									goto _end;
   105 								}
   106 							}
   107 							data++;
   108 							iat++;
   109 						}
   110 					}
   111 					desc++;
   112 				}
   113 				break;
   114 			}
   115 		} while  (Module32Next(hModuleList, &me32));
   116 
   117 _end:
   118 
   119 		if (!found)
   120 		{
   121 			Error("Could not find steam.dll's GetProcAddress IAT entry");
   122 		}
   123 
   124 		CloseHandle(hModuleList);
   125 	}
   126 } s_CrazyDebugger;
   127 #endif