La memoria de proceso de lectura de un proceso no devuelve todo

Estoy tratando de escanear la memoria de una aplicación de terceros. Ya he descubierto la dirección; ahora mismo está en 0x0643FB78 . La LPMODULEENTRY32->modBaseAddr es que nunca puedo subir allí porque LPMODULEENTRY32->modBaseAddr es 0x00400000 y LPMODULEENTRY32->modBaseSize es simplemente 0x006FF000 , por lo que la dirección máxima que puedo escanear para este módulo es 0x00AFF000 .

¿Eso significa que la dirección que busco vive dentro de otro proceso / módulo / hilo / algo? Estoy bastante seguro de que el proceso que tengo contiene la dirección. ¿Cómo debo acceder a la memoria? Gracias.

Al menos en mi opinión, si tiene una LPMODULEENTRY involucrada, probablemente esté comenzando en la dirección incorrecta. Me gustaría caminar a través de los bloques de memoria en el proceso de destino con VirtualQueryEx en VirtualQueryEx lugar. Esto le dará una MEMORY_BASIC_INFORMATION sobre cada bloque en ese proceso. Luego puede usar ReadProcessMemory y escanear a través de los bloques para encontrar lo que está buscando.

Aquí hay un viejo código que escribí para hacer más o menos lo mismo, pero buscando una cadena en lugar de un puntero:

 #include  #include  #include  #include  #include  #include  template  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  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 buffer; 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  ", 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(std::cout, "\n")); return 0; } 

Un proceso consiste en páginas de memoria que están mapeadas con ciertas protecciones. Estas páginas están encapsuladas en módulos. Cada módulo tiene una base y un tamaño. Sin embargo, ReadProcessMemory lo abstrae de usted por completo. Debería poder leer la memoria independientemente del módulo en el que se encuentre.

En este caso, la memoria no está en el módulo que está mirando. Si necesita encontrar el lugar al que pertenece, puede recorrer los módulos revisando la base y el tamaño con CreateToolHelp32Snapshot, Module32First y Module32Next.

Publique un código y podemos ayudarlo a descubrir dónde se equivocó. ¿Por qué estás tan seguro de que la dirección de lo que estás buscando es la dirección que indicas? Las direcciones a menudo se especifican con un módulo base + desplazamiento debido a ASLR. ¿Cómo se maneja el proceso objective? Debe tener ciertos derechos de acceso para usar ReadProcessMemory.