если вы видите этот текст, отключите в настройках форума использование JavaScript
Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания .
Новичкам также крайне полезно ознакомиться с данным документом .
[C++] А как записать мой код в эту самую секцию? 11.06.04 16:03 Число просмотров: 1577
Автор: choor Статус: Elderman
После долгово изучения интернета у меня вышло вот что:
#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, но как теперь дозаписать в секцию мой код? и как выдернуть код из секции?
<programming >
[C++] rewrite PE (need example) 09.06.04 15:08
Автор: choor Статус: Elderman
Хотелось бы узнать как с помощью си перезаписать ПЕ заголовок и добавить свою секцию, мне бы желательно пример. Не могу про это инфу найти, помогите :)
[C++] Скачай какой нить пример работы с PE 09.06.04 15:49
Автор: amirul <Serge> Статус: The Elderman
Их в инете навалом. И смотри. Доки по PE есть в MSDN (сделай поиск по IMAGE_NT_HEADERS)
> Хотелось бы узнать как с помощью си перезаписать ПЕ > заголовок и добавить свою секцию, мне бы желательно пример. > Не могу про это инфу найти, помогите :)
Общий алгоритм такой
PVOID ImageBase;
PIMAGE_NT_HEADERS NtHeaders;
PSECTION_HEADER SectionHeader;
Мэпишь файл (или читаешь его в память) по какому нибудь адресу ImageBase
NtHeaders = ImageNtHeader(ImageBase);
if (NtHeaders == NULL)
goto fail;
SectionHeader = (PSECTION_HEADER)(((PCHAR)&NtHeaders->OptionalHeader)+NtHeaders->FileHeader.SizeOfOptionalHeader) + NtHeaders->FileHeader.NumberOfSections;
strncpy(SectionHeader->Name, "SECTNAME", 8);
и т.д.
Виртуальный адрес берешь из предыдущей секции + длина предыдущей секции (обязательно соблюдать выравнивание как в файле так и в виртуальной памяти: NtHeaders->OptionalHeader.SectionAlignment и NtHeaders->OptionalHeader.FileAlignment иначе винда просто не загрузит файл).
Потом
NtHeaders->FileHeader.NumberOfSections++;
NtHeaders->OptionalHeader.SizeOfImage += NewSectionSize;
[C++] А как записать мой код в эту самую секцию? 11.06.04 16:03
Автор: choor Статус: Elderman
После долгово изучения интернета у меня вышло вот что:
#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, но как теперь дозаписать в секцию мой код? и как выдернуть код из секции?