AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Code funktioniert unter Vista nicht mehr
Thema durchsuchen
Ansicht
Themen-Optionen

Code funktioniert unter Vista nicht mehr

Ein Thema von CorVu5 · begonnen am 16. Sep 2008 · letzter Beitrag vom 18. Sep 2008
Antwort Antwort
CorVu5

Registriert seit: 31. Dez 2007
26 Beiträge
 
Delphi 7 Professional
 
#1

Code funktioniert unter Vista nicht mehr

  Alt 16. Sep 2008, 22:23
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
Das Leben ist wie ein Strand...und dann stirbt man.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Code funktioniert unter Vista nicht mehr

  Alt 17. Sep 2008, 06:24
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.

Was macht denn? (das ist doch die Stelle, wo der Fehler auftritt?)
writeit(newsection, $00051FC8, $00400000);
Thomas
  Mit Zitat antworten Zitat
CorVu5

Registriert seit: 31. Dez 2007
26 Beiträge
 
Delphi 7 Professional
 
#3

Re: Code funktioniert unter Vista nicht mehr

  Alt 17. Sep 2008, 13:45
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.
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
Das Leben ist wie ein Strand...und dann stirbt man.
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#4

Re: Code funktioniert unter Vista nicht mehr

  Alt 17. Sep 2008, 14:07
Ich tippe mal stark auf fehlende Rechte. Start mal dein Programm als Administrator, das sollte das Problem beheben.

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
CorVu5

Registriert seit: 31. Dez 2007
26 Beiträge
 
Delphi 7 Professional
 
#5

Re: Code funktioniert unter Vista nicht mehr

  Alt 18. Sep 2008, 21:25
Danke, dass löst leider nicht mein Problem.
Baer wie mir grade aufällt, hab ich gan vergessen die WriteIt funktion zu posten
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;
Das Leben ist wie ein Strand...und dann stirbt man.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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