VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3563|回复: 19

[已解决]本人小白,刚学会简单的编程,望大神指点下

[复制链接]
13_avatar_middle
最佳答案
1 
在线会员 发表于 2021-3-14 02:07:16 | 显示全部楼层 |阅读模式
本帖最后由 小白学编程 于 2021-3-14 22:04 编辑

本人小白,刚学会简单的编程,望大神指点下
帝国时代2:高清版
https://dl.3dmgame.com/pc/30310.html

代码:
     //帝国时代2高清版
        HWND jubing = FindWindow(NULL, L"Age of Empires II: HD Edition");

        DWORD pid;
        GetWindowThreadProcessId(jubing, &pid);

        HANDLE hpro = 0;
        hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);


        int nSize = 0;
        DWORD resourcesPtr1 = 0;
        ReadProcessMemory(hpro, (void*)0x929254, &resourcesPtr1, sizeof(resourcesPtr1), NULL);
        //cout << "读取一级指针偏移" << (void*)resourcesPtr1 << endl;

        resourcesPtr1 = resourcesPtr1 + 0x10C;
        DWORD resourcesPtr2 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr1, &resourcesPtr2, sizeof(resourcesPtr1), NULL);
        //cout << "读取二级指针偏移" << (void*)resourcesPtr2 << endl;

        resourcesPtr2 = resourcesPtr2 + 0x0A8;
        DWORD resourcesPtr3 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr2, &resourcesPtr3, sizeof(resourcesPtr3), NULL);
        //cout << "读取三级指针偏移" << (void*)resourcesPtr3 << endl;

    resourcesPtr3 = resourcesPtr3 + 0x4;
        /*DWORD resourcesPtr4 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr3, &resourcesPtr4, sizeof(resourcesPtr4), NULL);*/
        cout << "读取4级指针偏移" << (void*)resourcesPtr3 << endl;  //

       
        /*resourcesPtr4 = resourcesPtr4 + 4;
        unsigned long foodPtr = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr4, &foodPtr, sizeof(foodPtr), NULL);
        cout << "读取食物" << (float*)&foodPtr << endl;*/

        /*resourcesPtr4 = resourcesPtr4 + 0;
        unsigned long woodPtr = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr4, &woodPtr, sizeof(woodPtr), NULL);
        cout << "读取木材" << *(float*)&woodPtr << endl;*/
        system("pause");
    return 0;
运行后,黑窗口显示的是十进制,哪里需要修改可以显示单浮点数,望大神解答小菜的迷惑,不胜感激
最佳答案
59_avatar_small
2021-3-18 18:53:16
没游戏只能你自己测试下了.
  1. #include<Windows.h>
  2. #include <stdio.h>


  3. //提权
  4. bool EnableDebugPrivilege()
  5. {
  6.         HANDLE hToken;
  7.         LUID sedebugnameValue;
  8.         TOKEN_PRIVILEGES tkp;
  9.         if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  10.         {
  11.                 return   FALSE;
  12.         }
  13.         if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
  14.         {
  15.                 CloseHandle(hToken);
  16.                 return false;
  17.         }
  18.         tkp.PrivilegeCount = 1;
  19.         tkp.Privileges[0].Luid = sedebugnameValue;
  20.         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  21.         if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
  22.         {
  23.                 CloseHandle(hToken);
  24.                 return false;
  25.         }
  26.         return true;
  27. }

  28. int main(void)
  29. {
  30.         //如需要,本进程提权invoke
  31.         //EnableDebugPrivilege()
  32.         //获取窗口句柄
  33.         HWND jubing = FindWindow(NULL, TEXT("Age of Empires II: HD Edition"));
  34.         //获取进程PID
  35.         DWORD pid;
  36.         GetWindowThreadProcessId(jubing, &pid);
  37.         //通过PID获取进程句柄
  38.         HANDLE hpro = 0;
  39.         hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

  40.         //开始读内存    [[[0x00929254]+0x10C]+0xA8]+0x4
  41.         DWORD dwAddress = 0x00929254;
  42.         DWORD dwReadedContent = 0;

  43.         //[0x00929254]  读出来的指针地址在dwReadedContent
  44.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  45.         //[[0x00929254]+0x10C] 读出来的指针地址在dwReadedContent
  46.         dwAddress = dwReadedContent + 0x10C;
  47.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  48.         //[[[0x00929254] + 0x10C] + 0xA8]  读出来的指针地址在dwReadedContent
  49.         dwAddress = dwReadedContent + 0xA8;
  50.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  51.         //拿到最后一个浮点数所在的地址
  52.         dwAddress = dwReadedContent + 0x4;
  53.         //定义一个浮点数接收它,你CE扫描选用的是4字节单精度,这里就定义float
  54.         float result;  
  55.         ReadProcessMemory(hpro, (void*)dwAddress, &result, 4, NULL);

  56.         printf("%f", result);
  57.         return 0;
  58. }
复制代码
11.jpg
222.jpg




上一篇:关于shellcode调用崩溃的问题
下一篇:怎样能让开机,就自动重启服务进程?
59_avatar_middle
最佳答案
1 
在线会员 发表于 2021-3-18 18:53:16 | 显示全部楼层    本楼为最佳答案   
bestAnswer
没游戏只能你自己测试下了.
  1. #include<Windows.h>
  2. #include <stdio.h>


  3. //提权
  4. bool EnableDebugPrivilege()
  5. {
  6.         HANDLE hToken;
  7.         LUID sedebugnameValue;
  8.         TOKEN_PRIVILEGES tkp;
  9.         if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  10.         {
  11.                 return   FALSE;
  12.         }
  13.         if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
  14.         {
  15.                 CloseHandle(hToken);
  16.                 return false;
  17.         }
  18.         tkp.PrivilegeCount = 1;
  19.         tkp.Privileges[0].Luid = sedebugnameValue;
  20.         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  21.         if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
  22.         {
  23.                 CloseHandle(hToken);
  24.                 return false;
  25.         }
  26.         return true;
  27. }

  28. int main(void)
  29. {
  30.         //如需要,本进程提权invoke
  31.         //EnableDebugPrivilege()
  32.         //获取窗口句柄
  33.         HWND jubing = FindWindow(NULL, TEXT("Age of Empires II: HD Edition"));
  34.         //获取进程PID
  35.         DWORD pid;
  36.         GetWindowThreadProcessId(jubing, &pid);
  37.         //通过PID获取进程句柄
  38.         HANDLE hpro = 0;
  39.         hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

  40.         //开始读内存    [[[0x00929254]+0x10C]+0xA8]+0x4
  41.         DWORD dwAddress = 0x00929254;
  42.         DWORD dwReadedContent = 0;

  43.         //[0x00929254]  读出来的指针地址在dwReadedContent
  44.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  45.         //[[0x00929254]+0x10C] 读出来的指针地址在dwReadedContent
  46.         dwAddress = dwReadedContent + 0x10C;
  47.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  48.         //[[[0x00929254] + 0x10C] + 0xA8]  读出来的指针地址在dwReadedContent
  49.         dwAddress = dwReadedContent + 0xA8;
  50.         ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

  51.         //拿到最后一个浮点数所在的地址
  52.         dwAddress = dwReadedContent + 0x4;
  53.         //定义一个浮点数接收它,你CE扫描选用的是4字节单精度,这里就定义float
  54.         float result;  
  55.         ReadProcessMemory(hpro, (void*)dwAddress, &result, 4, NULL);

  56.         printf("%f", result);
  57.         return 0;
  58. }
复制代码
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-20 16:35:42 | 显示全部楼层
本帖最后由 小白学编程 于 2021-3-20 16:37 编辑
ltt1986 发表于 2021-3-18 18:53
没游戏只能你自己测试下了.


#include<Windows.h>
#include <stdio.h>
#include <iostream>  //用cout输出加上头文件iostream,还要标准命名空间(std)中用  using namespace std;
//2021年3月20日16:35:28  记录学习外挂读出浮点的问题 多谢大佬指点  
//提权
//bool EnableDebugPrivilege()
//{
//        HANDLE hToken;
//        LUID sedebugnameValue;
//        TOKEN_PRIVILEGES tkp;
//        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
//        {
//                return FALSE;
//        }
//        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
//        {
//                CloseHandle(hToken);
//                return false;
//        }
//        tkp.PrivilegeCount = 1;
//        tkp.Privileges[0].Luid = sedebugnameValue;
//        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//        if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
//        {
//                CloseHandle(hToken);
//                return false;
//        }
//        return true;
//}
using namespace std; //标准命名空间(std)
int main(void)
{
        //如需要,本进程提权invoke
        //EnableDebugPrivilege()
        //获取窗口句柄
        HWND jubing = FindWindow(NULL, TEXT("Age of Empires II: HD Edition"));
        //获取进程PID
        DWORD pid;
        GetWindowThreadProcessId(jubing, &pid);
        //通过PID获取进程句柄
        HANDLE hpro = 0;
        hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

        //开始读内存&#160; &#160; [[[0x00929254]+0x10C]+0xA8]+0x4
        DWORD dwAddress = 0x00929254;
        DWORD dwReadedContent = 0;

        //[0x00929254]&#160;&#160;读出来的指针地址在dwReadedContent
        ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

        //[[0x00929254]+0x10C] 读出来的指针地址在dwReadedContent
        dwAddress = dwReadedContent + 0x10C;
        ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

        //[[[0x00929254] + 0x10C] + 0xA8]&#160;&#160;读出来的指针地址在dwReadedContent
        dwAddress = dwReadedContent + 0xA8;
        ReadProcessMemory(hpro, (void*)dwAddress, &dwReadedContent, 4, NULL);

        //拿到最后一个浮点数所在的地址
        dwAddress = dwReadedContent + 0x4;
        //定义一个浮点数接收它,你CE扫描选用的是4字节单精度,这里就定义float
        float result;
        ReadProcessMemory(hpro, (void*)dwAddress, &result, 4, NULL);  //读取木材
        cout << "读取木材" <<result<< endl;

        dwAddress = dwReadedContent + 0x0;
        float resrlt1;
        ReadProcessMemory(hpro, (void*)dwAddress, &resrlt1, 4, NULL);//读取食物
        cout << "读取食物" << resrlt1 << endl;
        dwAddress = dwReadedContent + 0x8;

        float resrl2;
        ReadProcessMemory(hpro, (void*)dwAddress, &resrl2, 4, NULL);//读取石头
        cout << "读取石头" << resrl2 << endl;

        dwAddress = dwReadedContent + 0xC;
        float resrlt3;
        ReadProcessMemory(hpro, (void*)dwAddress, &resrlt3, 4, NULL);//读取黄金
        cout << "读取黄金" << resrlt3 << endl;

        dwAddress = dwReadedContent + 0x2C;
        float resrlt4;
        ReadProcessMemory(hpro, (void*)dwAddress, &resrlt4, 4, NULL);//读取人口最小值
        cout << "读取人口最小值" << resrlt4 << endl;

        dwAddress = dwReadedContent + 0x10;
        float resrlt5;
        ReadProcessMemory(hpro, (void*)dwAddress, &resrlt5, 4, NULL);//读取人口最大值
        cout << "读取人口最大值" << resrlt5 << endl;
        //printf("木材=%f 食物=%f 石头=%f 黄金=%f 人口最小值=%f 人口最大值=%f \n\r", result, resrlt1, resrl2, resrlt3,resrlt4, resrlt5);
        //getchar();
        system("pause");
        return 0;
}
顺便问一下,提权的问题  我用的debug调试模式  是不是Release需要提权呢??
112.jpg
3332.jpg
59_avatar_middle
最佳答案
1 
在线会员 发表于 2021-3-21 11:42:22 | 显示全部楼层
提权跟编译什么模式没关系的,DEBUG就是编译出来的程序附带调试信息方便你自己调试的,Release下就是编译器做一些优化然后不带调试信息用来发布产品的时候了,用户也用不上调试信息是吧。
比如说你有时候对一个进程(你这就是游戏进程嘛)使用OpenProcess,ReadProcessMemory或者WriteProcessMemory会失败,然后你就会纠结了,明明我代码写对了怎么读不到数据呢或者我改写某个数据会失败呢,然后你就会调试看看返回值或者GetLastError()看一下,一看错误码打开进程失败或者读写失败,就是没权限,因为你写的程序和游戏程序大家都是Ring3下一样的权限,有的游戏可能不给你读写的权限,这时候你就会想把我自己写的程序调高下权限?这是一种解决办法
有时候你可能OpenProcess会直接失败,你会想我的进程不能打开你这个游戏进程?,那我在你的自己的进程的里面去读你的数据会不会就行了呢?然后注入就出现了,我把我自己写的程序做成一个DLL,然后注入到你的程序里面让你加载,那我不就是等于是你游戏的一部分了嘛,那我读写自己总可以了吧?
然后呢游戏厂商又开始想自己阻止你呢,因为你要干坏事嘛。。。可能他就会做一下其他事情,比如加个壳,关键代码都给你VM了,然后你不脱壳你就干不下去了是吧,或者你正面硬肛虚拟机。。。这还是你能附加调试器只是看不懂关键代码,也可能从源头上给你干死,连调试器都附加不上,可能直接去Ring0下HOOK NtOpenProcess,然后检测下要打开的进程是不是我自己?如果是我自己就直接给你返回错误,这时候你连打开进程都做不到了对不对,然后你就要去Ring0下跟他干,这就开始攻防了。。。不扯下去了大概你懂了把?
06_avatar_middle
最佳答案
0 
在线会员 发表于 2021-3-14 02:17:43 来自手机 | 显示全部楼层
完全看不懂
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-14 02:50:24 | 显示全部楼层
你读取得是哪个得进程,
ce扫描出来得是不是基地址,基地址在不会变的,你这是向写游戏外挂得前奏,
这是当初写得植物大战僵尸得部分读取进程得源码 参考一下 会有帮助
本人小白,刚学会简单的编程,望大神指点下

vvoid C植物大战僵尸辅助Dlg::OnBnClickedButton1()
{
        // TODO:  在此添加控件通知处理程序代码
        UpdateData(TRUE);
        DWORD dwPid = FindGageProcessIdByWndTitle(_T("Counter-Strike"));
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        if (!hProcess)
        {
                MessageBox(_T("游戏进程打开失败"), NULL, 0);
                return;

        }
        //计算阳光的基地址  第一次计算
        //阳光基地址=007794f8+868+5578=等于阳光基地址
        //            025069BC+7c+04+160=人物血量

        DWORD dwTemp = 0;
        if (!ReadProcessMemory(hProcess, (LPCVOID)0x025069BC, (LPVOID)&dwTemp, sizeof(DWORD), &dwPid))
        {
                MessageBox(_T("打开CS游戏进程读取失败1"), NULL, 0);
                CloseHandle(hProcess);
                return;

        }
        //加上偏移868第二次读取进程内存
         dwTemp += 0x7c;
        if (!ReadProcessMemory(hProcess,//目标进程句柄
                (LPCVOID)dwTemp,//目标进程地址
                (LPVOID)&dwTemp, //本地存储地址
                sizeof(DWORD),//读取的字节数
                &dwPid//实际传入的字节数,
                ))
        {
                MessageBox(_T("游戏进程读取失败2"), NULL, 0);
                CloseHandle(hProcess);
                return;

        }
        dwTemp += 0x04;
        if (!ReadProcessMemory(hProcess,//目标进程句柄
                (LPCVOID)dwTemp,//目标进程地址
                (LPVOID)&dwTemp, //本地存储地址
                sizeof(DWORD),//读取的字节数
                &dwPid//实际传入的字节数,
                ))
        {
                MessageBox(_T("游戏进程读取失败2"), NULL, 0);
                CloseHandle(hProcess);
                return;

        }
        float dwSunm = 500;
        dwTemp += 0x160;//此处犯过错,因为没有写成16进制导致,无法写入
        DWORD dwLenght = 0;
        //BOOL WriteProcessMemory(
        //HANDLE hProcess,已经被打开的进程句柄,该句柄在172号中被打开
                //LPVOID lpBaseAddress,写入内存地址
                //LPVOID lpBuffer,写入的数据
                //DWORD nSize,写入的字节数大小
                //LPDWORD lpNumberOfBytesWritten返回值,非0值表示成功可为空
                //);
        if (!::WriteProcessMemory(hProcess,
                (LPVOID)dwTemp,
                &dwSunm,
                sizeof(float),
                NULL))
        {

                MessageBox(_T("游戏进程写入失败"), NULL, 0);
                CloseHandle(hProcess);
                return;

        }

}
04_avatar_middle
最佳答案
22 
online_vip 发表于 2021-3-14 11:06:29 | 显示全部楼层
不知道你是直接运行生成出来的程序还是调试运行的,如果是前者你少了进程提权,估计是毛也读不出来一根,如果是后者那就继续往下看,      
        DWORD add_sub = 0x00929254;
        DWORD readx = 0;
        ReadProcessMemory(hpro, (float*)add_sub, &readx, 4, 0);
        add_sub = readx + 0x10C;
        ReadProcessMemory(hpro, (float*)add_sub, &readx, 4, 0); //读出基址+偏移768
        add_sub = readx + 0xA8;
        ReadProcessMemory(hpro, (float*)add_sub, &readx, 4, 0);
        add_sub = readx + 0x4;
        ReadProcessMemory(hpro, (float*)add_sub, &readx, 4, 0);
        add_sub =(float)readx;        
        printf("%d \n", add_sub);  //printf("%f \n", add_sub); 输出是0  

这段代码有很大问题,ReadProcessMemory第二个参数是内存地址,第三个参数是从第二个参数这个内存地址读取出来的内容,(float*)add_sub应该改成(void*)add_sub更好一些,add_sub =(float)readx;     这个我不知道你的编译器是怎么让你通过编译的,数据类型都不匹配,printf("%d \n", add_sub);%d是整数,%f才是float类型,写这样的代码最好是把每个API的返回值都取出来判断下这个API是不是执行成功了
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-14 14:21:30 | 显示全部楼层
wl1383838438 发表于 2021-3-14 02:50
你读取得是哪个得进程,
ce扫描出来得是不是基地址,基地址在不会变的,你这是向写游戏外挂得前奏,
这是 ...

//帝国时代2高清版
        HWND jubing = FindWindow(NULL, L"Age of Empires II: HD Edition");

        DWORD pid;
        GetWindowThreadProcessId(jubing, &pid);

        HANDLE hpro = 0;
        hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
       

        DWORD add_sub = 0x00929254;
        DWORD  readx = 0;
        ReadProcessMemory(hpro, (void*)add_sub, &readx, sizeof(DWORD), &pid);
        add_sub = readx +0x10C;
        ReadProcessMemory(hpro, (void*)add_sub, &readx, sizeof(DWORD), &pid);
        add_sub = readx + 0xA8;
        ReadProcessMemory(hpro, (void*)add_sub, &readx, sizeof(DWORD), &pid);
        add_sub = readx + 0x04;
        ReadProcessMemory(hpro, (void*)add_sub, &readx, sizeof(DWORD), &pid);
        add_sub =(float) readx;//读取出来是:420516320.000000转换是191091EC  add_sub =(float)是1140457472.000000 接近数据
        printf("%f \n", (float)add_sub);
        system("pause");
    return 0;
谢谢你啊 植物大战我读出来了  这个很困惑,读取出来的数据格式不一样
112.jpg
223.jpg
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-14 14:23:07 | 显示全部楼层
xiao14116 发表于 2021-3-14 11:06
不知道你是直接运行生成出来的程序还是调试运行的,如果是前者你少了进程提权,估计是毛也读不出来一根, ...

谢谢你指点 ,你看下面读取的数据还是不对
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-14 15:06:58 | 显示全部楼层
小白学编程 发表于 2021-3-14 14:21
//帝国时代2高清版
        HWND jubing = FindWindow(NULL, L"Age of Empires II: HD Edition");

把游戏 打包过来 我试试
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-14 16:24:36 | 显示全部楼层
本帖最后由 小白学编程 于 2021-3-14 16:39 编辑
wl1383838438 发表于 2021-3-14 15:06
把游戏 打包过来 我试试


链接:https://dl.3dmgame.com/pc/30310.html  3DM下来的 825 MB
解压就能玩,拿来练练手 遇到难题了 就想把读取出来   

就是想读出来的数据格式是正确的 比如ce浮点数是500 游戏里面也是500 但这个数据是浮点类型   printf读出来不是浮点类型 不知道在哪里修改
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-14 17:51:39 | 显示全部楼层
小白学编程 发表于 2021-3-14 16:24
链接:https://dl.3dmgame.com/pc/30310.html  3DM下来的 825 MB
解压就能玩,拿来练练手 遇到难题了  ...

https://www.bilibili.com/video/BV124411X74v?p=2
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-14 22:01:09 | 显示全部楼层
wl1383838438 发表于 2021-3-14 17:51
https://www.bilibili.com/video/BV124411X74v?p=2

//帝国时代2高清版
        HWND jubing = FindWindow(NULL, L"Age of Empires II: HD Edition");

        DWORD pid;
        GetWindowThreadProcessId(jubing, &pid);

        HANDLE hpro = 0;
        hpro = OpenProcess(PROCESS_ALL_ACCESS, false, pid);


        int nSize = 0;
        DWORD resourcesPtr1 = 0;
        ReadProcessMemory(hpro, (void*)0x929254, &resourcesPtr1, sizeof(resourcesPtr1), NULL);
        //cout << "读取一级指针偏移" << (void*)resourcesPtr1 << endl;

        resourcesPtr1 = resourcesPtr1 + 0x10C;
        DWORD resourcesPtr2 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr1, &resourcesPtr2, sizeof(resourcesPtr1), NULL);
        //cout << "读取二级指针偏移" << (void*)resourcesPtr2 << endl;

        resourcesPtr2 = resourcesPtr2 + 0x0A8;
        DWORD resourcesPtr3 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr2, &resourcesPtr3, sizeof(resourcesPtr3), NULL);
        //cout << "读取三级指针偏移" << (void*)resourcesPtr3 << endl;

    resourcesPtr3 = resourcesPtr3 + 0x4;
        /*DWORD resourcesPtr4 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr3, &resourcesPtr4, sizeof(resourcesPtr4), NULL);*/
        cout << "读取4级指针偏移" << (void*)resourcesPtr3 << endl;  //


下面这一行读出的是动态地址,效果还是不行
/*resourcesPtr4 = resourcesPtr4 + 0;
        unsigned long woodPtr = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr4, &woodPtr, sizeof(woodPtr), NULL);
        cout << "读取木材" << *(float*)&woodPtr << endl;*/   
5555.jpg
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-14 23:46:21 | 显示全部楼层
小白学编程 发表于 2021-3-14 22:01
//帝国时代2高清版
        HWND jubing = FindWindow(NULL, L"Age of Empires II: HD Edition");

我下午大概找了一下  !我不知道你想要什么效果,  木材 金钱食物得地址都追到了,其他的木有详细看!要不我给你几个写挂得教材吧!你在群里吗?
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-15 01:03:46 | 显示全部楼层
本帖最后由 小白学编程 于 2021-3-15 01:16 编辑
wl1383838438 发表于 2021-3-14 23:46
我下午大概找了一下  !我不知道你想要什么效果,  木材 金钱食物得地址都追到了,其他的木有详细看!要 ...



00929254+10C+A8+4  木材
00929254+10C+A8+0  食物
00929254+10C+A8+8 石头
00929254+10C+A8+C 黄金
效果就是打印出来数据 就行      和ce浮点数(float或者double都可以)一样的效果就行   
我读取出来是整数,不是浮点类型  比如ce单精度浮点是500   游戏也是500  我打印出来是一行数字

resourcesPtr3 = resourcesPtr3 + 0x4;
        /*DWORD resourcesPtr4 = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr3, &resourcesPtr4, sizeof(resourcesPtr4), NULL);*/
        cout << "读取4级指针偏移" << (void*)resourcesPtr3 << endl;  //

        
        /*resourcesPtr4 = resourcesPtr4 + 4;
        unsigned long foodPtr = 0;
        ReadProcessMemory(hpro, (void*)resourcesPtr4, &foodPtr, sizeof(foodPtr), NULL);
        cout << "读取食物" << (float*)&foodPtr << endl;*/
我没在群里面 ,刚加入vc驿站
比方说读取木材或者食物 500
黑窗口也是500  或者mfc编辑框也能读出500  就这个效果  没其他要求   
小菜技术有限,大佬解决了  积分送上,感激不尽
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-15 11:17:24 | 显示全部楼层
小白学编程 发表于 2021-3-15 01:03
00929254+10C+A8+4  木材
00929254+10C+A8+0  食物
00929254+10C+A8+8 石头

单精度  双精度  单浮点  双浮点 试试吧,我也木有输出国  一般都是找的基地址直接mfc写button直接写进去!
62_avatar_middle
最佳答案
0 
在线会员 发表于 2021-3-18 16:48:02 来自手机 | 显示全部楼层
这是在搞游戏内存挂
37_avatar_middle
最佳答案
1 
在线会员 发表于 2021-3-19 23:27:58 | 显示全部楼层
都是高手1111
13_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2021-3-20 18:33:12 | 显示全部楼层
本帖最后由 小白学编程 于 2021-3-20 18:38 编辑
wl1383838438 发表于 2021-3-14 02:50
你读取得是哪个得进程,
ce扫描出来得是不是基地址,基地址在不会变的,你这是向写游戏外挂得前奏,
这是 ...

我的问题解决了 ,好高兴 MFC文本框也可以加入定时器刷新读取内存数据
if (m_b_cd)
        {
                TRACE("1\n");
                //禁用CD功能 00487296 0x90,0x90
                buf[0]=0x90;
                buf[1]=0x90;

        }else
        {
                //TRACE("0\n");
                //启用CD功能  00487296 0x7e,0x14
                buf[0]=0x7e;
                buf[1]=0x14;

        }
        WriteProcessMemory(hp,(LPVOID)0x00487296,buf,sizeof(buf),&bywrite);
植物大战 CD一句话解决,你写的太复杂了
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2021-3-21 01:10:20 | 显示全部楼层
小白学编程 发表于 2021-3-20 18:33
我的问题解决了 ,好高兴 MFC文本框也可以加入定时器刷新读取内存数据
if (m_b_cd)
        {

本人小白,刚学会简单的编程,望大神指点下
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-28 13:24

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表