내 생각에 적어도 LPMODULEENTRY
이있는 경우 잘못된 방향으로 시작했을 가능성이 큽니다. 대신 VirtualQueryEx
을 사용하여 대상 프로세스의 메모리 블록을 살펴볼 것입니다. 그러면 해당 프로세스의 각 블록에 대해 MEMORY_BASIC_INFORMATION
이 표시됩니다. 그런 다음 ReadProcessMemory
을 사용하고 블록을 스캔하여 원하는 것을 찾을 수 있습니다.
는 여기에 내가 거의 같은 일을 쓴 오래된 코드이지만, 포인터가 아닌 문자열을 찾고 :
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <algorithm>
#include <iterator>
template <class InIter1, class InIter2, class OutIter>
void find_all(unsigned char *base, InIter1 buf_start, InIter1 buf_end, InIter2 pat_start, InIter2 pat_end, OutIter res) {
for (InIter1 pos = buf_start;
buf_end!=(pos=std::search(pos, buf_end, pat_start, pat_end));
++pos)
{
*res++ = base+(pos-buf_start);
}
}
template <class outIter>
void find_locs(HANDLE process, std::string const &pattern, outIter output) {
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for (p = NULL;
VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
p += info.RegionSize)
{
std::vector<char> buffer;
std::vector<char>::iterator pos;
if (info.State == MEM_COMMIT &&
(info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
{
SIZE_T bytes_read;
buffer.resize(info.RegionSize);
ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
buffer.resize(bytes_read);
find_all(p, buffer.begin(), buffer.end(), pattern.begin(), pattern.end(), output);
}
}
}
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <process ID> <pattern>", argv[0]);
return 1;
}
int pid;
sscanf(argv[1], "%i", &pid);
std::string pattern(argv[2]);
HANDLE process = OpenProcess(
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
false,
pid);
find_locs(process, pattern,
std::ostream_iterator<void *>(std::cout, "\n"));
return 0;
}
MODULEENTRY 당신에게 * 코드의 주소를 제공합니다 *. 확실히 당신은 데이터에 더 관심이 있습니까? 이는 Windows가 힙을 할당 한 위치에 따라 어디에서나 나타날 수 있습니다. 데이터 섹션, 실제로는 힙에있는 경우 해당 주소를 반복적으로 가져올 수있는 희망이 없기 때문에 가능합니다. VirtualQueryEx()를 사용하여 주소 공간에서 할당을 열거하십시오. –