吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1041|回复: 11
收起左侧

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

[复制链接]
jtwc 发表于 2022-4-24 19:30
本帖最后由 jtwc 于 2022-4-24 19:40 编辑

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

[C++] 纯文本查看 复制代码
#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[12];
        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或者更高。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

 楼主| jtwc 发表于 2022-4-24 19:59
 楼主| 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[12] = { 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[12] = { 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吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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