首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

[经验分享]c++builder ide下(F9)和单独运行程序的区别,附赠-植物大战僵尸锁定阳光(代码)解决方法

2012-02-09 
[经验分享]c++builder ide下(F9)和单独运行程序的区别,附赠-植物大战僵尸锁定阳光(代码)今天研究点注入其

[经验分享]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#得,没有你厉害.

探讨
引用:

只有阳光么??我给你添个金钱锁定得,呵呵.cpp.C/C++ code



会编程后都一个毛病,玩游戏爱自己研究挂。

[解决办法]
zzb也玩大战僵尸啊。哈哈哈。
[解决办法]
探讨
zzb也玩大战僵尸啊。哈哈哈。

[解决办法]
学习了,顶起!
[解决办法]
很抱歉~很抱歉,该文件提取码不存在。

[解决办法]
这么厉害,学习了
[解决办法]
这个一定要顶!!!
[解决办法]
探讨

引用:

很抱歉~很抱歉,该文件提取码不存在。

看15楼
http://115.com/file/cl7jaylz#

[解决办法]
学习..............
[解决办法]
。。。。。额。
[解决办法]
不错,学学。
[解决办法]
看看先。。。
[解决办法]

[解决办法]
探讨

引用:

这个一定要顶!!!

毛毛好久没看到了

[解决办法]
探讨

引用:

引用:

这个一定要顶!!!

毛毛好久没看到了


ddddd

[解决办法]
关键在搜索地址的代码, 硬编码不通用
[解决办法]
看不懂
[解决办法]
探讨
hemiya如何找到这个偏移地址的?我一直是用CheatEngine来修改阳光,每次都要重新搜索。

[解决办法]
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
[解决办法]
谢谢分享~~~
[解决办法]
学习了
[解决办法]
内存修改器

热点排行