Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Code funktioniert unter Vista nicht mehr (https://www.delphipraxis.net/120798-code-funktioniert-unter-vista-nicht-mehr.html)

CorVu5 16. Sep 2008 22:23


Code funktioniert unter Vista nicht mehr
 
Hallo Leute, ich bin vor kurzem von XP auf Vista umgestiegen, und abgesehen von anderen Problemen (z.B. dass bei meinem delphi 7 der Runtimedebugger nicht mehr geht) funktioniert auch einer meiner Codefragmente nicht mehr.
Das ganze sollte vllt. mal ein Schutz für PE-Dateien werden.
Es wird erstmal eine Section hinzugefügt, das klappt, daraufhin soll eine Funktion in die neue Section kopiert werden. Hierbei gibt mir Vista aber immer eine Zugriffsverletzung aus :(
Delphi-Quellcode:
function PEAlign(dwTarNum,dwAlignTo: DWORD):DWORD;
var
  dwtemp: DWORD;
begin;
   dwtemp := dwTarNum div dwAlignTo;
   if((dwTarNum mod dwAlignTo)<> 0) Then
     inc(dwtemp);
   dwtemp := dwtemp*dwAlignTo;
   result := dwtemp;
end;
function AddSection(PeFile : TMemoryStream; SectionName : string; RAWSize, VirtualSize : DWORD) : Pointer;
var
  PDOSHeader : PImageDosHeader;
  PNTHeader : PImageNTHeaders;
  PNewSectionHeader : PImageSectionHeader;
  PLastSectionHeader: PImageSectionHeader;
  oldsize : Cardinal;
begin

PDOSHeader := PeFile.Memory;
PNTHeader := Pointer(Cardinal(PDOSHeader) + PDOSHeader^._lfanew);
oldSize   := PeFile.Size;
///////
PNewSectionHeader := Pointer(Cardinal(PEFile.Memory) + PDOSHeader^._lfanew + SizeOf(TImageNTHeaders) + (PNTHeader^.FileHeader.NumberOfSections * SizeOf(TImageSectionHeader)));
PLastSectionHeader:= Pointer(Cardinal(PNewSectionHeader) - SizeOf(TImageSectionHeader));
CopyMemory(PNewSectionHeader, Pointer(Cardinal(PNewSectionHeader) - SizeOf(TImageSectionHeader)),SizeOf(TImageSectionHeader));
///////
PNewSectionHeader.Name[0] := ord('T');
PNewSectionHeader.Name[1] := ord('E');
PNewSectionHeader.Name[2] := ord('S');
PNewSectionHeader.Name[3] := ord('T');
PNewSectionHeader.Name[4] := $00;
PNewSectionHeader.Name[5] := $00;
PNewSectionHeader.Name[6] := $00;
PNewSectionHeader.Name[7] := $00;
PNewSectionHeader.Characteristics := $C0000040;
PNewSectionHeader.SizeOfRawData   := RawSize;
PNewSectionHeader.Misc.VirtualSize := VirtualSize;
PNewSectionHeader^.VirtualAddress  := PeAlign(PLastSectionHeader^.VirtualAddress  + PLastSectionHeader^.Misc.VirtualSize,PNTHeader^.OptionalHeader.SectionAlignment);
PNewSectionHeader^.PointerToRawData := PeAlign(PLastSectionHeader^.PointerToRawData + PLastSectionHeader^.SizeOfRawData  ,PNTHeader^.OptionalHeader.FileAlignment  );

Inc(PNTHeader^.FileHeader.NumberOfSections);
Inc(PNTHeader^.OptionalHeader.SizeOfImage,VirtualSize);
PeFile.SetSize(oldsize + rawSize);
ZeroMemory(Pointer(Cardinal(PeFile.Memory) + oldsize),rawsize);
PNtHeader^.OptionalHeader.AddressOfEntryPoint := PNewSectionHeader^.VirtualAddress;
result := Pointer(Cardinal(PeFIle.Memory) + PNewSectionHeader^.PointerToRawData);
end;






procedure TForm1.Button1Click(Sender: TObject);
var
  PeFile : TMemoryStream;
  newsection : Pointer;
begin
PeFile := TMemoryStream.Create;
PeFile.LoadFromFile('Project2.exe');
newsection := AddSection(PeFile, 'nochegal---',$300,$300);
writeit(newsection, $00051FC8, $00400000);
PeFile.SaveToFile('lee72.exe');
end;
danke im Voraus

toms 17. Sep 2008 06:24

Re: Code funktioniert unter Vista nicht mehr
 
Zitat:

daraufhin soll eine Funktion in die neue Section kopiert werden. Hierbei gibt mir Vista aber immer eine Zugriffsverletzung aus
Hallo, ich habe gerade meine Glaskugel nicht dabei. :glaskugel:

Was macht denn? (das ist doch die Stelle, wo der Fehler auftritt?)
Delphi-Quellcode:
writeit(newsection, $00051FC8, $00400000);

CorVu5 17. Sep 2008 13:45

Re: Code funktioniert unter Vista nicht mehr
 
achso sorry, ja die AV tritt bei jeder der CopyMemory in writeIt auf...Wie mir mittlerweile aber auffiel nur in der IDE, kompiliert geht das Ganze.
Oder auch nicht, denn aus Gründen, die mir völlig schleierhaft sind, wird der Entrypoint nicht geändert, der andere Kram funktionert aber tadellos.
Delphi-Quellcode:
PNtHeader^.OptionalHeader.AddressOfEntryPoint := PNewSectionHeader^.VirtualAddress;
es ist, als ob diese Zeile nicht vorhanden wäre.
Dann muss ich den Entrypoint immer manuell mit LordPE ändern. Das kann ich jetzt wirklich überhaupt nicht verstehen :(

Dust Signs 17. Sep 2008 14:07

Re: Code funktioniert unter Vista nicht mehr
 
Ich tippe mal stark auf fehlende Rechte. Start mal dein Programm als Administrator, das sollte das Problem beheben.

Dust Signs

CorVu5 18. Sep 2008 21:25

Re: Code funktioniert unter Vista nicht mehr
 
Danke, dass löst leider nicht mein Problem.
Baer wie mir grade aufällt, hab ich gan vergessen die WriteIt funktion zu posten :wall:
sorry
hier mal der komplette Code
Delphi-Quellcode:
procedure writeit(Destination : Pointer; JmpDest : DWord; ImageBase : Dword);
  procedure get_info; stdcall; forward;
  procedure execute; stdcall; forward;
  procedure loader; stdcall;
  begin
    asm
      Call get_info
      Call execute
    end;
  end;
  procedure get_info; stdcall;
  begin
    asm
      pop eax //get Section begin + 5
      push eax
    end;
  end;
  procedure execute; stdcall;
  var
    Sectionbegin : Dword;
    OEP : DWord;
    ImageBase : DWord;
    ep : Dword;
  begin
    asm
      mov SectionBegin, eax
    end;
    OEP      := DWord(Pointer(SectionBegin + $40)^);
    ImageBase := DWord(Pointer(SectionBegin + $44)^);
    ep := OEP + ImageBase;
    asm
      jmp ep
    end;
  end;
  procedure loader_end; begin end;
begin
  CopyMemory(Pointer(Cardinal(destination) + $45),@jmpdest  ,4);
  CopyMemory(Pointer(Cardinal(destination) + $49),@imagebase ,4);
  CopyMemory(Destination,@loader,Cardinal(@loader_end) - Cardinal(@loader));
end;


function PEAlign(dwTarNum,dwAlignTo: DWORD):DWORD;
var
  dwtemp: DWORD;
begin;
   dwtemp := dwTarNum div dwAlignTo;
   if((dwTarNum mod dwAlignTo)<> 0) Then
     inc(dwtemp);
   dwtemp := dwtemp*dwAlignTo;
   result := dwtemp;
end;
function AddSection(PeFile : TMemoryStream; SectionName : string; RAWSize, VirtualSize : DWORD) : Pointer;
var
  PDOSHeader : PImageDosHeader;
  PNTHeader : PImageNTHeaders;
  PNewSectionHeader : PImageSectionHeader;
  PLastSectionHeader: PImageSectionHeader;
  oldsize : Cardinal;
begin

PDOSHeader := PeFile.Memory;
PNTHeader := Pointer(Cardinal(PDOSHeader) + PDOSHeader^._lfanew);
oldSize   := PeFile.Size;
///////
PNewSectionHeader := Pointer(Cardinal(PEFile.Memory) + PDOSHeader^._lfanew + SizeOf(TImageNTHeaders) + (PNTHeader^.FileHeader.NumberOfSections * SizeOf(TImageSectionHeader)));
PLastSectionHeader:= Pointer(Cardinal(PNewSectionHeader) - SizeOf(TImageSectionHeader));
CopyMemory(PNewSectionHeader, Pointer(Cardinal(PNewSectionHeader) - SizeOf(TImageSectionHeader)),SizeOf(TImageSectionHeader));
///////
PNewSectionHeader.Name[0] := ord('T');
PNewSectionHeader.Name[1] := ord('E');
PNewSectionHeader.Name[2] := ord('S');
PNewSectionHeader.Name[3] := ord('T');
PNewSectionHeader.Name[4] := $00;
PNewSectionHeader.Name[5] := $00;
PNewSectionHeader.Name[6] := $00;
PNewSectionHeader.Name[7] := $00;
PNewSectionHeader.Characteristics := $C0000040;
PNewSectionHeader.SizeOfRawData   := RawSize;
PNewSectionHeader.Misc.VirtualSize := VirtualSize;
PNewSectionHeader^.VirtualAddress  := PeAlign(PLastSectionHeader^.VirtualAddress  + PLastSectionHeader^.Misc.VirtualSize,PNTHeader^.OptionalHeader.SectionAlignment);
PNewSectionHeader^.PointerToRawData := PeAlign(PLastSectionHeader^.PointerToRawData + PLastSectionHeader^.SizeOfRawData  ,PNTHeader^.OptionalHeader.FileAlignment  );

Inc(PNTHeader^.FileHeader.NumberOfSections);
Inc(PNTHeader^.OptionalHeader.SizeOfImage,VirtualSize);
PeFile.SetSize(oldsize + rawSize);
ZeroMemory(Pointer(Cardinal(PeFile.Memory) + oldsize),rawsize);
PNtHeader^.OptionalHeader.AddressOfEntryPoint := PNewSectionHeader^.VirtualAddress;
result := Pointer(Cardinal(PeFIle.Memory) + PNewSectionHeader^.PointerToRawData);
end;






procedure TForm1.Button1Click(Sender: TObject);
var
  PeFile : TMemoryStream;
  newsection : Pointer;
begin
PeFile := TMemoryStream.Create;
PeFile.LoadFromFile('Project2.exe');
newsection := AddSection(PeFile, 'nochegal',$300,$300);
writeit(newsection, $00051FC8, $00400000);
PeFile.SaveToFile('lee72.exe');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz