Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Unicode-String vergleichen
Flamefire - Do 08.11.07 17:26
Titel: Unicode-String vergleichen
Ich habe einen String als Unicode vorliegen und möchte den mit einer Konstante vergleichen
der wert kommt aus einem anderen Programm (injection)
wie mach ich das?
Ansatz:
Delphi-Quelltext
1: 2: 3: 4:
| procedure ftest(s:WideString);stdcall; begin If(s=WideString('TEST')) then showmessage('GAAAANZ toll!'); end; |
Aufruf So:
Aber ich krieg nur nen Programmabsturz...
bei "If(s='TEST')" und s:String vergleicht er nen ASCII mit nem Unicode string
bei nur S:String kommt ebenfallse der Fehler(Absturz)
Carlo91 - Do 08.11.07 19:01
Hi,
ich würde es mal mit PWideChar versuchen...
MfG Thorben
Flamefire - Do 08.11.07 19:55
glaub nicht dass das geht
selbst wenn ich das s:String setze wird irgendeine typenumwandlung von dem param gemacht
und dabei tritt der fehler auf, da der typ ja schon ok ist (Unicode)
Bei
Delphi-Quelltext
1: 2: 3: 4:
| procedure ftest(s:WideString);stdcall; begin If(s=WideString('TEST')) then showmessage('GAAAANZ toll!'); end |
kommt das raus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 04851ED4 55 PUSH EBP 04851ED5 8BEC MOV EBP,ESP 04851ED7 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8] 04851EDA E8 8D29FBFF CALL test.0480486C 04851EDF 33C0 XOR EAX,EAX 04851EE1 55 PUSH EBP 04851EE2 68 1C1F8504 PUSH test.04851F1C 04851EE7 64:FF30 PUSH DWORD PTR FS:[EAX] 04851EEA 64:8920 MOV DWORD PTR FS:[EAX],ESP 04851EED 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] 04851EF0 BA 2C1F8504 MOV EDX,test.04851F2C ; UNICODE "TEST" 04851EF5 E8 5E28FBFF CALL test.04804758 |
und bei
Delphi-Quelltext
1: 2: 3: 4:
| procedure ftest(s:PWideString);stdcall; begin If(s^=WideString('TEST')) then showmessage('GAAAANZ toll!'); end; |
Quelltext
1: 2: 3: 4: 5:
| 04871EB4 55 PUSH EBP 04871EB5 8BEC MOV EBP,ESP 04871EB7 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] 04871EBA 8B00 MOV EAX,DWORD PTR DS:[EAX] 04871EBC BA DC1E8704 MOV EDX,test.04871EDC ; UNICODE "TEST" |
Is also schon besser...aber stimmt ebn nicht
und bei dem oben macht er irgendeine typenumwandlung, bei der der fehler auftritt
Flamefire - Fr 09.11.07 13:26
hab jetzt nen test gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure ftest(s:PWideString);stdcall; begin if(s^=WideString('TEST')) then MessageBox(Form1.Handle,'TAG','TOP',MB_OK); end;
procedure TForm1.Button1Click(Sender: TObject); var a:WideString; begin a:='TEST'; asm lea edi,a push edi call ftest end; end; |
so sollte es dann auch im hook gehen...
kann mir jemand sagen, warum das lea edi...da rein muss?
eigendlich macht er ja nix andres als den @a-4 in edi einzulesen
also wenn ich "lea edi,edi" mache dann ist das doch gleich wie "sub edi,4"
also wozu?
EDIT:
damit gehts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Function compareUC(s1:PWideString;s2:WideString):boolean; var i:Integer;bp1,bp2:PByte; begin Result:=true; bp1:=PByte(s1^); bp2:=PByte(s2); While(bp1^<>0) and (bp2^<>0) do begin If(bp1^<>bp2^) then begin Result:=false; break; end; Inc(bp1,2);Inc(bp2,2); end; If((Result) and (((bp1^=0) and (bp2^<>0)) or (bp2^=0) and (bp1^<>0))) then Result:=false; end; |
das "if(s^=WideString('TEST'))" klappt nicht...warum auch immer...wird immer false
gibts was effektivferes?
Lossy eX - Sa 10.11.07 00:36
Warum es knallt wenn du einen Pointer auf den Stack packst und den als WideString interpretierst wird wohl daran liegen, dass Strings in Pascal noch Zusatzinfos vor dem aktuellen Pointer haben. Bei Strings sind es 12 Bytes. Wie viel es bei WideStrings sind weiß ich nicht. Aber ich denke mal es werden auch 12 Byte sein.
Also bei WideStrings solltest du auch WideStrings vergleichen und nicht nur Bytes. Bei 'Test' macht es zwar keinen Unterschied allerdings bei allen anderen Zeichen ist das Ergebnis nicht richtig, da du das Zweite einfach Stumpf ignorierst.
Ich würde dir Empfehlen permanent mit pWideChar zu arbeiten. Das ist dann einfach nur konsequent und vereinfacht auch das verstehen des Codes.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Function compareUC(s1, s2:PWideString):boolean; var i:Integer; begin Result:=true; While(s1^ <> 0) and (s2^ <> 0) do begin If(s1^ <> s2^) then begin Result:=false; break; end; Inc(s1); Inc(s2); end; If((Result) and (((s1^=0) and (s2^<>0)) or (bp2^=0) and (bp1^<>0))) then Result:=false; end; |
An dem Code könnte man so sicherlich noch etwas machen. Allerdings wenn es nichts Zeitkritisches ist genügt das vollkommen. Mit der Optimierung von Delphi dürfte das doppelte Referenzieren aber auch optimiert werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!