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

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

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

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

/*			头文件			*/
#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(" |—————————植物大战僵尸 游戏外挂———————— |

"
				"|                                          —— C语言制作|

"
				" |                 打开外挂 A  修改阳光 S                 |

"
				" |                                                        |

"
				" |                 修改金钱 D  退出外挂 F                 |

"
				" |                                            by   奥利奥 |

"
				" |————————————————————————————|
");
	//                                 显示主菜单 

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

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

				if ( hProcess == NULL )
				{	
					printf("
打开游戏进程失败
");
				}
				else
				{
					printf("
成功打开游戏进程
");
				}
			
				}
			  }   
		   
			if ( Command == S || Command == s )		//选择【修改阳光】
			{
				if ( hProcess == NULL )
				{	
					printf("
请先打开外挂
");
				}			
			    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("
您想多少阳光?:");
				scanf_s("%d",&sunny);
				DWORD res = WriteProcessMemory(hProcess, (void *)Add1, &sunny, 4, 0);	//★WriteProcessMemory写入内存

					if ( res == NULL )
					{
						printf("
修改失败
");
					}
					else
					{
						printf("
修改成功
");	
					}
					goto plugin;		//goto语句
			}
			} 
			if ( Command == D ||  Command == d )		//选择【修改金钱】
			{
				if ( hProcess == NULL )
			     {
					   printf("
请先打开外挂
");
				  }
				 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("
您想多少金钱?(忽略个位数):");
				scanf("%ld",&money); 
				DWORD res = WriteProcessMemory(hProcess,(void *)Add1,&money,4,0); //★WriteProcessMemory写入内存

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


经验分享 程序员 微信小程序 职场和发展