После долгово изучения интернета у меня вышло вот что:
#include <windows.h>
#include <winnt.h>
#include <conio.h>
#include <stdio.h>
#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew))
#define MakePtr(Type, Base, Offset) ((Type)(DWORD(Base) + (DWORD)(Offset)))
int main(int argc, char* argv[])
{
const char* PEFile="rabbit.exe";
PVOID ImageBase;
PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NtHeader;
IMAGE_SECTION_HEADER SectionHeader;
SECURITY_ATTRIBUTES sa;
HANDLE hFMap,hFile;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
WORD pe;
DWORD dw;
hFile = CreateFile(PEFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
ReadFile(hFile,&pe,2,&dw,NULL);
hFMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
ImageBase=MapViewOfFile(hFMap,FILE_MAP_ALL_ACCESS,0,0,0);
DosHeader=PIMAGE_DOS_HEADER(ImageBase);
NtHeader=(PIMAGE_NT_HEADERS) NTSIGNATURE(DosHeader);
printf("Before: %x\n",DosHeader->e_lfanew);
CloseHandle(hFMap);
CloseHandle(hFile);
getch();
return 0;
} ---
Рабочий код, спокойно может работать со всем PE, но как теперь дозаписать в секцию мой код? и как выдернуть код из секции?
|