雄韬股份,你可知道怎样用C语言制做单机手游脱机挂?,南造云子

今日小编花点时刻给咱们讲讲植物大战僵尸外挂教程,期望咱们给点定见。

关于CE(Cheat Engine)的用法,今后有时刻的话 会发表相刘淼麟关视频教程。

依据查到指针永久基址亡灵序曲+偏移地址 就能够获得/设置 阳光值。所以咱们能够经过翻开游戏进程,改写进程内相应的内存就能够完成游戏的修正。

现在直接上源代码:

#include

#include

#include

int main(void)

{

char input;

HWND hWnd; //窗口句柄

DWORD pid; //进程句柄

HANDLE hProcess = 0;

//阳光的基地址和偏移

DWORD ba_addr = 0x007794F8;//基地址

DWORD m_offset1 = 0x868;//偏移1

DWORD m_offset2 = 0x5578;//偏移2

printf(" O.翻开游戏进程 M.修正阳光 \n");

printf(" Q.退出外挂 \n");

printf("------------------------------------------\n");

while (1)

{

input = getchar();

if (input == 'O' || input == 'o')

{

hWnd = FindWindow(NULL, _T("Plants vs. Zombies 1.2.0.1073 RELEASE") );

if (hWnd != 0)

{

GetWindowThreadProcessId(hWnd, &pid);

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//翻开进程,获得句柄

if (hProcess == 0)

{

printf("翻开游戏进程失利\n");

}

else

{

printf("翻开游戏进程成功!!\n");

}

}

else

{

printf("游戏没有运转,或许没有使小学生优异日记大全用管理员身份运转本外挂.\n");

}

}if (input == 'M' || input == 'm')

{

if (hProcess == 0)

{

printf("请先翻开游戏进程");

}

else

{

DWORD m_tempadd;

DWORD YG;

//读取基址里边的数据(是一个指针)

ReadProcessMemory(hProcess, (LPVOID)ba_addr, &m_tempadd, 4, 0);

//基址加偏移地址1的数据(是一个指针)

ReadProcessMemory(hProcess, (LPVOID)(m_tempadd + m_offset1), &m_tempadd, 4, 0);

/**********************

*这儿相当于一个二级指针(加偏移地址)

*ReadProcessMemory函数 读取相应进程的指定方位 指定巨细的数据到缓冲区

*基址加偏移地址 为二级指针

*基址加偏移地址取内容 再加 偏移地址为一级指针 (这个指针便是指向了阳光值的内存单元)

******************/

//要修正的内存地址是(tempadd+offset4)

DWORD res = WriteProcessMemory(hProcess, (LPVOID)(m_tempadd+m_offset2), &YG, 4, 0);

if (res == 0)

{

printf("修正失利");

}

else

{

printf("修正成功");

}

}

}

if (input == 'Q' || input == 'q')

{

break;

}

}

return 0;

}

GUI版别修正器

WG.h

#pragma once

#include

#include

#include

extern HWND hWnd; //窗口句柄

extern DWORD pid; //进程句柄

extern HANDLE hProcess;

//阳光的基地址和偏移

extern DWORD ba_addr;//基地址

extern污相片 DWORD m_offset1;//偏移1

extern DWORD m_offset2;//偏移2

extern int openGameJc();//翻开游戏进程

extern int UpdateYG(int value);//修正阳划拳光

WG.c

#inclu雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子de"WG.h"

HWND hWnd; //窗口句柄

DWORD pid; //进程句柄

HANDLE hProcess = 0;

//阳光的基地址和偏移

DWORD ba_addr = 0x007794F8;//基地址

DWORD m_off雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子se平安福t1 = 0x868;//偏移1

DWORD m_offset2 = 0x5578;//偏移2

int UpdateYG(int value)

{

if (hProcess == 0)

{

return 0;

}

else

{

DWORD m_tempadd;

DWORD YG;

YG = (unsigned long)value;

//读取基址里边的数据(是一个指针)

ReadProcessMemory(hProcess, (LPVOID)ba_曹嘉馨addr, &m_tempadd, 4, 0);

//基址加偏移地址1的数据(是一个指针)

ReadProcessMemory(hProcess, (LPVOID)(m_tempadd + m_offset1), &m_tempadd, 4, 0);

/**********************

*这儿相当于一个二级指针(加雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子偏移地址)

*R游侠对战渠道eadProcessMemory函数 还珠格格第三部读取相应进程的指定方位 指定巨细的数据到缓冲区

*基址加偏移地址 为二级指针

*基址加偏移地址取内容 再加 偏移地址为一级指针 (这个指针便是指向了阳光值的内存单元)

******************/

//要修正的内存地址是(tempadd+offset4)

DWORD res = WriteProcessMemory(hProcess, (LPVOID)(m_tempadd + m_offset2), &YG, 4, 0);

if (res == 0)

{

return 0;

}

else

{

return 1;

}

}

}

int openGameJc()

{

hWnd = FindWindow(NULL, _T("Plants vs. Zombies 1.2.0.1073 RELEA雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子SE"));

if (hWnd != 0)

{

GetWindowThreadProcessId(hWnd, &pid);

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//翻开进程,获得句柄

if (hProcess == 0)

{

re牛黄上清片turn 0;

}

else

{

return 1;

}

}

else

{

return 0;

}

}

main.c

#include

#include"WG.h"

#include

HINSTANCE appInstance;

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)

{

//

appInstance = hInstance;

//

static TCHAR szAppName[] = TEXT("MyWindows");

HWND hwnd;

MSG msg;

WNDCLASS wndclass;

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;

wndclass.cbClsExtra = 0; //额定空间

wndclass.cbWndExtra = 0; //额定空间

wndclass.hInstance = hInstagolfnce; //实例句柄

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//白色

wndclass.lpszMenuName = NULL;//菜单

wndclass.lpszClassName = szAppName;//窗口类名

//注册窗口类

if (!RegisterClass(&wndclass))

{

MessageBox(NULL, TEXT("这个程序需求在 Windows NT 才干履行"), szAppName, MB_OK);

return 0;

};

//创立窗口 设置窗口特点

hwnd = CreateWindow(szAppName, //窗口类称号

TEXT("植物大战僵尸外挂v1.0"), //窗口标题

WS_OVERLAPPEDWINDOW, //窗口风格

200, //CW 创立窗口选项 初始 x坐标

200, //初始y坐标

300, //初始 x方向尺度

300, //初始y方向尺度

NULL, //父窗口句柄

NULL, //窗口菜单句柄

hInstance, //程序实例句柄

NULL //创h9建参数

);

//CreateWindow后 会发生几个 非行列音讯 直接调用进程函数(要点)

ShowWindow(hwnd, iCmdShow);

UpdateWindow(hwnd);//(要点) UpdateWindow会 直接发送一个非行列的 WM_PAINT音讯 让窗口制作

//因为 WM_PAINT默许是在 行列终究的 可是这儿在终究的话 就欠好,一个窗口创立 后 ShowWindow后就应该当即显现上面的文字

//所以调用UpdateWIndow 让它当即制作

/******************

*音讯循环,操作系统 会把一切 音讯 分配给 每个应用程序

* 所以每个应用程序都有一个音讯行列,GetMessage便是向当时程序的 音讯行列内获取音讯

*lpMsg第一个参数 用于寄存当时获取的音讯

*hWnd需求获取音讯的 窗口句柄,为NULL时 获取当时程序一切窗口的音讯(有必要归于当时线程)

*wMsgFilterMin 指定获取音讯值的最小整数(音讯其实便是整数)

*wMsgFilterMax 指定获取小的最大值

*********************/

while (GetMessage(&msg, NULL, 0雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子, 0))

{

TranslateMessage(&msg);//函数将虚拟键音讯 转换为字符音讯,

DispatchMessage(&msg);//函数分配一个音讯给窗口进程函数,实际上是给操作系统操作系统调用的

}

return msg.wParam;

/***************

*1、在WinMain主函数中,终究的回来值是msg.wParam,这个参数是传递给void PostQuitMessage(int nExitCode); 这个函数的参数nExitCode的。

* 2、nExitCode:指定应用程序退出代码。此值被用作音讯WM_QUIT的wParam参数。

*3、总归,当接收到一个WM_QUIT音讯时,程序椰子鸡就间断。这时,WinMain函数应退出应用程序,而且回来传递给WM_QUIT音讯的w叶子笛Param参数的值。假如因为调用PostQuitMessage函数而接收到WM_QUIT音讯,此刻WM_QUIT音讯的wPar雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子am的值便是PostQuiMessage函数的nExitCode的值。nExitCode一般为0。

***************/

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HWND hButton;

HWND hEdit;

HDC hdc; //Handle Device Context

HWND hbtnUpdate;//修正阳光

PAINTSTRUCT ps;

RECT rect;

LPTSTR result[128]; //成果

switch (uMsg)

{

case WM_PAINT:网盘搜搜

hdc = BeginPaint(hWnd, &ps);

GetClientRect(hWnd, &rect);

DrawText(hdc, TEXT("叫我涵涵"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hWnd, &ps);鱼香肉丝做法

break;

case WM_CREATE:

hEdit = (HWND)CreateWindow(TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT ,

120, 0,150, 20, hWnd, (HMENU)111, appInstance, NULL);

hButton = (HWND)CreateWindow(TEXT("Button"), //Button是预界说 窗体类

TEXT("翻开游戏进程"),

WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,

10, 10, 100, 50,

hWnd,

(HMENU)110, //(要点)这儿设置按钮id,可是 原本是设置菜单的 所以需求HMENU

appInstance,

NULL);

//修正阳光

hbtnUpdate = (HWND)CreateWindow(TEXT("Button"), //Button是预界说 窗体类

TEXT("修正阳光"),

WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,

120, 40, 150, 40,

hWnd,

(HMENU)112, 顾//(要点)这儿设置按钮id,可是 原本是设置菜单的 所以需求HMENU

appInstance,

NULL);

break;

/*******************

* 当用户点击菜单、按钮、下拉列表框等控件时分,

*会触发WM_COMMAND.LOWORD(wParam) 是控件或菜单或加快键的ID

*假如LOWORD(wParam) 是控件ID,HIWORD(wParam)是notification code,

*比方B头发少合适什么发型N_CLICKED, BN_DBLCLK等,标志用户对控件的操作,双击,单击

*lparam 是子窗体句柄

*********************/

case WM_COMMAND:

//按钮

if (LOWORD(wParam) == 112 && HIWORD(wParam)方太油烟机 == BN_CLICKED)

{

//依据父窗口句柄 以及 控件id, 获取 空间句柄,然后用GetWindowText获取 控件内的文本

GetWindowText(GetDlgItem(hWnd, 111), result, 128);

if (UpdateYG(_ttoi(result)) == 1)

{

MessageBox(hWnd, TEXT("修正成功"), TEXT("涵涵提示"), MB_OK);

}

else {

MessageBox雄韬股份,你可知道怎样用C言语制做单机手游脱机挂?,南造云子(hWnd, TEXT("修正失利"), TEXT("涵涵提示"), MB_OK);

}

}

if (LOWORD(wParam) == 110 && HIWORD(wParam) == BN_CLICKED)

{

if(openGameJc()==1){

MessageBox(hWnd, TEXT("敞开游戏进程成功"), TEXT("提示"), MB_OK);

}

else {

MessageBox(hWnd, TEXT("敞开游戏进失利"), TEXT("提示"), MB_OK);

}

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

/********成功退出 ****

****************

*用户经过点击关闭程序按钮后,音讯行列添加一条音讯WM_CLOSE,

*然后程序从音讯行列中取走WM_CLOSE,调用DestroyWindow(),

*音讯行列添加WM_DESTROY,应用程序再次取走,并调用PostQuitMessage(),

*终究得到WM_QUIT而使音讯循环退出,程序退出。

************/

default:

//咱们不想关怀的都用 默许处理方式

return DefWindowProc(hWnd, uMsg, wParam, lParam);

break;

}

return 0;

}

评论(0)