dolphin
|
Дата: Среда, 29.06.2011, 18:36 | Сообщение # 1
|
Администратор
Сообщений: 904
Статус: Offline
|
Code
Procedure AddSection(SecName:string;R_Size,V_Size:dword);
const
Ziro: Byte = $00;
var
VirAddr,PhyAddr,Sect_Align,SzofImg: DWORD;
i:integer;
Sec1,Sec2:Psection;
Secnum : word;
begin
if (length(SecName)>8) or (R_Size=0) or (V_Size=0) then exit;
Secnum:=nt.FileHeader.NumberOfSections;
Sect_Align:=nt.OptionalHeader.SectionAlignment;
Sec2:=PSection(SectionList[Secnum-1]);
PhyAddr:=sec2.physical_size+sec2.physical_offs;
VirAddr:=((Sec2.rva+Sec2.virtual_size+Sect_Align-1) div Sect_Align) * Sect_Align;
new(Sec1);
with Sec1^ do
begin
rva:=VirAddr;
virtual_size:=V_Size;
physical_size:=R_Size;
physical_offs:=PhyAddr;
StrPCopy(name,SecName);
flags:=$60000020;
end;
SzofImg:=nt.OptionalHeader.SizeOfImage;
nt.OptionalHeader.SizeOfImage:=SzofImg+sec2.virtual_size;
Move(Sec1^,Pointer(Dword(MEMPTR)+PE_HEADEROFFSET+$18+PE_NT_HEADERSIZE+ (Secnum*40))^,40);
nt.FileHeader.NumberOfSections:=Secnum+1;
SetFilePointer(PE,Sec1.physical_offs+Sec1.physical_size-R_Size, nil, 0);
for i:=1 to R_Size do WriteFile(PE, Ziro, SizeOf(Ziro), SzofImg, nil);
end;
Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
|
|
|
|
C@T
|
Дата: Среда, 29.06.2011, 20:18 | Сообщение # 2
|
Авторитетный
Зарегистрирован: 06.03.2010
Группа: Модераторы
Сообщений: 265
Статус: Offline
|
VirAddr:=((Sec2.rva+Sec2.virtual_size+Sect_Align-1) div Sect_Align) * Sect_Align; округлять желательно в большую сторону ибо есть вероятность что ехе файл просто не запустится, или во время его работы возникнет какято ошибка связанная с доступом к памяти
и получается когда ты записываешь новую секции ты не сдвигаешь файл а перезаписываешь поверх старых байт между РЕ заголовком и началом первой секции, и есть вероятность что ты затрешь важные данные, например некоторые компиляторы туда записывают Bound Import Table к томуже ты ингнорируешь оверлей и твой код будет портить файлы которые хранят в себе какие то данные(самораспаковующийся архивы например)
|
|
|
|