Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Добавление секции в PE
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 23 июля 2006 13:37
· Личное сообщение · #1

Не получается добавись секцию в PE

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
OD: TOpenDialog;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure AddSection(sname: string);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dos: TImageDosHeader;
nt: TImageNTHeaders;
sh:array[0..15] of TImageSectionHeader;
f, f_new :file; //исходный и новый файл

implementation

{$R *.dfm}


procedure TForm1.AddSection(sname: string);
Var n:byte;
begin
for n:=0 to 7 do
sh[nt.FileHeader.NumberOfSections+1].Name[n]:=ord(sname[n]);
sh[nt.FileHeader.NumberOfSections+1].VirtualAddress:=
sh[nt.FileHeader.NumberOfSections].VirtualAddress+
sh[nt.FileHeader.NumberOfSections].SizeOfRawData;
sh[nt.FileHeader.NumberOfSections+1].SizeOfRawData:=0;
sh[nt.FileHeader.NumberOfSections+1].PointerToRawData:=
sh[nt.FileHeader.NumberOfSections].PointerToRawData+
sh[nt.FileHeader.NumberOfSections].SizeOfRawData;
sh[nt.FileHeader.NumberOfSections+1].Characteristics:=$40000000;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if OD.Execute then
Edit1.Text:=OD.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var i:byte;
buf:array[0..250000] of char;
begin
AssignFile(f,edit1.Text);
AssignFile(f_new,ExtractFileDir(Edit1.Text)+'\new.exe');
ReWrite(f_new,1);
Reset(f,1);
BlockRead(f,dos,SizeOf(TImageDosHeader));
Seek(f,dos._lfanew);
BlockRead(f,nt,SizeOf(nt));
for i:=0 to (nt.FileHeader.NumberOfSections-1) do
BlockRead(f,sh[i],SizeOf(TImageSectionHeader));
Seek(f,0);
BlockRead(f,buf,dos._lfanew);
BlockWrite(f_new,buf,dos._lfanew);
BlockWrite(f_new,nt,SizeOf(nt));
AddSection('LOH');
for i:=0 to nt.FileHeader.NumberOfSections do
BlockWrite(f_new,sh[i],SizeOf(TImageSectionHeader));
Seek(f,sh[0].PointerToRawData);
BlockRead(f,buf,FileSize(f)-sh[0].PointerToRawData);
BlockWrite(f_new,buf,FileSize(f)-sh[0].PointerToRawData);
CloseFile(f_new);
CloseFile(f);
end;

end.


В чём ошибка?

b28b_23.07.2006_CRACKLAB.rU.tgz - Section.rar



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 23 июля 2006 14:32
· Личное сообщение · #2

sniperZ
В ломы смотреть не зная оЧибки! Но почему-то мои глаза не наблюдают увеличения кол-ва секций в файле, это поле тако NumberOfSection.

P.S.:
Пиши на си, он классикой является, люди быстрее врубятся в си, а не в дельфи, т.к. на си больше народу пишет. А алгоритм, он и в африке алгоритм

-----
My love is very cool girl.




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 23 июля 2006 15:06
· Личное сообщение · #3

theCollision пишет:
Но почему-то мои глаза не наблюдают увеличения кол-ва секций в файле, это поле тако NumberOfSection.


Внатуре...



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 23 июля 2006 15:11 · Поправил: theCollision
· Личное сообщение · #4

sniperZ
Если ты пишешь на си, то плиз напиши класс для работы с PE-форматом.
Че даст:

Не будешь изобретать велосипед, достаточно будет:
PPEFORMAT pefile = new PPEFORMAT;
pefile->open("starforce.exe");
int count = pefile->GetCountSection();
DWORD EntryPoint = pefile->GetEntryPoint();

etc.
че задашь

-----
My love is very cool girl.




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 23 июля 2006 15:14
· Личное сообщение · #5

Я пишу на DELPHI!

Исправил увеличение секций в файле. Все равно не получается.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
OD: TOpenDialog;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure AddSection(sname: string);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dos: TImageDosHeader;
nt: TImageNTHeaders;
sh:array[0..15] of TImageSectionHeader;
f, f_new :file; //исходный и новый файл

implementation

{$R *.dfm}


procedure TForm1.AddSection(sname: string);
Var n:byte;
begin
for n:=0 to 7 do
sh[nt.FileHeader.NumberOfSections].Name[n]:=ord(sname[n]);
sh[nt.FileHeader.NumberOfSections].VirtualAddress:=
sh[nt.FileHeader.NumberOfSections].VirtualAddress+
sh[nt.FileHeader.NumberOfSections].SizeOfRawData;
sh[nt.FileHeader.NumberOfSections].SizeOfRawData:=0;
sh[nt.FileHeader.NumberOfSections].PointerToRawData:=
sh[nt.FileHeader.NumberOfSections].PointerToRawData+
sh[nt.FileHeader.NumberOfSections].SizeOfRawData;
sh[nt.FileHeader.NumberOfSections].Characteristics:=$40000000;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if OD.Execute then
Edit1.Text:=OD.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var i:byte;
buf:array[0..250000] of char;
begin
AssignFile(f,edit1.Text);
AssignFile(f_new,ExtractFileDir(Edit1.Text)+'\new.exe');
ReWrite(f_new,1);
Reset(f,1);
BlockRead(f,dos,SizeOf(TImageDosHeader));
Seek(f,dos._lfanew);
BlockRead(f,nt,SizeOf(nt));
for i:=0 to (nt.FileHeader.NumberOfSections-1) do
BlockRead(f,sh[i],SizeOf(TImageSectionHeader));
Seek(f,0);
BlockRead(f,buf,dos._lfanew);
BlockWrite(f_new,buf,dos._lfanew);
BlockWrite(f_new,nt,SizeOf(nt));
AddSection('LOH');
for i:=0 to nt.FileHeader.NumberOfSections do
BlockWrite(f_new,sh[i],SizeOf(TImageSectionHeader));
Seek(f,sh[0].PointerToRawData);
BlockRead(f,buf,FileSize(f)-sh[0].PointerToRawData);
BlockWrite(f_new,buf,FileSize(f)-sh[0].PointerToRawData);
CloseFile(f_new);
CloseFile(f);
end;

end.



Ранг: 47.2 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 июля 2006 16:03
· Личное сообщение · #6

sniperZ берёшь myPEFile.pas от Guru.eXe и внимательно изучаешь функцию AddSection.

function AddSection(filname: string; SecName:string): boolean;
const Ziro: Byte = $00;
var I,ImSz,N,VirAddr,PhyAddr: DWORD;
begin
result:=false;
if not openpe(filname) then exit;

if length(SecName) > 8 then exit;

SetFilePointer(FHandle, PEHeaderOffset + $50, nil, 0);
ReadFile(FHandle, SizeOfImage, SizeOf(SizeOfImage), BytesRead, nil);

SetFilePointer(FHandle, PEHeaderOffset + $38, nil, 0);
ReadFile(FHandle, Sect_Align, SizeOf(Sect_Align), BytesRead, nil);

SetFilePointer(FHandle, PEHeaderOffset + $06, nil, 0);
ReadFile(FHandle, NumOfSections, SizeOf(NumOfSections), BytesRead, nil);

SetFilePointer(FHandle, PEHeaderOffset + $F8, nil, 0);
for I:= 1 to NumOfSections do
begin
ReadFile(FHandle, Section, SizeOf(Section), BytesRead, nil);
end;

VirAddr:=((section.VirtualAddress+section.VirtualSize+Sect_Align-1) div Sect_Align) * Sect_Align;
PhyAddr:=section.PhysicalOffset+section.PhysicalSize;


SetFilePointer(FHandle, PEHeaderOffset + $F8 + NumOfSections * $28 - $28, nil, 0);
ReadFile(FHandle, Section, SizeOf(Section), BytesRead, nil);
with Section do
begin
VirtualAddress:=VirAddr;
PhysicalOffset:=PhyAddr;
VirtualSize:= $1000;
PhysicalSize:= $200;
Characteristics:= $E00000E0;
StrPCopy(name,SecName);
end;

SetFilePointer(FHandle, PEHeaderOffset + $50, nil, 0);
ImSZ:=SizeOfImage+Section.VirtualSize;
WriteFile(FHandle, ImSz, SizeOf(ImSz), BytesRead, nil);

SetFilePointer(FHandle, PEHeaderOffset + $F8 + NumOfSections * $28, nil, 0);
WriteFile(FHandle, Section, SizeOf(Section), BytesRead, nil);
Inc(NumOfSections);
SetFilePointer(FHandle, PEHeaderOffset + $06, nil, 0);
WriteFile(FHandle, NumOfSections, SizeOf(NumOfSections), BytesRead, nil);

SetFilePointer(FHandle, Section.PhysicalOffset + Section.PhysicalSize -
$200, nil, 0);

for N:=1 to Section.PhysicalSize do
WriteFile(FHandle, Ziro, SizeOf(Ziro), BytesRead, nil);

CloseHandle(FHandle);
result:=true;
end;

Приаттачил сам myPEFile.pas.

7de3_23.07.2006_CRACKLAB.rU.tgz - myPEFile.pas



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 23 июля 2006 23:26
· Личное сообщение · #7

А на асме кто-нибудь подскажет как это делается ? Пытаюсь писать криптор-шифратор .exe-шников(основное направление - обход AV)

2f8a_23.07.2006_CRACKLAB.rU.tgz - SHProt.rar

-----
все багрепорты - в личные сообщения




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 23 июля 2006 23:38
· Личное сообщение · #8

HandMill
А ты вот спроси себя, сколько секций в файле calc.exe ? И почему их столько? А что если какое либо сво-во файла занулить, сделать большим, маленьким что будет? Ведь стоит только написать на бумажке, распечать экзампл, такое понятие как добавление секции становится не таким уж и сложынм.

Попробуй.

ЗЫ:
Я такой же задачей примерно занимаюсь с некоторой оговоркой

-----
My love is very cool girl.





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 24 июля 2006 00:27
· Личное сообщение · #9

Не забываем про поле ImageSize
PS: народ, выбросите вы этот делфи. Если уж хочется вам париться с процедурным программированием, возьмите с++, там хоть в хидерах полно предопределений, а то код типа
SetFilePointer(FHandle, PEHeaderOffset + $50, nil, 0);
Этож маразм

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 24 июля 2006 14:09 · Поправил: sniperZ
· Личное сообщение · #10

Написал по анологии с myPEFile.pas.

В некоторые проги(Winrar.exe, FASMW.exe) секция добавляется и файл работает.

А вот в calc.exe и Дельфовские проги не работает.(Пишен, что не найдена какая-то DLL),
но если в PEiD сделать RebuiltPE, то ЕКЗЕШНИК заново работает.

В чём ошибка?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
OD: TOpenDialog;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dos: TImageDosHeader;
nt: TImageNTHeaders;
sh:array[0..15] of TImageSectionHeader;
f :file;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
if OD.Execute then
Edit1.Text:=OD.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var n: integer;
SecName:string;
Num:byte;
NOP:array[0..0] of byte;
begin
SecName:='.aspack';
AssignFile(f,edit1.Text);
{$I-}
Reset(f,1);
If IOResult<>0 then exit;
{$I+}
BlockRead(f,dos,SizeOf(dos));
Seek(f,dos._lfanew);
BlockRead(f,nt,SizeOf(nt));
for n:=0 to (nt.FileHeader.NumberOfSections-1) do
BlockRead(f,sh[n],SizeOf(TImageSectionHeader));
Num:=nt.FileHeader.NumberOfSections;
for n:=0 to 7 do
sh[num].Name[n]:=ord(SecName[n-1]);
sh[num].VirtualAddress:=((sh[num-1].VirtualAddress+sh[num-1].Misc.Virt ualSize+nt.OptionalHeader.SectionAlignment-1) div nt.OptionalHeader.SectionAlignment)*nt.OptionalHeader.SectionAlignment ;
sh[num].PointerToRawData:=sh[num-1].PointerToRawData+sh[num-1].SizeOfR awData;
sh[num].Misc.VirtualSize:=$1000;
sh[num].SizeOfRawData:=$200;
sh[num].Characteristics:=$E00000E0;
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+sh[num].M isc.VirtualSize;
inc(nt.FileHeader.NumberOfSections);
Seek(f,dos._lfanew);
BlockWrite(f,nt,SizeOf(nt));
Seek(f,dos._lfanew+SizeOf(TImageNTHeaders));
BlockWrite(f,sh,SizeOf(sh));
Seek(f,sh[num].PointerToRawData);
NOP[0]:=$90;
for n:=1 to $200 do
BlockWrite(f,NOP,SizeOf(NOP));
CloseFile(f);
end;

end.




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 24 июля 2006 14:45 · Поправил: BaGiE
· Личное сообщение · #11

sniperZ пишет:
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+sh[num].M isc.VirtualSize;

ошибка может быть тут. не стоит просто увеличивать размер образа. его надо высчитать заного, т.е. пробежаться по всем сециям, и сложить их выровненный виртуальный размер+размер заголовков. Дело в том что иногда компилятор, например дельфовский может не совсем корректно установить SizeOfImage (несколько больше настоящего, т.е. максимум до разницы выровненного и невыровненнго ImageBase) я когда-то столкнулся с такой херней. может быть здесь именно в этом проблема.

а еще при добавлении секции могут возникнуть проблемы с BoundImport (у calc.exe он есть), т.е. непоняной лично для меня вещью, которая находится в PE-заголовке после заголовков секций. В этом случае надо просто затереть описание каталога BoundImport'а в PE-хеадере.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 24 июля 2006 15:16
· Личное сообщение · #12

Rascal пишет:
народ, выбросите вы этот делфи. Если уж хочется вам париться с процедурным программированием, возьмите с++, там хоть в хидерах полно предопределений, а то код типа
SetFilePointer(FHandle, PEHeaderOffset + $50, nil, 0);
Этож маразм


Вот именно. В Делфи дохрена предопределений ;)

-----
Yann Tiersen best and do not fuck




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 24 июля 2006 15:16
· Личное сообщение · #13

Спасибо,BaGiE. Буду разбираться.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 24 июля 2006 15:52
· Личное сообщение · #14

Сделал:
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfHeaders;
for n:=0 to Num do
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+sh[n].Mis c.VirtualSize;

Всё равно WinRaR.exe работает,а calc.exe и Project.exe(Delphi) не являются приложениями Win32.

BaGiE пишет:
а еще при добавлении секции могут возникнуть проблемы с BoundImport (у calc.exe он есть), т.е. непоняной лично для меня вещью, которая находится в PE-заголовке после заголовков секций. В этом случае надо просто затереть описание каталога BoundImport'а в PE-хеадере.


Ну ка расскажи про BoundImport'а в PE-хеадере.




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 24 июля 2006 15:56
· Личное сообщение · #15

sniperZ пишет:
Всё равно WinRaR.exe работает,а calc.exe и Project.exe(Delphi) не являются приложениями Win32.

sniperZ пишет:
но если в PEiD сделать RebuiltPE, то ЕКЗЕШНИК заново работает.

посмотри че изменяется в экзешнике после ребилда. может поймешь где ошибка.

sniperZ пишет:
Ну ка расскажи про BoundImport'а в PE-хеадере.

че тут рассказывать,то
----------------------------------
IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[DataDirectoryBoundImport ].VirtualAddress := 0
IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[DataDirectoryBoundImport ].Size := 0




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 24 июля 2006 16:13
· Личное сообщение · #16

sniperZ пишет:
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfHeaders;
for n:=0 to Num do
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+sh[n].Mis c.VirtualSize;

че это такое!
вот так.
nt.OptionalHeader.SizeOfImage := nt.OptionalHeader.SizeOfHeaders;
for n:=0 to Num do
nt.OptionalHeader.SizeOfImage := nt.OptionalHeader.SizeOfImage + AlignSize(sh[n].Mis c.VirtualSize, $1000);
$1000 - это по умолчанию, а так должно быть значение из IMAGE_NT_HEADERS.OptionalHeader.SectionAlignment

а функцию AlignSize(Value, Factor) напиши сам для выравниввния значений до значения указанного в Factor



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 24 июля 2006 17:04
· Личное сообщение · #17

BaGiE, я новичек.
Поподробнее про AlignSize(sh[n].Mis c.VirtualSize, $1000) можно?




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 24 июля 2006 17:13 · Поправил: BaGiE
· Личное сообщение · #18

sniperZ пишет:
BaGiE, я новичек.

бррр. а я нет? чем я лучше тебя?
почитал бы тогда статьи что-ли...

ну да ладно. вот хотя бы так.

edit: //ступил и неправильно написал
function Bit(B: DWORD): DWORD;
begin
if B <> 0 then
Result:= 1
else
Result:= 0;
end;

function Align(Value, Factor: DWORD): DWORD;
begin
Result := (Value div Factor) * Factor + Factor * Bit(Value mod Factor);
end;




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 24 июля 2006 17:28
· Личное сообщение · #19

вот, вроде всегда работает, правда есть несколько недороботок, но это мелочи...

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;


-----
[nice coder and reverser]





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 24 июля 2006 17:43
· Личное сообщение · #20

PE_Kill
Да ну, скоко не пробовал я в делфи писать - сакс. IDE убогая-убогая, чтоб узнать, какой тип переменной или класса юзаю AVSearch Радуют старания борланда сделать д как можно более не похожей на С++. И start end вместо { } и nil вместо null. Юзабилити тоже долго вылизывали видимо - сделать наиболее часто применяемый оператор := а реже применяемый =, а repeat until, когда во всех языках принято do while. ладно хоть class не изменили, хотя и так хватает для смеха.

Вообще можно и в yc и yp глнуть - и на асме и на сях

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 24 июля 2006 22:13
· Личное сообщение · #21

BaGiE, всё равно calc.exe и Project.exe падают, а WinRaR.exe на высоте.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
OD: TOpenDialog;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
dos: TImageDosHeader;
nt: TImageNTHeaders;
sh:array[0..15] of TImageSectionHeader;
f :file;

implementation

{$R *.dfm}



function Bit(B: DWORD): DWORD;
asm
shl eax,31
shr eax,31
end;

function AlignSize(Value, Factor: DWORD): DWORD;
begin
Result := (Value div Factor) * Factor + Factor * Bit(Value mod Factor);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OD.Execute then
Edit1.Text:=OD.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var n: integer;
SecName:string;
Num:byte;
NOP:array[0..0] of byte;
begin
SecName:='.aspack';
AssignFile(f,edit1.Text);
{$I-}
Reset(f,1);
If IOResult<>0 then exit;
{$I+}
BlockRead(f,dos,SizeOf(dos));
Seek(f,dos._lfanew);
BlockRead(f,nt,SizeOf(nt));
for n:=0 to (nt.FileHeader.NumberOfSections-1) do
BlockRead(f,sh[n],SizeOf(TImageSectionHeader));
Num:=nt.FileHeader.NumberOfSections;
for n:=0 to 7 do
sh[num].Name[n]:=ord(SecName[n+1]);
sh[num].VirtualAddress:=((sh[num-1].VirtualAddress+sh[num-1].Misc.Virt ualSize+nt.OptionalHeader.SectionAlignment-1) div nt.OptionalHeader.SectionAlignment)*nt.OptionalHeader.SectionAlignment ;
sh[num].PointerToRawData:=sh[num-1].PointerToRawData+sh[num-1].SizeOfR awData;
sh[num].Misc.VirtualSize:=$1000;
sh[num].SizeOfRawData:=$200;
sh[num].Characteristics:=$E00000E0;
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+sh[num].M isc.VirtualSize;
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfHeaders;
for n:=0 to Num do
nt.OptionalHeader.SizeOfImage:=nt.OptionalHeader.SizeOfImage+
AlignSize(sh[n].Misc.VirtualSize, nt.OptionalHeader.FileAlignment);
//nt.OptionalHeader.DataDirectory[11].VirtualAddress:=0;
//nt.OptionalHeader.DataDirectory[11].Size:=0;

inc(nt.FileHeader.NumberOfSections);
Seek(f,dos._lfanew);
BlockWrite(f,nt,SizeOf(nt));
Seek(f,dos._lfanew+SizeOf(TImageNTHeaders));
BlockWrite(f,sh,SizeOf(sh));
Seek(f,sh[num].PointerToRawData);
NOP[0]:=$90;
for n:=1 to $200 do
BlockWrite(f,NOP,SizeOf(NOP));
CloseFile(f);
end;

end.



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 25 июля 2006 01:26
· Личное сообщение · #22

sniperZ
На сайте васма, есть его оффлайн, качни и почитай все что касается заражения файлов вирусами.
В них много чего интересного и полезного.

ЗЫ:
Ты наверное не знаешь о существовании тега "Код" ! Бедняжка

-----
My love is very cool girl.





Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 25 июля 2006 08:29 · Поправил: BaGiE
· Личное сообщение · #23

sniperZ пишет:
//nt.OptionalHeader.DataDirectory[11].VirtualAddress:=0;
//nt.OptionalHeader.DataDirectory[11].Size:=0;

а че это закомментировал?

и Align работает неправильно. вобщем не муди. у меня голова уже пухнет от кода на паскале. лучше асм. и проще будет. а если уж решил что на Delphi обязательно, то лучше работай через файл-маппинг, удобнее полюбому получается.

а если очень приспичит то пиши в личку, помогу чем смогу, а то нафлудил уже тут.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 25 июля 2006 11:36
· Личное сообщение · #24

BaGiE пишет:
и Align работает неправильно. вобщем не муди. у меня голова уже пухнет от кода на паскале. лучше асм. и проще будет. а если уж решил что на Delphi обязательно, то лучше работай через файл-маппинг, удобнее полюбому получается.


Сделал всё, как ты говорил.
Так, в чём проблема?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 25 июля 2006 12:31
· Личное сообщение · #25

Rascal а почему Делфи должны стараться сделать как Си? По мне так Си - полный сакс со своими буферами, строками и утечками памяти. Единственное, что мне там нравится, так это преобразование типов и создание новых... Короч, каждому своё...

-----
Yann Tiersen best and do not fuck




Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 25 июля 2006 12:36
· Личное сообщение · #26

PE_Kill пишет:
По мне так Си - полный сакс

По мне тоже, но давайте прекратим священную войну и будет отвечать по теме

-----
Подписи - ЗЛО! Нужно убирать!





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 25 июля 2006 12:45
· Личное сообщение · #27

sniperZ
попробуй мой код, я выше приводил, всё работать должно...

-----
[nice coder and reverser]





Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 25 июля 2006 13:18
· Личное сообщение · #28

sniperZ пишет:
Сделал всё, как ты говорил.

во первых не все, а во вторых ошибки может еще есть где.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 25 июля 2006 13:22
· Личное сообщение · #29

Кстати, в myPEFile от GuGu.Exe AddSection тоже неправильно работает в calc.exe.
А всё из-за BoundImport.
Надо ещё добавить,как советовал Bagie:

IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[11 ].VirtualAddress := 0
IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[11].Size := 0

Так что GuGu.exe лови баг и исправляй.

В моей функции где-то вкралась небольшая ошибка. Ща переделаю и исправлю.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 25 июля 2006 13:42
· Личное сообщение · #30

Вот исправленый myPEFile от Guru.EXE
Теперь AddSection работает корректно.

03d3_25.07.2006_CRACKLAB.rU.tgz - myPEFile.pas


. 1 . 2 . >>
 eXeL@B —› Программирование —› Добавление секции в PE
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати