In 'kompilierte' Resource Scripts kannst du alles mögliche an binären Daten reinpacken.
Sie werden auch nicht wirklich kompiliert, es werden halt alle Resourcen zusammen in eine Datei gemerged und mit Headern versehen, sodass man alles wieder auslesen kann.
Möchtest du einen RES-Datei Editor schreiben, oder einen, der innerhalb von Binärdateien die Resourcen verändert/entpackt?
[1.
] Auslesen der Resourcen aus
Executables:
Falls das Zweite zutrifft, müsstest du dir die PE-Dokumentation durchlesen.
Ungefähr so sollte es funktionieren:
Du liest den Data Directory Eintrag der Resource Table aus, um deren RVA zu erhalten.
Ab dieser liest du ab dem Offset 12 und 14 jeweils ein WORD aus, um die Anzahl an Resourcen zu bekommen (zusammen addiert; das erste WORD steht für die Anzahl der Resourcen, deren Typ über Strings angegeben werden, bei den anderen wird es über eine ID geregelt). Falls das erste WORD also ungleich 0 ist, erhältst du am Offset 16 eine RVA zum Typen der Resource als String, ansonsten stellt das DWORD eine ID dar.
Danach liest du noch einmal 4 Bytes aus und, falls das höchste Bit gesetzt ist, musst du eine Ebene tiefer gehen (die 4 Bytes enthalten eine RVA).
Du liest also erneut 4 Bytes aus RVA + 20 und testest wieder, ob das höchste Bit gesetzt ist.
Falls es wieder der Fall sein sollte, wiederholst du diesen Schritt.
Sollte das Bit nicht gesetzt sein, so gelangst du mit der RVA zur Resource Data.
Dann findest du in den nächsten 4 Bytes die RVA zur RAW Resource und dahinter, auch als DWORD, die Größe.
Danach gehst du wieder zurück zur RVA der Resource Table + 16, wo du die ID der ersten Resource bekommen hast, und noch 8 Bytes weiter, um einen neuen Resource-Eintrag vorzufinden. Dann wiederholst das Erlangen der ID und der RVA zur Resource Data, bis du die Anzahl der Resourcen durch bist (Dekrementieren dieser nicht vergessen, um unterscheiden zu können, ob der Typ über einen String oder eine ID abfragbar ist.
[2.
] Auslesen der Resourcen aus
kompilierten Resource Scripts:
Falls das Erste zutreffen sollte, findest du im allerersten DWORD die Größe der Resource Datei, darauffolgend die Größe des Headers, der je nachdem, ob ein UNICODE String oder eine ID (wie oben) den Typen enthält, in dieser variieren kann.
Falls du im fünften WORD (also am Offset 8) FFh vorfinden solltest, handelt es sich um eine gepaddete ID in der Größe eines WORDs. Dann folgen ein paar Flags und nach dem Header (wessen Größe man ja bereits ausgelesen hat), folgt die Resource, deren Größe man im ersten DWORD hatte.
Also weiß man, wo der nächste Header anfängt, wo man die Prozedur dann wiederholen muss :-)
Nähere Informationen zum Header findest du hier:
Hoffe, es hilft dir weiter.