[经验分享]c++builder ide下(F9)和单独运行程序的区别,附赠-植物大战僵尸锁定阳光(代码)
今天研究点注入其它进程的东西,拿植物大战僵尸练手,做好后在ide下运行就可以,单独运行就不行
自己仔细检查了代码也没发现什么问题,后来想到了可能是程序权限的问题,后来把程序权限提升,问题搞定.
c++builder ide下(F9)和单独运行程序的区别,最起码有程序权限的问题,以后遇到这类问题的童鞋,可以提升权限试试
编译好的文件
植物大战僵尸锁定阳光程序文件
程序源代码
- C/C++ code
// h//---------------------------------------#ifndef MainFormFMH#define MainFormFMH//---------------------------------------#include <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>#include <Forms.hpp>#include <ExtCtrls.hpp>//---------------------------------------class TMainForm : public TForm{__published: // IDE-managed Components TButton *btnLock; TButton *btnAbout; TTimer *tmrSun; void __fastcall btnAboutClick(TObject *Sender); void __fastcall btnLockClick(TObject *Sender); void __fastcall tmrSunTimer(TObject *Sender);public: // User declarations __fastcall TMainForm(TComponent* Owner); __fastcall ~TMainForm();private: // User declarations void __fastcall SetProcessToken(HANDLE processH, const String &tokenName); DWORD __fastcall GetProcessID(const String &procName); DWORD mPID; HANDLE mPIDH; int mSun; int *mSunPtr; int mSunPtrAdd; bool mLock;};//---------------------------------------extern PACKAGE TMainForm *MainForm;//---------------------------------------#endif// cpp//---------------------------------------#include <vcl.h>#pragma hdrstop#include "MainFormFM.h"//---------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TMainForm *MainForm;//---------------------------------------__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner), mLock(false), mPID(0){}//---------------------------------------__fastcall TMainForm::~TMainForm(){ if (mLock) CloseHandle(mPIDH);}//---------------------------------------void __fastcall TMainForm::btnAboutClick(TObject *Sender){ ShowMessage(_T("锁定阳光 2011-10-30 cnhemiya@gmail.com"));}//---------------------------------------void __fastcall TMainForm::btnLockClick(TObject *Sender){ SetProcessToken(GetCurrentProcess(), SE_DEBUG_NAME); if (!mLock) { mPID = GetProcessID(_T("PlantsVsZombies.exe")); if (mPID == NULL) { ShowMessage(_T("植物大战僵尸进程没有找到!")); return; } mPIDH = OpenProcess(PROCESS_ALL_ACCESS , false, mPID); btnLock->Caption = _T("停止锁定"); mLock = true; mSunPtr = (int *)0x00FE8330; // 0x00FE8330 初始指针地址 ReadProcessMemory(mPIDH, mSunPtr, &mSunPtrAdd, 4, NULL); mSunPtr = (int *)(mSunPtrAdd + 0x5560); // 0x5560 偏移 } else { btnLock->Caption = _T("锁定阳光"); mLock = false; CloseHandle(mPIDH); mPID = 0; } tmrSun->Enabled = mLock;}//---------------------------------------void __fastcall TMainForm::tmrSunTimer(TObject *Sender){ ReadProcessMemory(mPIDH, mSunPtr, &mSun, 4, NULL); Caption = _T("锁定阳光 - ") + IntToStr(mSun); if (mSun < 9000) { mSun = 9999; WriteProcessMemory(mPIDH, mSunPtr, &mSun, 4, NULL); }}//---------------------------------------void __fastcall TMainForm::SetProcessToken(HANDLE processH, const String &tokenName){ HANDLE tokenH; TOKEN_PRIVILEGES tokenPs; OpenProcessToken(processH, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenH); LookupPrivilegeValue(NULL, tokenName.c_str(), &tokenPs.Privileges[0].Luid); tokenPs.PrivilegeCount = 1; tokenPs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(tokenH, false, &tokenPs, NULL, NULL, NULL);}//---------------------------------------DWORD __fastcall TMainForm::GetProcessID(const String &procName){ HANDLE snapHand; // 快照句柄 PROCESSENTRY32 process; // 进程结构 bool ret; // 是否找到进程标志 DWORD procID = 0; // 进程id snapHand = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); process.dwSize = sizeof(PROCESSENTRY32); ret = Process32First(snapHand, &process); // 遍历所有进程 while (ret) { if (procName == process.szExeFile) { procID = process.th32ProcessID; break; } ret = Process32Next(snapHand, &process); } CloseHandle(snapHand); // 关闭快照句柄 return procID;}
[解决办法]
有点意思。植物大战僵尸的阳光地址不是不固定么?
[解决办法]
没玩过这游戏, 支持下
[解决办法]
学习了
[解决办法]
推荐一个先。
[解决办法]
这段代码是用来修改一个正在运行的程序的内存内容吗?
[解决办法]
虽然不玩游戏,但代码还是要看看的
[解决办法]
支持,学习下
[解决办法]
好好好好好好好好好好好好好好好好好好好好好好好好好好好好好
[解决办法]
TMainForm::GetProcessID(&procName)
ReadProcessMemory(mPIDH, mSunPtr, &mSunPtrAdd, 4, NULL);
WriteProcessMemory(mPIDH, mSunPtr, &mSun, 4, NULL);
=========
没有干过在一个进程访问和修改另一个进程的内存的事情,就这么简单吗?
[解决办法]
hemiya如何找到这个偏移地址的?我一直是用CheatEngine来修改阳光,每次都要重新搜索。
[解决办法]
123456789
[解决办法]
什么代码啊
[解决办法]
赞一个!
[解决办法]
learning......
[解决办法]
学习中
[解决办法]
好......................
[解决办法]
只有阳光么??我给你添个金钱锁定得,呵呵.cpp.
- C/C++ code
#include <vcl.h>#pragma hdrstop#include <tlhelp32.h>#include <winbase.h>#include "Unit1.h"//---------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}//--------------------------------------- int baseAddress = 0x006A9EC0; //游戏内存基址 AnsiString processName = "PlantsVsZombie.exe"; //游戏进程名字int GetPidByProcessName(AnsiString AppName){HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; int AppPid = 0; pe.dwSize = sizeof(pe); BOOL bNext=Process32First(hSnap, &pe); while(bNext) { if(strcmp(pe.szExeFile,AppName.c_str())==0) { //strcpy(szBuffer, pe.szExeFile); //break; //CloseHandle(hSnap); //return true; AppPid = pe.th32ProcessID; CloseHandle(hSnap); return AppPid; } bNext=Process32Next(hSnap, &pe); } CloseHandle(hSnap); return AppPid;}//int ReadMemoryValue(int baseAddress,AnsiString processName){try{//DWORD dwBytesWritten;HANDLE hProcess = OpenProcess(PROCESS_VM_READ , false, GetPidByProcessName(processName));//byte buffer[4];int buffer;ReadProcessMemory(hProcess, (LPCVOID)baseAddress, &buffer, 4,NULL); //将制定内存中的值读入缓冲区CloseHandle(hProcess);//int valuse = 0;// for (int i = 0; i < 4; i++)// valuse += (int)buffer[i] << (i * 8);return buffer;//valuse;}catch(...){ return 0; }}// void WriteMemoryValue(int baseAddress, AnsiString processName, int value) {// DWORD dwBytesWritten; // unsigned char buffer[4];// for (int i = 0; i < 4; i++) // buffer[i] = (Byte)(value >> (8 * i)); //PROCESS_VM_WRITE HANDLE hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限 WriteProcessMemory(hProcess, (LPVOID)baseAddress,&value,4, NULL); CloseHandle(hProcess); } //void __fastcall TForm1::Button1Click(TObject *Sender){if(GetPidByProcessName(processName)==0 ){ ShowMessage("游戏没有运行");}else { if(Button1->Caption =="启用-阳光无限") { Timer1->Enabled = true; Button1->Caption = "关闭-阳光无限"; } else { Timer1->Enabled = false; Button1->Caption = "启用-阳光无限"; } }}//---------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender){if(GetPidByProcessName(processName)==0 ){ Timer1->Enabled = false; Button1->Caption = "启用-阳光无限"; return;}else{ int address = ReadMemoryValue(baseAddress,processName); //读取基址(该地址不会改变) address = address + 0x768; //获取2级地址 address = ReadMemoryValue(address,processName); address = address + 0x5560; //获取存放阳光数值的地址 WriteMemoryValue(address,processName,0x1869F); //写入数据到地址(0x1869F表示99999) }}//---------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender){if(GetPidByProcessName(processName)==0 ){ ShowMessage("游戏没有运行");}else { if(Button2->Caption =="启用-金钱无限") { Timer2->Enabled = true; Button2->Caption = "关闭-金钱无限"; } else { Timer2->Enabled = false; Button2->Caption = "启用-金钱无限"; } }}//---------------------------------------void __fastcall TForm1::Timer2Timer(TObject *Sender){if(GetPidByProcessName(processName)==0 ){ Timer2->Enabled = false; Button2->Caption = "启用-金钱无限"; return;}else{ int address = ReadMemoryValue(baseAddress,processName); //读取基址(该地址不会改变) address = address + 0x82C; //获取2级地址 address = ReadMemoryValue(address,processName); address = address + 0x28; //获取存放阳光数值的地址 WriteMemoryValue(address,processName,0x1869F); //写入数据到地址(0x1869F表示99999) }}//---------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender){if(GetPidByProcessName(processName)==0 ){ ShowMessage("游戏没有运行");}else { try{ Edit1->Text.ToInt(); } catch(...) { ShowMessage("输入的关卡数错误"); return; } int address = ReadMemoryValue(baseAddress,processName); // ShowMessage(address); //读取基址(该地址不会改变) address = address + 0x82C; //获取2级地址 address = ReadMemoryValue(address,processName); //ShowMessage(address); address = address + 0x24; //获取存放阳光数值的地址 WriteMemoryValue(address,processName,Edit1->Text.ToInt()); }}//---------------------------------------void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key){ if (Key != '\b') if(!(Key>='0' && Key<='9' )) { Key =0; }}//---------------------------------------
[解决办法]
学习了,顶起
[解决办法]
我这个是翻译得网上得,网上得原文是c#得,没有你厉害.
[解决办法]
zzb也玩大战僵尸啊。哈哈哈。
[解决办法]
[解决办法]
学习了,顶起!
[解决办法]
很抱歉~很抱歉,该文件提取码不存在。
[解决办法]
这么厉害,学习了
[解决办法]
这个一定要顶!!!
[解决办法]
[解决办法]
学习..............
[解决办法]
。。。。。额。
[解决办法]
不错,学学。
[解决办法]
看看先。。。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
关键在搜索地址的代码, 硬编码不通用
[解决办法]
看不懂
[解决办法]
[解决办法]
- Delphi(Pascal) code
ReadMem(nil,PChar('Plants vs. Zombies'),$006A9EC0,@iAddr,4 ); if iAddr <> 0 then begin ReadMem(nil, PChar('Plants vs. Zombies'),iAddr + $768,@iAddr2,4); if iAddr <> 0 then WriteMem(nil, PChar('Plants vs. Zombies'),iAddr2 + $5560,@iMoney,4) ; end;
[解决办法]
e,有没有大波僵尸的程序啊
想看大波僵尸
[解决办法]
Android 上的 Wave Launcher 程序的效果:
http://ultimatefaves.com/
[解决办法]
内存修改器
[解决办法]
有意思!
[解决办法]
看看 学习一下
------解决方案--------------------
看看 学习一下
[解决办法]
[解决办法]
学习了
[解决办法]
很有意思,值得学习。
[解决办法]
牛人这么多,我学了还有用武之地么?
[解决办法]
但Xe2 的firemonkey 看mac 用的, 依然是包好
[解决办法]
用ce更容易
[解决办法]
有点意思。植物大战僵尸的阳光地址不是不固定么?
[解决办法]
呵呵...有点意思
[解决办法]
不错,正要学这方面的东西
[解决办法]
不错哦..我是新人..要和你们多多学习哦..顶啦...呵呵..
[解决办法]
很哟帮助 谢谢分享
[解决办法]
好的,非常感谢分享,学习了
[解决办法]
学习。。。。
[解决办法]
学习学习
[解决办法]
什么意思啊
[解决办法]
mark 忙完再看看
[解决办法]
同事很热衷玩这个游戏,支持一下
[解决办法]
学习学习
[解决办法]
好贴 顶下
[解决办法]
这个好,有时间玩玩
[解决办法]
非常好,让我们学的很多!
[解决办法]
很牛X 看看 学习中
[解决办法]
mark 学习
[解决办法]
很多大牛啊,也学习下!
[解决办法]
学习了 mark
[解决办法]
谢谢分享~~~~
[解决办法]
精华啊,谢谢
[解决办法]
我玩过这个游戏,赞楼主1
[解决办法]
谢谢分享~~~
[解决办法]
学习了
[解决办法]
内存修改器