我正在使用ReadProcessMemory填充char数组,我很想知道确定返回的char数组是否包含有效字符串的'正确/标准/最佳'方法是什么。我并不担心字符串,它可以包含a-zA-Z0-9加空格和字符,例如'./_'和其他一些东西,但实际上我只想知道它是否有效而且不是充满了垃圾。
int char_read_length = 255;
char data[255];
memset(data, 0, char_read_length);
ReadProcessMemory( hProcess, (void *)start, data, char_read_length, &lpRead);
感谢。
答案 0 :(得分:1)
如果它包含终止字符串的NUL字符,则可以将其视为字符串。如果没有NUL,将其视为字符串将在缓冲区的末尾运行并导致非常糟糕的事情发生。因此:
bool is_it_a_string = memchr(data, 0, char_read_length);
答案 1 :(得分:0)
这里有几件事:
lpRead
在哪里定义?如果它确实是lp
变量(代表“长指针”),那么在将它传递给ReadProcessMemory之前,你应该不获取它的地址。如果它不是指针,那么你应该改变它的名字,这样它就不会以LP开头。 (实际上,你可能不想使用匈牙利表示法,但如果你打算使用它至少要正确使用它)static_cast
而不是C样式转换来将字符指针强制转换为void指针。答案 2 :(得分:0)
我可能只是使用类似下面的内容(请注意,使用此功能需要确保data
正确'\0'
终止):
char const validChars[] = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"
"./_"
" "; // add whatever other characters are considered valid
bool isValidString(char const* s)
{
return strspn(s, validChars) == strlen(s);
}
如果要检查整个255个字节是否“有效”,那么您还需要检查strlen(data) == 255
。
可能有一个很好的C ++ STL算法可以处理这个问题,但由于某种形式的懒惰,我可能仍会使用strspn()
。
请注意,您可能需要检查ReadProcessMemory()
的错误回复。