tft每日頭條

 > 生活

 > 植物大戰僵屍python詳細制作教程

植物大戰僵屍python詳細制作教程

生活 更新时间:2025-02-08 05:17:11

今天小編花點時間給大家講講植物大戰僵屍外挂教程,希望大家給點意見。

植物大戰僵屍python詳細制作教程(企業開發即程序員耗時30分鐘)1

植物大戰僵屍python詳細制作教程(企業開發即程序員耗時30分鐘)2

關于CE(Cheat Engine)的用法,以後有時間的話 會發表相關視頻教程。

根據查到指針永久基址 偏移地址 就可以獲得/設置 陽光值。所以我們可以通過打開遊戲進程,改寫進程内相應的内存就可以實現遊戲的修改。

現在直接上源代碼:

#include<stdio.h>

#include<windows.h>

#include<tchar.h>

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.修改陽光 ");

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

printf("------------------------------------------ ");

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("打開遊戲進程失敗 ");

}

else

{

printf("打開遊戲進程成功!! ");

}

}

else

{

printf("遊戲沒有運行,或者沒有使用管理員身份運行本外挂. ");

}

}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<stdio.h>

#include<windows.h>

#include<tchar.h>

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

#include"WG.h"

HWND hWnd; //窗口句柄

DWORD pid; //進程句柄

HANDLE hProcess = 0;

//陽光的基地址和偏移

DWORD ba_addr = 0x007794F8;//基地址

DWORD m_offset1 = 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);

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

*這裡相當于一個二級指針(加偏移地址)

*ReadProcessMemory函數 讀取相應進程的指定位置 指定大小的數據到緩沖區

*基址加偏移地址 為二級指針

*基址加偏移地址取内容 再加 偏移地址為一級指針 (這個指針就是指向了陽光值的内存單元)

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

//要修改的内存地址是(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 RELEASE"));

if (hWnd != 0)

{

GetWindowThreadProcessId(hWnd, &pid);

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打開進程,取得句柄

if (hProcess == 0)

{

return 0;

}

else

{

return 1;

}

}

else

{

return 0;

}

}

main.c

#include<Windows.h>

#include"WG.h"

#include<stdlib.h>

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 = hInstance; //實例句柄

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 //創建參數

);

//CreateWindow後 會産生幾個 非隊列消息 直接調用過程函數(重點)

ShowWindow(hwnd, iCmdShow);

UpdateWindow(hwnd);//(重點) UpdateWindow會 直接發送一個非隊列的 WM_PAINT消息 讓窗口繪制

//因為 WM_PAINT默認是在 隊列最後的 但是這裡在最後的話 就不好,一個窗口創建 後 ShowWindow後就應該立即顯示上面的文字

//所以調用UpdateWIndow 讓它立即繪制

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

*消息循環,操作系統 會把所有 消息 分配給 每個應用程序

* 所以每個應用程序都有一個消息隊列,GetMessage就是向當前程序的 消息隊列内獲取消息

*lpMsg第一個參數 用于存放當前獲取的消息

*hWnd需要獲取消息的 窗口句柄,為NULL時 獲取當前程序所有窗口的消息(必須屬于當前線程)

*wMsgFilterMin 指定獲取消息值的最小整數(消息其實就是整數)

*wMsgFilterMax 指定獲取小的最大值

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

while (GetMessage(&msg, NULL, 0, 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消息的wParam參數的值。如果由于調用PostQuitMessage函數而接收到WM_QUIT消息,此時WM_QUIT消息的wParam的值即是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,

*比如BN_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(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;

}

植物大戰僵屍python詳細制作教程(企業開發即程序員耗時30分鐘)3

獲取方式:

1.在你手機的右上角有【關注】選項,或點擊我的頭像,點擊關注!(關注我)

2.關注後,手機客戶端點擊我的主頁面,右上角有私信,請私信發我:編程

電腦已經設置好了關鍵詞自動回複,自動領取就好了!這幾天上萬個消息,真的回複不過來,所以回複的時候請注意關鍵詞!

其實做為一個開發者,有一個學習的氛圍跟一個交流圈子特别重要這裡請私信我“編程”不管你是小白還是大牛歡迎入住大家一起交流成長。小編會在裡面不定期分享幹貨源碼,包括我精心整理的一份c 零基礎教程。歡迎各位感興趣的的小夥伴。

學習思路:

植物大戰僵屍python詳細制作教程(企業開發即程序員耗時30分鐘)4

學習資料:

植物大戰僵屍python詳細制作教程(企業開發即程序員耗時30分鐘)5

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved