c - 编辑 DLL 代码。使用 ESC 启用游戏中的功能
问题描述
我在这里有一个代码,我想输入一个密钥来启用和禁用 WSAD
该功能直接进行,因此无法在游戏中编写。我想使用 ESC 键来激活和停用
帮助!请??
#include <windows.h>
HMODULE origLibrary;
WNDPROC wndProc;
typedef void (*_PushLetter) (int Letter);
_PushLetter PushLetter;
bool isOnline() {
return (*(DWORD*) 0x79CF28) == 8;
}
LRESULT CALLBACK HookedMessageDispatcher(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (!isOnline()) {
return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
}
switch (uMsg) {
case WM_KEYDOWN:
{
switch (wParam) {
case 0x57:
{
wParam = VK_UP;
break;
}
case 0x53:
{
wParam = VK_DOWN;
break;
}
case 0x41:
{
wParam = VK_LEFT;
break;
}
case 0x44:
{
wParam = VK_RIGHT;
break;
}
}
return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
}
default:
{
return CallWindowProc(wndProc, hWnd, uMsg, wParam, lParam);
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
HWND WINAPI HookedCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) {
HWND m_hWnd = CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
wndProc = (WNDPROC) GetWindowLongPtr(m_hWnd, GWL_WNDPROC);
SetWindowLongPtr(m_hWnd, GWL_WNDPROC, (LONG_PTR) HookedMessageDispatcher);
return m_hWnd;
}
/*_cdecl */void _stdcall HookedPushLetter(int Letter) {
if (!isOnline()) {
PushLetter(Letter);
return;
}
if (Letter == 'A' || Letter == 'a') {
return;
}
if (Letter == 'W' || Letter == 'w') {
return;
}
if (Letter == 'S' || Letter == 's') {
return;
}
if (Letter == 'D' || Letter == 'd') {
return;
}
PushLetter(Letter);
}
void HookCall(DWORD dwCallAddress, DWORD dwNewAddress) {
DWORD dwOldProtect, dwNewProtect, dwNewCall;
BYTE call[4];
dwNewCall = dwNewAddress - dwCallAddress - 5;
*(DWORD*) call = dwNewCall;
VirtualProtect((LPVOID) (dwCallAddress + 1), 4, PAGE_EXECUTE_WRITECOPY, &dwOldProtect);
dwCallAddress += 1;
*(DWORD*) dwCallAddress = *(DWORD*) & call;
VirtualProtect((LPVOID) (dwCallAddress), 5, dwOldProtect, &dwNewProtect);
}
static int InitMain() {
char systemDirectory[MAX_PATH];
GetSystemDirectory(systemDirectory, MAX_PATH);
lstrcat(systemDirectory, "\\ddraw.dll");
origLibrary = LoadLibrary(systemDirectory);
if (!origLibrary) {
exit(-1);
}
PushLetter = (_PushLetter) 0x458200;
HookCall(0x4CFB8A, (DWORD) & HookedPushLetter);
DWORD dwOldProtect, dwNewProtect, funcAddress, origAddress;
funcAddress = (DWORD) & HookedCreateWindowEx;
origAddress = (DWORD) ((int*) 0x5B8574);
VirtualProtect((LPVOID) origAddress, 4, PAGE_READWRITE, &dwOldProtect);
memcpy((LPVOID) origAddress, &funcAddress, 4);
VirtualProtect((LPVOID) origAddress, 4, dwOldProtect, &dwNewProtect);
return 1;
}
extern "C" {
__declspec (dllexport) HRESULT WINAPI DirectDrawCreate(void* lpGUID, void* lplp, void* pUnkOuter) {
FARPROC proc = GetProcAddress(origLibrary, "DirectDrawCreate");
if (!proc)
return E_INVALIDARG;
return ((HRESULT(WINAPI *)(void*, void*, void*))(DWORD) (proc))(lpGUID, lplp, pUnkOuter);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
switch (dwReason) {
case DLL_PROCESS_ATTACH:
return InitMain();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return 1;
}
}
我会等,提前谢谢
不幸的是,我没有通过
解决方案
有人?我相信对于那些了解主题的人知道如何解决
推荐阅读
- algorithm - 在节点图中,检测单个节点的破坏是否会导致两个不连通的图
- sql - How to PIVOT the next ROW_NUMBER()
- jekyll - Jekyll 3 not picking up custom collection in include
- tabulator - 制表符显示/隐藏组
- excel - EXCEL:具有多个标识符的 SUMIFS
- javascript - 什么是计算最后一行并将单元格数据添加到新空白行的代码
- postgresql - postgres 查询更新 json 字段
- java - Spring getOne(id) 问题 - 现有 id 即将出现 null
- c# - VS2017 C# 默认程序集
- django - 使用 Django 进行实时监控