2011-08-06 3 views
3

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); 

Répondre

0

Désolé d'avoir soulevé une question aussi ancienne, je pensais juste que cela pourrait aider quelqu'un. Pour autant que je sache, pour forker un processus, vous devez avoir utilisé la fonction CreateProcess. Par conséquent, vous devez utiliser VirtualQueryEx et VirtualAllocEx au lieu de VirtualQuery et VirtualAlloc. Remplacez également la valeur hProc par un descripteur de votre processus créé. J'ai également remarqué que vous avez explicitement utilisé 0x20 comme dwLength que vous avez probablement besoin de le changer avec dwSize.

En résumé:

PROCESS_INFORMATION piProcessInformation; 
ZeroMemory(&piProcessInformation,sizeof(PROCESS_INFORMATION)); 
if(CreateProcess(NULL,processName,NULL,NULL,false,CREATE_SUSPENDED,NULL,NULL,&suStartUpInformation,&piProcessInformation)) 
{ 
      cContext.ContextFlags = CONTEXT_FULL; 
      GetThreadContext(piProcessInformation.hThread,&cContext); 
      i = VirtualQueryEx(piProcessInformation.hProcess, (LPCVOID)MylpAddr , &MemInfo , dwSize) ; 
      if (!i) return NULL ; 

      if (!(MemInfo.State & MEM_FREE)) 
      { 
       if (MemInfo.Type & MEM_MAPPED) 
       { 
        // hProc = GetCurrentProcess() ; No need to this line 
        szPage = MemInfo.RegionSize ; 
        i = NtUnlockVirtualMemory(piProcessInformation.hProcess , (PVOID *)MemInfo.AllocationBase , (PULONG)szPage , LOCK_VM_IN_WORKING_SET | LOCK_VM_IN_RAM); 
        i = NtProtectVirtualMemory(piProcessInformation.hProcess , (PVOID *)MemInfo.AllocationBase , (PULONG)szPage , PAGE_READWRITE , &OldProt) ; 
        i = NtUnmapViewOfSection(piProcessInformation.hProcess , (LPVOID)MemInfo.AllocationBase); 
        i = UnmapViewOfFile((LPVOID)MemInfo.AllocationBase); 
        if (!i) i =1 ; 
       } 
       else 
       { 
        j = VirtualUnlock(MemInfo.BaseAddress , MemInfo.RegionSize); 
        i = VirtualFreeEx(piProcessInformation.hProcess, (LPVOID)MemInfo.AllocationBase , NULL , MEM_RELEASE) ; 
       } 
       if (!i) return NULL ; 

      } 

      MylpAddr = (DWORD)VirtualAllocEx(piProcessInformation.hProcess, lpAddr , dwSize , AllocType , ProtFlags); 
} 
Questions connexes