Суббота, 21.12.2024, 19:53 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Anton93  
Добавление секции
dolphinДата: Среда, 29.06.2011, 18:36 | Сообщение # 1
Администратор
Сообщений: 906
Статус: 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, Kali Linux
Среды программирования: Delphi 7, Delphi 10.x

Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
 
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 к томуже ты ингнорируешь оверлей и твой код будет портить файлы которые хранят в себе какие то данные(самораспаковующийся архивы например)


 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz