Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 08.11.07 17:26 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure ftest(s:WideString);stdcall;
begin
  If(s=WideString('TEST')) then showmessage('GAAAANZ toll!');
end;



Aufruf So:
ausblenden Delphi-Quelltext
1:
2:
PUSH EDI
CALL ftest


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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Do 08.11.07 19:01 
Hi,
ich würde es mal mit PWideChar versuchen...

MfG Thorben
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure ftest(s:WideString);stdcall;
begin
  If(s=WideString('TEST')) then showmessage('GAAAANZ toll!');
end

kommt das raus:
ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure ftest(s:PWideString);stdcall;
begin
  If(s^=WideString('TEST')) then showmessage('GAAAANZ toll!');
end;

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 09.11.07 13:26 
hab jetzt nen test gemacht:
ausblenden 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:
ausblenden 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^<>0and (bp2^<>0do begin
    If(bp1^<>bp2^) then begin
      Result:=false;
      break;
    end;
    Inc(bp1,2);Inc(bp2,2);
  end;
  If((Result) and (((bp1^=0and (bp2^<>0)) or (bp2^=0and (bp1^<>0))) then Result:=false;
end;

das "if(s^=WideString('TEST'))" klappt nicht...warum auch immer...wird immer false

gibts was effektivferes?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden 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^ <> 0and (s2^ <> 0do begin
    If(s1^ <> s2^) then begin
      Result:=false;
      break;
    end;
    Inc(s1);
    Inc(s2);
  end;
  If((Result) and (((s1^=0and (s2^<>0)) or (bp2^=0and (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.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.