0

このプログラムは開始時には機能しますが、いくつかのループの後で問題が発生します

ReadProcessMemory に問題があります。それは私のプログラムの最初に機能し、大きな文字列を読み取りますが、値を正しく更新しなくなります。たとえば、以前の文字列を保持し、プログラムの残りの部分でその文字列を使用するか、プログラムをシャットダウンするまで文字列に何もありません。これは、最初の 2 回が機能した後、ランダムに発生します。基本アドレスには、ゲーム内のホバー効果によるアイテムのテキスト文字列が含まれます。ただし、 readprocessmemory は数回後に動作を停止したようで、チートエンジンを介してアドレスがまだ正しい値を更新していることを再確認しましたが、プログラムで正しく更新されていません。コードの書き方が悪いことはわかっているので、ベクターなどを使用する必要があります...

ここで問題が発生します。

while(temp.size() < 150 ){
do{
//  memset(&buffer[0], 0, sizeof(buffer));
    ReadProcessMemory(hProcHandle, (LPCVOID)myaddr, &buffer, sizeof(buffer), NULL);
    temp = std::string((char*)buffer);
}
while(temp == previous);        
std:: cout << temp.size() << std::endl;
}

上記のコードは以前はループではありませんでした。新しい値になるかnullでなくなるまで再度呼び出してみましたが、プログラムが不正な値で動作を停止すると、何度呼び出してもループに陥ったままになりますが、同じチート エンジンのアドレスが同時に更新されているので、再確認しました。このループの主な問題は、readprocessmemory が以前の呼び出しと同じ値を保持し続け、プログラムをシャットダウンするまでそのままになることです。これが実行されているのと同時にゲーム内でアドレスが更新されています。

#include <iostream>
#include <Windows.h>
#include <string>
#include <ctime> 
#include <sstream>
#include <algorithm>
#include <vector>
DWORD ariaBase = 0x400000 + 0x009B5A20;


std::string teatime[] = {" + 5 E"," + 6 Acc"," + 5 Acc"," + 6  Acc"," + 5  Acc"," + 7 Crit"," + 6 Damage"," + 5 Damage"," + 4 Damage"," + 3 Crit"};
unsigned char* buffer[800] = {0};
std::string temp = "";
std::string previous = "";
int myaddr = 0;
bool match[5];
DWORD aOffset[] = {0x724, 0x37C, 0x0, 0xAC, 0x50};
int count = 0;
std::vector<std::string> stats;
bool statsFound = false;


void WriteToMemory(HANDLE hProcHandle){ 

stats.clear();
temp = "";


while(temp.size() < 150 ){
    do{
    //  memset(&buffer[0], 0, sizeof(buffer));
        ReadProcessMemory(hProcHandle, (LPCVOID)myaddr, &buffer, sizeof(buffer), NULL);
        temp = std::string((char*)buffer);
    }
    while(temp == previous);        
    std:: cout << temp.size() << std::endl;
}
previous = temp;
std::replace( temp.begin(), temp.end(),(char)'\\', '*');
stats = findStats(temp);

//for( std::vector<std::string>::const_iterator i = stats.begin(); i != stats.end(); ++i)std::cout << *i << ' ' << std::endl;

}


int main(){         
            ...code...
            ...code...
            ...code...
            ...code...
            while(statsFound == false){
                round++;
            checkItem();
            Sleep(2000);
            WriteToMemory(hProcHandle);
            std::cout << round << std::endl;    
            for( std::vector<std::string>::const_iterator i = stats.begin(); i != stats.end(); ++i)std::cout << *i << ' ' << std::endl;

                for(int i = 0; i < stats.size();i++){
                    for(int j = 0; j < 10;j++){
                        if(("Identified Attribute:" + teatime[j]) == stats[i])match[i] = true; 
                    }

                }
                count = 0;
                for(int i = 0; i < stats.size();i++){
                    if(match[i] != true)statsFound = false;
                    else count++;

                    if(count == stats.size())statsFound = true;

                }
                match[0] = false;
                match[1] = false;
                match[2] = false;
                match[3] = false;

                if(statsFound == false)MouseStart();
            }
            ...code...
            ...code...
            ...code...

}
4

1 に答える 1

0

データの読み取り元であるターゲット プロセスのメモリにあるものを教えてください。GetLastError関数について聞いたことがありますか? ReadProcessMemory が返された直後に呼び出すと、手掛かりが得られる場合があります。

于 2013-11-12T05:19:11.070 に答える