Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Digitale Signaturen (Authenticode) von Dateien auslesen

  Alt 15. Feb 2023, 14:26
Nach etwas Zögern hab ich den C++-Code mit Visual Studio selbst kompiliert und anschließende Tests bestätigen die Vermutung, dass damit mehr als zwei Signaturen auslesbar sind.

Nun wollte ich den Code nach Delphi übersetzen, aber ich komme auf keinen grünen Zweig. Aktuell ist meine Übersetzung instabil, d.h. mal wird aus derselben Datei eine Signatur gelesen, dann doch wieder zwei (und mehr als zwei hab ich noch nicht erreichen können).

Nachfolgend einige konkrete Code-Beispiele, in der Hoffnung, dass darin mein (Denk)Fehler zu finden ist.

Code:
CONST UCHAR SG_ProtoCoded[] = {
    0x30, 0x82,
};

CONST UCHAR SG_SignedData[] = {
    0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02,
};
habe ich übersetzt mit
Delphi-Quellcode:
const
  SG_ProtoCoded: array[0..1] of Byte = ($30, $82);
  SG_SignedData: array[0..8] of Byte = ($2a, $86, $48, $86, $f7, $0d, $01, $07, $02);
Ist das korrekt? Was bedeuten die abschließenden Kommas im C++?

Die Makros und deren Benutzung hab ich so übersetzt:
Code:
#define XCH_WORD_LITEND(num) \
    (WORD)(((((WORD)num) & 0xFF00) >> 8) | ((((WORD)num) & 0x00FF) << 8))

#define _8BYTE_ALIGN(offset, base) \
    (((offset + base + 7) & 0xFFFFFFF8L) - (base & 0xFFFFFFF8L))


cbCurrData = XCH_WORD_LITEND(*(WORD *)(pbCurrData + 2)) + 4;
pbNextData += _8BYTE_ALIGN(cbCurrData, (ULONG_PTR)pbCurrData);
Delphi-Quellcode:
var
  LpbCurrData, LpbNextData: PByte;
  LcbCurrData: DWORD;

    function BigEndianToLittleEndian(const A: Word): Word;
    begin
        Result:= Word(((A AND $FF00) shr 8) OR ((A AND $00FF) shl 8));
    end;

    function _8ByteAlign(const offset, base: NativeUInt): NativeUInt;
    begin
        Result:= ((offset + base + 7) AND $FFFFFFF8) - (base AND $FFFFFFF8);
    end;


//LcbCurrData:= Swap(Word(LpbCurrData)+2) + 4;
LcbCurrData:= BigEndianToLittleEndian(Word(LpbCurrData)+2) + 4;
Inc(LpbNextData, _8ByteAlign(LcbCurrData, ULONG_PTR(LpbCurrData)));
Was bedeutet der erste Stern in diesem Aufruf
Code:
cbCurrData = XCH_WORD_LITEND(*(WORD *)(pbCurrData + 2)) + 4;
Was genau wird da übergeben? Ein Pointer auf einen Pointer auf ein Word?

Oder liegt das Problem in der Abbruchbedingung?
Code:
    if (memcmp(pbCurrData + 0, SG_ProtoCoded, sizeof(SG_ProtoCoded)) ||
        memcmp(pbCurrData + 6, SG_SignedData, sizeof(SG_SignedData)))
    {
        break;
    }
Delphi-Quellcode:
    if ((NOT CompareMem(PByte(NativeUInt(LpbCurrData) + 0), @SG_ProtoCoded, SizeOf(SG_ProtoCoded))) OR
       ((NOT CompareMem(PByte(NativeUInt(LpbCurrData) + 6), @SG_SignedData, SizeOf(SG_SignedData))))) then
           Break;

Grüße
Dalai
  Mit Zitat antworten Zitat