各位老师,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);
} 用sscanf转成数值 int adress = std::stoi("15166AAC",nullptr, 16); 有个简单的做法,但是可能需要c++11或者更高。 苏紫方璇 发表于 2022-4-24 19:41
用sscanf转成数值
老师,用sscanf转成什么类型的数值?谢谢了 only998 发表于 2022-4-24 19:58
int adress = std::stoi("15166AAC",nullptr, 16); 有个简单的做法,但是可能需要c++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; 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); only998 发表于 2022-4-24 20:17
首先void*表示任意类型的指针,指针实际上就是一个内存位置。其次 it是迭代器, *it表示这个迭代器的值, ...
谢谢老师,非常正确,已解决 感觉你还需要好好看看书呀。字符串和数字是内存中是不一样的。 小伙伴,您好:
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