Autor Beitrag
Biarchiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: So 06.04.03 18:16 
Hallo,

Wer kann mir diesen Code von C ins Delphi übersetzen?
Das ist glaube eine C procedure bitte in eine Delphi procedure.

Vielen Dank.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
LPE_STD_CODE EnlargeHeader(PE_INFO *pe)
{
    LPE_STD_CODE            ret = LPE_HANDLEDERROR;
    HWND                    hErrDlg = GetActiveWindow();
    DWORD                   dwHSize, dwBuff, i;
    IMAGE_SECTION_HEADER    *pS;
    HANDLE                  hFile;
    void                    *pMem;
    DWORD                   dwMemSize;

    // possible ?
//    if (pe->pNTh->OptionalHeader.SizeOfHeaders >= 0x1000)
    if ( GetRealSizeOfHeaders( pe->pMap ) >= 0x1000 )
    {
        ShowError(hErrDlg, "The maximum SizeOfHeaders (0x1000) is already reached !");
        goto Exit;
    }

    // move the sections 0x200 bytes back
    dwHSize = GetRealSizeOfHeaders(pe->pMap);
    dwMemSize = pe->dwFileSize - dwHSize;
    pMem = m(dwMemSize);
    if (!pMem)
    {
        ret = LPE_NOMEMORY;
        goto Exit;
    }
    memcpy(pMem, (void*)((DWORD)pe->pMap + dwHSize), dwMemSize);
    pe->pNTh->OptionalHeader.SizeOfHeaders = dwHSize + 0x200;
    pS = pe->pSech;
    for (i = 0; i < pe->pNTh->FileHeader.NumberOfSections; i++)
    {
        if (pS->PointerToRawData) // Watcom C/C++
            pS->PointerToRawData += 0x200;
        ++pS;
    }

    UnloadPEFile(pe); // unmapped !!!

    hFile = GetFileHandle(pe->cPath, GFH_OPENEXISTING_RW);
    SetFilePointer(hFile, dwHSize + 0x200, 0, FILE_BEGIN);
    WriteFile(
        hFile,
        pMem,
        dwMemSize,
        &dwBuff,
        NULL);
    CloseHandle(hFile);
    f(pMem);
    if (LoadPEFile(pe) != LPEF_SUCCESS)
    {
        HandleRemapError(hErrDlg);
        goto Exit;
    }

    // refresh PE info dlg
    ShowPEBaseInfo(hPEEditor);

    ret = LPE_OK;

Exit:
    return ret;
}
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 06.04.03 18:57 
das wird dir nicht viel nützen, da einige Funktionen wie GetRealSizeOfHeaders, UnloadPEFile weder im API noch sonst wo zu finden sind. Die sind also auch zu übersetzen, nur wo ist der sourcecode?

Besser, welches Problem soll damit gelöst werden? So wie es aussieht, wird via MemoryMappedFiles eine PE-Exedatei analysiert. Da das PE-Format frei ist, sollte es kein Prob sein, es gleich in D umzusetzen.

grez
msch
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: So 06.04.03 19:46 
Hallo,

Der Sinn des Codes ist:

Er soll einen PEHeader von einer EXE vergrößern.
Also
SizeOfHeders auslesen + 200h / speichern
Alle Sektionen ermitteln und dort der RAWOffset + 200h / speichern
Am ende der letzen Sektion soll er nun 200h = 512 Bytes (alle 00h) einfügen.

Die Datei wird um 512 Bytes größer.

Wer könnte das in Delphi machen?
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 07.04.03 14:50 
Hallo,

da ich mich mit PE-Header und so nicht auskenne wäre ich froh wenn Du mir erklären könntest was Deine Aufgabenstellung
Biarchiv hat folgendes geschrieben:
Er soll einen PEHeader von einer EXE vergrößern.
Also
SizeOfHeders auslesen + 200h / speichern
Alle Sektionen ermitteln und dort der RAWOffset + 200h / speichern
Am ende der letzen Sektion soll er nun 200h = 512 Bytes (alle 00h) einfügen.

für einen Zweck erfüllen soll.

Dank Dir!

Gruß
Tino
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Mo 07.04.03 15:54 
Hallo,

Ich habe einen EXE-Protector Lizenz der eine Sektion hinzufügt.
Der aber Platz benötigt im PEHeader.

Genau so geht es laut Coder:

Bekomme werte für SizeOfHeaders, addiere 200h dazu und trage den Wert wieder ein.
Bekomme den Wert wieviele Sektionen die EXE hat.
Bekomme von jeder Sektion den RAWOffset und addiere 200h dazu und speichere.
Dann nach der Letzten Sektion 200h Bytes (512 Bytes) einfügen.
Datei wird dadurch 512 Bytes größer.
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 07.04.03 20:43 
Biarchiv hat folgendes geschrieben:

Ich habe einen EXE-Protector Lizenz der eine Sektion hinzufügt.
Der aber Platz benötigt im PEHeader.

Hä?? :)
Erklär mal genauer für die Aya *grinst lieb*

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Mo 07.04.03 20:55 
Hallo,

Ich habe einen EXE-Protector der beim Protecten eine Section in der EXE hinzufügt.
Allerdings wenn kein Platz im Header ist kann er nicht protecten.

Wenn ich aber SizeOfHeader selber vergröße kann er wieder protecten.
Manchen Compiler lassen keinen Platz
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 08.04.03 11:20 
Sorry, das ich Dir nicht helfen kann. Aber von Deinen letzten beiden Beiträgen weiß ich immer noch nicht was das für einen Sinn macht. Vielleicht kannst Du mir mal erklären warum Du etwas in dieser Section hinzufügen willst ?!?! Mich interessiert das Thema nämlich auch!

Gruß
Tino
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 02.06.03 10:35 
@Biarchiv: Es reicht nicht, nur die SizeofHeaders zu vergrößern. Du musst noch einige andere Werte ändern. Ich arbeite gerade an einem PE-Explorer und werd ihn demnächst auf einer Homepage veröffentlichen. Der soll später diese Funktionalität auch haben. Also musst einfach mal was abwarten.

Die Homepage auf der er erscheinen wird ist www.digital-wings.de
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Mo 02.06.03 12:49 
Hallo ShadowCaster,

Danke für Deine Antwort.
Okay da warte ich noch gerne.

Kann ich dann diesen Teil des Sources haben oder
ist Open-Source.
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 02.06.03 12:51 
Ich werd dir gern den Teil des Sources geben. Ansonsten ist das Programm allerdings kein OS ;)

Ich bin zudem froh, dass sich in dem Forum doch noch einige Leute einfinden, die in diesem Bereich programmieren, denn solche Personen zu finden ist nicht gerade einfach :wink:
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Mo 02.06.03 13:07 
Hello ShadowCaster,

ja solche leute zu finden ist leider schwer.
Kenst du noch welche???

Wie gut kenst du dich aus?
Ich code gerade an einen PE-Protector und PE-Joiner.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 02.06.03 13:25 
Ich hab für meinen X-Spy auch geplant Infos über Module (Dlls und Exe) auszugeben. Bin momentan aber erst mit anderen Teilen beschäftigt, das kommt erst noch....

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
w3seek
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 64

Win XP; Win 2k; Suse 9.0
D5 Std, D6 Personal
BeitragVerfasst: Mo 02.06.03 15:51 
der Code uebersetzt nach delphi, alles was unbekannt ist hab ich entsprechend kommentiert:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
const
  LPE_HANDLEDERROR = 0// Keine Ahnung wie das deklariert wurde
  LPE_NOMEMORY     = 1// Keine Ahnung wie das deklariert wurde
  LPE_OK           = 2// Keine Ahnung wie das deklariert wurde

  LPEF_SUCCESS     = 0// Keine Ahnung wie das deklariert wurde

  GFH_OPENEXISTING_RW = 0// Keine Ahnung wie das deklariert wurde

var
  hPEEditor: HWND; // Globale Varible??? Welcher Typ?

type
  PIMAGE_SECTION_HEADER = ^IMAGE_SECTION_HEADER;
  LPE_STD_CODE = Cardinal; // Keine Ahnung wie das deklariert wurde
  // Keine Ahnung wie der Record aussieht, kann ich an dem Source code nicht erkennen
  PPE_INFO = ^TPE_INFO;
  TPE_INFO = record // keine Ahnung wie und in welcher Reihenfolge der Record deklariert wurde
    pNTh: ^IMAGE_NT_HEADERS;
    pMap: Pointer; // keine Ahnung welcher Typ deklariert wurde
    pSech: PIMAGE_SECTION_HEADER; // Ich hoffe das wurde so deklariert
    dwFileSize: DWORD; // keine Ahnung welcher Typ deklariert wurde
    cPath: String// keine Ahnung welcher Typ deklariert wurde, vermutlich array[0..MAX_PATH] of Char;
  end;

function GetRealSizeOfHeaders(Map: Pointer): Cardinal;
// Keine Ahnung welcher Rueckgabetyp und welcher Parameter
begin
  // ???
end;

procedure ShowError(hWnd: HWND; const Msg: String);
// Ich nehme an, die Funktion wurde so deklariert
begin
  // ???
end;

procedure HandleRemapError(hWnd: HWND);
// Ich nehme an, die Funktion wurde so deklariert
begin
  // ???
end;

procedure UnloadPEFile(pe: PPE_INFO);
// Ich nehme an, die Funktion wurde so deklariert
begin
  // ???
end;

function LoadPEFile(pe: PPE_INFO): Cardinal;
// Ich nehme an, die Funktion wurde so deklariert
begin
  // ???
end;

function GetFileHandle(const Path: String; dwMode: DWORD): THandle;
// Keine Ahnung welcher Rueckgabetyp und welcher Parameter
begin
  // ???
end;

procedure ShowPEBaseInfo(hPEEditor: HWND);
// Keine Ahnung welcher Parameter
begin
  // ???
end;

function EnlargeHeader(pe: PPE_INFO): LPE_STD_CODE;
var
  hErrDlg: HWND;
  dwHSize, dwBuff, i: DWORD;
  pS: PIMAGE_SECTION_HEADER;
  hFile: THandle;
  pMem: Pointer;
  dwMemSize: DWORD;
begin
  Result := LPE_HANDLEDERROR;
  hErrDlg := GetActiveWindow;
  // possible ?
  //if pe^.pNTh^.OptionalHeader.SizeOfHeaders >= $1000) then
    if (GetRealSizeOfHeaders(pe^.pMap) >= $1000then begin
      ShowError(hErrDlg, 'The maximum SizeOfHeaders (0x1000) is already reached !');
      Exit;
    end;

  // move the sections 0x200 bytes back
  dwHSize := GetRealSizeOfHeaders(pe^.pMap);
  dwMemSize := pe^.dwFileSize - dwHSize;
  GetMem(pMem, dwMemSize); // Ich hoffe, dass m(dwMemSize) speicher reserviert....
  if not Assigned(pMem) then begin
    Result := LPE_NOMEMORY;
    Exit;
  end;
  Move(Pointer(DWord(pe^.pMap) + dwHSize)^, pMem^, dwMemSize);
  pe^.pNTh^.OptionalHeader.SizeOfHeaders := dwHSize + $200;
  pS := pe^.pSech;
  for i := 0 to pe^.pNTh^.FileHeader.NumberOfSections - 1 do begin
    if pS^.PointerToRawData <> 0 then // Watcom C/C++
      Inc(pS^.PointerToRawData, $200);
    Inc(pS); // Ich hoffe das ist so richtig, ++pS; (wuerde ja vor der Anweisung inkrementieren)
  end;
  UnloadPEFile(pe); // unmapped !!!
  hFile := GetFileHandle(pe^.cPath, GFH_OPENEXISTING_RW);
  SetFilePointer(hFile, dwHSize + $200nil, FILE_BEGIN);
  WriteFile(hFile, pMem^, dwMemSize, dwBuff, nil);
  CloseHandle(hFile);
  FreeMem(pMem); // Ich hoffe, dass f(pMem) speicher freigeben sein soll....
  if LoadPEFile(pe) <> LPEF_SUCCESS then begin
    HandleRemapError(hErrDlg);
    Exit;
  end;
  ShowPEBaseInfo(hPEEditor);
  Result := LPE_OK;
end;
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Mo 02.06.03 17:22 
So Biarchiv. Ich konnte dir das Ding leider heute nicht übersetzen aus Zeitmangel. Aber da war ja schon jemand so nett :wink: Was den PE-Explorer angeht, so komm ich sehr gut vorran und falls ich einige Fehler noch beheben kann, werd ich hier morgen mal die erste Version des sehr kleinen Programms veröffentlichen. News gibts dann immer im Forum oder auf der Homepage, wie ihr wollt. Natürlich wird es nicht bei einem PE-Explorer bleiben. Das Programm soll noch ziemlich erweitert werden und ich hab da noch so einiges geplant.

Also bis dann

Gruß
Shadow
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 02.06.03 17:31 
ShadowCaster hat folgendes geschrieben:
PE-Explorer

Soll der so was ähnliches werden, wie der PE-Viewer

_________________
Ist Zeit wirklich Geld?
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Di 03.06.03 09:30 
Ja, nur da sind noch einige Features mehr geplant wie Disassembler und Hexeditor, Hexcalculator, etc. Man soll auch PE-Files reparieren können, das Proggie soll Checksummen berechnen können, Sektionen und Recourcen extrahieren bzw. hinzufügen, etc. Das Ding soll das ultimative Helptool im Umgang mit Executables werden. Bis auf einen kleinen Bug ist der PE-Explorer jetzt fertig. Ich werd ihn nochmal überarbeiten und dann heut im Forum schonmal zum Downlaod bereitstellen. Die neuen Versionen gibt es dann auf meiner Homepage die nächsten Tage und Wochen.