Je travaille sur un chargeur PE, tout comme les fenêtres chargeurmémoire virtuelle Manipulation
ma cible est un exécutable pas DLL, j'ai essayé d'abord des problèmes de redistribution loadlibrary mais dû faire face, a un code pour le corriger, mais il didn « t travailler avec toutes les cibles (certains besoins de exe à charger en même BaseAdress travailler probablement
donc je suis arrivé au point, je l'ai à mettre en œuvre mon chargeur pour assurer que la question BaseAddress et pas besoin de réaffectation
Je force mon application à charger à un niveau élevé (0x10000000), tout en utilisant VirtualAlloc pour allouer de la mémoire pour les en-têtes & sections pour l'application cible
j'utilise VirtualQuery pour voir l'état de l'adresse que je veux attribuer, sinon libre-je utiliser UnmapViewOfFile si le type de page MEM_MAPPED autre VirtualFree (MEM_RELEASE)
Le problème est que si le pages de mémoire sont MEM_MAPPED & MEM_COMMIT (toujours fichier de page pages sauvegardées) toutes les méthodes échoue avec le code d'erreur 0x57 ERROR_INVALID_PARAMETER
recherche de solutions/idées voici le code:
MylpAddr = (DWORD)lpAddr ;
MemInfo.RegionSize = 0 ;
NtUnmapViewOfSection= (NTUNMAPVIEWOFSECTION)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")), "NtUnmapViewOfSection");
NtProtectVirtualMemory= (NTPROTECTVIRTUALMEMORY)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")), "NtProtectVirtualMemory");
NtUnlockVirtualMemory= (NTUNLOCKVIRTUALMEMORY)GetProcAddress(LoadLibrary(TEXT("ntdll.dll")), "NtUnlockVirtualMemory");
GetSystemInfo(&siSysInfo);
szPage = siSysInfo.dwPageSize ;
i = VirtualQuery((LPCVOID)MylpAddr , &MemInfo , 0x20) ;
if (!i) return NULL ;
if (!(MemInfo.State & MEM_FREE))
{
if (MemInfo.Type & MEM_MAPPED)
{
hProc = GetCurrentProcess() ;
szPage = MemInfo.RegionSize ;
i = NtUnlockVirtualMemory(hProc , (PVOID *)MemInfo.AllocationBase , (PULONG)szPage , LOCK_VM_IN_WORKING_SET | LOCK_VM_IN_RAM);
i = NtProtectVirtualMemory(hProc , (PVOID *)MemInfo.AllocationBase , (PULONG)szPage , PAGE_READWRITE , &OldProt) ;
i = NtUnmapViewOfSection(hProc , (LPVOID)MemInfo.AllocationBase);
i = UnmapViewOfFile((LPVOID)MemInfo.AllocationBase);
if (!i) i =1 ;
}
else
{
j = VirtualUnlock(MemInfo.BaseAddress , MemInfo.RegionSize);
i = VirtualFree((LPVOID)MemInfo.AllocationBase , NULL , MEM_RELEASE) ;
}
if (!i) return NULL ;
}
MylpAddr = (DWORD)VirtualAlloc(lpAddr , dwSize , AllocType , ProtFlags);