Frage zum Pe-Format
-
Hallo!
Ich habe vor einen kleinen Packer/Verschlüssler für Anwendungen zu schreiben. Zuvor wollte ich jedoch ein wenig mit dem Exe Format rumprobieren. Deshalb habe ich einfach mal das versucht:
Ich habe Anwendung A und Anwendung B. Ich kopiere alle Daten von Anwendung A vor Anwendung B. Die .text Section füge ich noch zusätzlich unter Anwendung B. Jetzt wird ja, wenn ich die zusammengestopselte Anwendung aufrufe normalerweise ganz normal Anwendung A ausgeführt und Schluss ist. Jedoch möchte ich jetzt, dass die kopierte .text Section aufgerufen wird anstatt der alten. Hat absolut keinen Sinn, aber wie gesagt, nur zu Testzwecken!Die Daten zur Codesection habe ich mir so geholt:
DWORD GetCodeInfos(LPVOID file, DWORD* dwSize) { IMAGE_DOS_HEADER* lpBase = (IMAGE_DOS_HEADER*)file; if(lpBase->e_magic != IMAGE_DOS_SIGNATURE) { MessageBox(0, "GetCodeInfos failed! 1", 0, 0); return 0; } IMAGE_NT_HEADERS* lpNtHeader = (IMAGE_NT_HEADERS*)((LPBYTE)lpBase + lpBase->e_lfanew); if(lpNtHeader->Signature != IMAGE_NT_SIGNATURE) { MessageBox(0, "GetCodeInfos failed! 2", 0, 0); return 0; } *dwSize = lpNtHeader->OptionalHeader.SizeOfCode; return lpNtHeader->OptionalHeader.BaseOfCode; }
Ok jetzt sollte die Codesection unbenutzt unter Anwendung B schlummern. Jetzt muss ich noch den Entrypoint ändern. Dazu benutzte ich folgende Formel:
NewEntryPoint = (EntryPointAnwendungA - BaseOfCodeAnwendungA) + SizeOfAnwendungA + SizeOfAnwendungB
Diesen setze ich dann ganz einfach.
Dann setze ich noch die BaseOfCode im OptionalHeader von AnwendungA auf
SizeOfAnwendungA + SizeOfAnwendungB.Nur leider sagt er mir dann, es sei keine gültige Windowsanwendung mehr
Ich habe auch schon versucht ImageSize auf SizeOfAnwendungA + SizeOfAnwendungB + SizeOfCodesection zu setze...aber kein Erfolg....was habe ich denn nicht beachtet?Zusätzlich habe ich noch vom SectionHeader auf die TextSection die Adresse auf SizeOfAnwendungA + SizeOfAnwendungB gesetzt.
Hier mal ein paar selbstgemachte Funktionen:
DWORD GetCodeInfos(LPVOID file, DWORD* dwSize) { IMAGE_DOS_HEADER* lpBase = (IMAGE_DOS_HEADER*)file; if(lpBase->e_magic != IMAGE_DOS_SIGNATURE) { MessageBox(0, "GetCodeInfos failed! 1", 0, 0); return 0; } IMAGE_NT_HEADERS* lpNtHeader = (IMAGE_NT_HEADERS*)((LPBYTE)lpBase + lpBase->e_lfanew); if(lpNtHeader->Signature != IMAGE_NT_SIGNATURE) { MessageBox(0, "GetCodeInfos failed! 2", 0, 0); return 0; } *dwSize = lpNtHeader->OptionalHeader.SizeOfCode; return lpNtHeader->OptionalHeader.BaseOfCode; }
DWORD ModifyTextSection(LPVOID lpFile, DWORD dwNewStart, DWORD dwNewSize) { IMAGE_DOS_HEADER* lpBase = (IMAGE_DOS_HEADER*)lpFile; if(lpBase->e_magic != IMAGE_DOS_SIGNATURE) { MessageBox(0, "ModifyTextSection failed! 1", 0, 0); return 0; } IMAGE_NT_HEADERS* lpNtHeader = (IMAGE_NT_HEADERS*)((LPBYTE)lpBase + lpBase->e_lfanew); if(lpNtHeader->Signature != IMAGE_NT_SIGNATURE) { MessageBox(0, "ModifyTextSection failed! 2", 0, 0); return 0; } IMAGE_SECTION_HEADER* lpCodeSection = (IMAGE_SECTION_HEADER*)((LPBYTE)lpNtHeader + sizeof(IMAGE_NT_HEADERS)); while(strcmp((char*)lpCodeSection->Name, ".text") != 0 && lpCodeSection->Name) lpCodeSection++; if(strcmp((char*)lpCodeSection->Name, ".text") != 0) { MessageBox(0, "CRITICAL SECTION ERROR! 2511", 0, 0); return 0; } DWORD dwSave = lpCodeSection->VirtualAddress; lpCodeSection->VirtualAddress = dwNewStart; if(dwNewSize) { lpCodeSection->SizeOfRawData = dwNewSize; lpCodeSection->Misc.VirtualSize = dwNewSize; } return dwSave; }
Danke!
Viele Grüße,
Kevin
-
Du stellst dir dass ein bischen zu leicht vor.
Du musst alle reallocierten Adressen auch mit kopieren,
alle Import-Listen, die RVA Bereiche dürfen sich nicht überlappen.
Nur die .text Bereiche und den Einsprungpunkt ändern reicht nicht.