[置顶] 植物大战僵尸外挂源码【C语言制作】

时间:2022-11-21 20:39:41

植物大战僵尸外挂源码【简单版】

下面是外挂源码,加★是关键部分,懂原理之后就一通百通了,下一个版本将推出【效果版】,敬请期待!

(PS:找基址可以用工具CE  找植物大战僵尸的基址是最简单的了 不会的可以在百度找教程)

作者 QQ 2783608988 by 奥利奥

/*头文件*/
#include <stdio.h>
#include <windows.h>

int main(void)
{

char Command;//命令
HWND hWnd; //窗口句柄
DWORD Pid;
HANDLE hProcess=0;

while(1)
{
getch();
system("cls");


plugin:
printf(" |—————————植物大战僵尸 游戏外挂———————— |\n\n"
"| —— C语言制作|\n\n"
" | 打开外挂 A 修改阳光 S |\n\n"
" | |\n\n"
" | 修改金钱 D 退出外挂 F |\n\n"
" | by 奥利奥 |\n\n"
" |————————————————————————————|\n");
// 显示主菜单

Command=getche(); // 从键盘输入数据赋值给变量

if ( Command == 'F' || Command == 'f' ) //选择【退出外挂】
{
exit(0); //结束程序( 退出外挂 )
}
else
{
if ( Command == 'A' || Command == 'a' )//选择【打开外挂】
{
hWnd = FindWindow(NULL,"植物大战僵尸中文版"); //★FindWindow靠名字来取得这个游戏程序的句柄

if( hWnd == NULL )
{
printf("\n未发现游戏进程 请先运行游戏\n");
}
else if ( hWnd != NULL )
{
GetWindowThreadProcessId(hWnd,&Pid); //★GetWindowThreadProcessId获取进程ID
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid); //★OpenProcess打开进程 获取所有操作权限

if ( hProcess == NULL )
{
printf("\n打开游戏进程失败\n");
}
else
{
printf("\n成功打开游戏进程\n");
}

}
}

if ( Command == 'S' || Command == 's' )//选择【修改阳光】
{
if ( hProcess == NULL )
{
printf("\n请先打开外挂\n");
}
else
{
DWORD sunny;
//阳光基址 006A9EC0 一级偏移 768 二级偏移 5560
DWORD Add1 =0x006A9EC0,Add2,Add3;
ReadProcessMemory (hProcess,(void *)Add1,&Add2,4,0); //★ReadProcessMemory读取数据 这个读的是一级偏移的还要读
Add1 = Add2 + 0x768 ;//阳光基址+一级偏移=一级基址
ReadProcessMemory(hProcess,(void *)Add1,&Add2,4,0);//读二级偏移
Add1 = Add2 + 0x5560 ;//一级基址+二级偏移
printf("\n您想多少阳光?:");
scanf_s("%d",&sunny);
DWORD res = WriteProcessMemory(hProcess, (void *)Add1, &sunny, 4, 0);//★WriteProcessMemory写入内存

if ( res == NULL )
{
printf("\n修改失败\n");
}
else
{
printf("\n修改成功\n");
}
goto plugin;//goto语句
}
}
if ( Command == 'D' || Command == 'd' )//选择【修改金钱】
{
if ( hProcess == NULL )
{
printf("\n请先打开外挂\n");
}
else
{
DWORD money;
DWORD Add1 = 0x006A9EC0 ,Add2,Add3;
//金币基址 006A9EC0 一级偏移 82C 二级偏移 28
ReadProcessMemory (hProcess,(void *)Add1,&Add2,4,0);//★ReadProcessMemory读取数据 这个读的是一级偏移的还要读
Add1 = Add2 + 0x82C ;
ReadProcessMemory(hProcess,(void *)Add1,&Add2,4,0); //★ReadProcessMemory读二级偏移
Add1 = Add2 + 0x28 ;
printf("\n您想多少金钱?(忽略个位数):");
scanf("%ld",&money);
DWORD res = WriteProcessMemory(hProcess,(void *)Add1,&money,4,0); //★WriteProcessMemory写入内存

if ( res == NULL )
{
printf("\n修改失败\n");
}
else
{
printf("\n修改成功\n");
}
}
}
}
}
return 0;
}