jtwc 发表于 2022-4-24 19:30

各位老师,C++中如下情况该如何处理呢?

本帖最后由 jtwc 于 2022-4-24 19:40 编辑

各位老师,C++中如下情况:void* ncdz = (void*)str2;输出结果错误为0,改为void* ncdz = (void*)0x15166AAC;输出结果正确,该如何处理void* ncdz = (void*)str2;才能输出正确呢?谢谢了
源码如下:


#include<Windows.h>
#include<iostream>
#include<vector>
int main()
{
      double dwsunshineAddressValue = 0;
      HWND hWnd;
      hWnd = FindWindow(NULL, "窗口");
      GetWindowThreadProcessId(hWnd, &pid);

      //通过进程ID获取进程句柄
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
      char* str = "15166AAC";
      char* str1 = "0x";
      char str2;
      sprintf(str2, "%s%s", str1, str);
      cout << str2 << endl;
      void* ncdz = (void*)str2;
      //void* ncdz = (void*)0x15166AAC;
            
      if (FALSE == ReadProcessMemory(hProcess, ncdz, &dwsunshineAddressValue, sizeof(double), NULL))

      {
                //printf("读取静态地址.\n");

      }
               
      double a = dwsunshineAddressValue;
      printf("%.2f\n", a);
}

苏紫方璇 发表于 2022-4-24 19:41

用sscanf转成数值

only998 发表于 2022-4-24 19:58

int adress = std::stoi("15166AAC",nullptr, 16);    有个简单的做法,但是可能需要c++11或者更高。

jtwc 发表于 2022-4-24 19:59

苏紫方璇 发表于 2022-4-24 19:41
用sscanf转成数值

老师,用sscanf转成什么类型的数值?谢谢了

jtwc 发表于 2022-4-24 20:09

only998 发表于 2022-4-24 19:58
int adress = std::stoi("15166AAC",nullptr, 16);    有个简单的做法,但是可能需要c++11或者更高。

谢谢老师,非常真确,已解决

jtwc 发表于 2022-4-24 20:11

only998 发表于 2022-4-24 19:58
int adress = std::stoi("15166AAC",nullptr, 16);    有个简单的做法,但是可能需要c++11或者更高。

老师下面这种如何处理呢?谢谢了
代码:
SearchMemory(hProcess, (char*)"38 AF 40 FF 76 02 00 00", 0x410000, 0xFFFFFFFF, 30, ResultArray);
      for (vector<unsigned __int64>::iterator it = ResultArray.begin(); it != ResultArray.end(); it++)
      {
                printf("%x\n", *it);
      }

上面代码中*it的值为176FE164,如何把176FE164传给 void* ncdz,让void* ncdz= (void*)0x176FE164;

only998 发表于 2022-4-24 20:17

jtwc 发表于 2022-4-24 20:11
老师下面这种如何处理呢?谢谢了
代码:
SearchMemory(hProcess, (char*)"38 AF 40 FF 76 02 00 00", 0 ...

首先void*表示任意类型的指针,指针实际上就是一个内存位置。其次 it是迭代器, *it表示这个迭代器的值,这个迭代器的类型是 unsigned __int64   ,所以你只要void *adress = (void*)(*it);

jtwc 发表于 2022-4-24 20:29

only998 发表于 2022-4-24 20:17
首先void*表示任意类型的指针,指针实际上就是一个内存位置。其次 it是迭代器, *it表示这个迭代器的值, ...

谢谢老师,非常正确,已解决

DQQQQQ 发表于 2022-4-25 08:59

感觉你还需要好好看看书呀。字符串和数字是内存中是不一样的。

michaelgao 发表于 2022-4-26 10:46

小伙伴,您好:
1》void* ncdz = (void*)str2; 语句是将数组str2的地址赋值给ncdz,而您的目的是取得str2字符串的值,并将取得的值赋给ncdz.
2》str2里存的char字符的ascii码值,不是您要数值,所以需要做一次转换,即将字符串转成长整型数值。然后将改长整型数值作为地址赋给ncdz。
3》定义变量一般都要做初始化的,否则变量里存放随机内容。char str2 = { 0 };字符串数组是判断\0做结尾,如果不初始化,大概率会出现异常。


代码如下:
#include "stdafx.h"
#include<Windows.h>
#include<iostream>
#include<vector>
#include <ctype.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        double dwsunshineAddressValue = 0;
        HWND hWnd;
        DWORD pid;
        hWnd = FindWindow(NULL, "窗口");
        GetWindowThreadProcessId(hWnd, &pid);

        //通过进程ID获取进程句柄
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
        char* str = "15166AAC";
        char* str1 = "0x";
        char str2 = { 0 };
        sprintf(str2, "%s%s", str1, str);

        long addr_read = strtol(str2, &str, 16);

        cout << str2 << endl;
        void* ncdz = (void*)(addr_read);
        //void* ncdz1 = (void*)0x15166AAC;

        if (FALSE == ReadProcessMemory(hProcess, ncdz, &dwsunshineAddressValue, sizeof(double), NULL)){
                //printf("读取静态地址.\n");
        }

        double a = dwsunshineAddressValue;
        printf("%.2f\n", a);

        return 0;
}

顺祝您:学习进步、生活愉快。
页: [1] 2
查看完整版本: 各位老师,C++中如下情况该如何处理呢?