Autor Beitrag
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 12.02.05 16:06 
ohne das du mich jetzt steinigst ich habs mir nicht angeguckt werfe aber einfach aml was in den raum

ausblenden Delphi-Quelltext
1:
.text:100034DA                 retn    18h					


18h = 24 div 4 = 6 parameter?

[img]
www.arschvoll.net/ymsg.jpg
[/img]

olly ist auch meiner meinung

bei stdcall ist es doch immer so das RET die anzahl der parameter zurückgibt oder sehe ich das falsch? (und über stdcall sind wir uns soch einig assarbad)
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 12.02.05 16:30 
SchwiegerSohn hat folgendes geschrieben:
in result_6 und Result_96 sind dann die ergebnisse drin..

Dann musst du auch Speicher reservieren!!! Das macht nicht die DLL für dich. Ist doch klar im VB Beispiel zu erkennen.

_________________
Ciao, Sprint.
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.02.05 16:33 
uall@ogc hat folgendes geschrieben:
ohne das du mich jetzt steinigst ich habs mir nicht angeguckt werfe aber einfach aml was in den raum

.text:100034DA retn 18h

18h = 24 div 4 = 6 parameter?
Interessantes Argument. Allerdings kann man sich bei heutigen Compilern schwerlich auf dieses Argument verlassen, da die den Stackpointer jederzeit mal nach gusto modifizieren. Man müßte also zum Nachweis dieses Arguments alle Zugriffe auf ESP überprüfen.

Aber wäre immerhin möglich.

Ich nehme jedoch eher an, daß es sich um die Stackbereinigung nach den beiden C-Funktionen free() handelt. Es gibt zwar bereits das "add esp, 20h", aber man müßte eben mit einem Rechner durchgehen und die ESP-Werte notieren. Da IDA das für mich macht und anzeigt, falls mit dem Stackpointer was nicht stimmt, bin ich zuversichtlich, daß dies nur eine Optimierung seitens des Compilers ist:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
.text:100034BF                 mov     edi, ds:free
.text:100034C5                 push    ecx             ; void *
.text:100034C6                 call    edi ; free
.text:100034C8                 push    esi             ; void *
.text:100034C9                 call    edi ; free
.text:100034CB                 add     esp, 20h
.text:100034CE                 mov     al, 1
.text:100034D0                 pop     edi
.text:100034D1                 pop     esi
.text:100034D2                 pop     ebp
.text:100034D3                 pop     ebx
.text:100034D4                 add     esp, 6B4h
.text:100034DA                 retn    18h
.text:100034DA YMSG12_ScriptedMind_Encrypt endp


uall@ogc hat folgendes geschrieben:
bei stdcall ist es doch immer so das RET die anzahl der parameter zurückgibt oder sehe ich das falsch? (und über stdcall sind wir uns soch einig assarbad)
Jupp, sind wir ;)


Zuletzt bearbeitet von Gast am Sa 12.02.05 16:36, insgesamt 1-mal bearbeitet
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 12.02.05 16:33 
naja eigentlich schaue ich immer nur auf RET um bei einer stdcall Funktion zu gucken wieviele Parameter die Funktion hat, olly macht glaub ich nichts anderes

aber Delphi bzw. c++ wird aus einer stdcall Funktion nie irgendetwas wie das machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure aha(a: integer); stdcall;
asm
  PUSH EAX
  ...
  ...
  ...
  RET 8 (weil EAX nicht vom stack genommen wurde)

end;


sondern es sieht immer so aus (um die register wieder herzustellen) dafür ist halt stdcall auch gedacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure aha(a: integer); stdcall;
asm
  PUSH EAX
  ...
  ...
  ...
  POP EAX
  RET 4 (nur für den parameter)
end;


man kanns beim epilog ja sehen das die Funktion das genau so macht


man könnte nun einmal die Funktion mit 4 und 6 Parametern aufrufen, bei eins vom beiden MUSS es crashen da halt entweder zu viel vom stack genommen wird oder zu wenig und somit die Rücksprungadresse falsch ist
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.02.05 17:00 
Mist :mrgreen:, du hast. Es könnte tatsächlich so sein. Es kommt vor, daß IDA nicht alle Parameter identifiziert, wenn sie nicht alle benutzt werden (innerhalb der Funktion). Ich schaue es mir gerade nochmal in IDA an.

//Edit

KORREKTUR:

Gucke ich mir die Stackanalyse von IDA an, kommt die Größe hin (arg_10 an Offset 14h + sizeof(arg_10) == 18h):
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
00000000  r              db 4 dup(?)
+00000004                 db ? ; undefined
+00000005                 db ? ; undefined
+00000006                 db ? ; undefined
+00000007                 db ? ; undefined
+00000008 arg_4           dd ?
+0000000C arg_8           dd ?
+00000010 arg_C           dd ?                    ; offset (FFFFFFFF)
+00000014 arg_10          dd ?                    ; offset (FFFFFFFF)
+00000018
+00000018 ; end of stack variables

Wäre natürlich die Frage, ob da an Offset 4 noch was rumlungert. Offset 0 ist ja die Return-Adresse.