Quote:
Originally Posted by Padmak
Nein, er kopiert ja EDX in den Pointer, also zeigt der Pointer auf 'nen Buffer (vermutlich aufm Stack)
Dass das an sich 'ne ziemlich unsichere und ... naja einfach schlechte Methode ist, ist auch offensichtlich
Padmak
|
Achjo, stimmt.
Nein, ein Smart Pointer wäre da absoluter Mumpitz. Wenn er sich den Pointer vom Zielprogramm klaut, kann er nicht einfach Annahmen machen, die voraussetzen, dass er den Pointer besitzt und weiß, wo er verwendet wird, aber genau das tun die genannten Smart Pointer.
Wenn, dann könnte man zu einem weak_ptr greifen, wobei ich gerade nicht weiß, ob der ohne einen shared_ptr existieren kann. shared_ptr ist jedenfalls genau so falsch wie unique_ptr, weil sie den Speicher in ihrem Destruktor einfach freigeben, obwohl sie weder wissen können, womit er reserviert wurde (schonmal nen VirtualAlloc Block versucht zu delete'n?) noch wann sie ihn überhaupt freigeben dürfen.
Dass Stackspeicher sowieso nicht freigegeben werden darf, ist ebenfalls eine Einschränkung, solltest du mit deiner Annahme, es handele sich um einen Pointer auf einen Stackbereich, richtig liegen.
Und ob der Pointer auf etwas auf dem Stack zeigt, kann nur der OP sagen. Selbst dann muss er nicht zwingend sofort ungültig werden, es kommt auf den Stackframe an. Wenn es eine lokale Variable der WinMain ist, die irgendwo bis ins tiefste Level durchgereicht wird, kann er Pointer darauf durchaus nutzen.
Was mir gerade auffällt:
Was sollen die pushad und pushfd Anweisungen? Es wird doch gar nicht schreibend auf die Register zugegriffen. Durch das Pushen der Register verringert sich der Stackpointer (ESP). Im Falle einer cdecl Funktion verschiebt sich dadurch der Zugriff auf lokale Variablen, was der Compiler aber nicht weiß. Somit wird dann falsch auf Packet zugegriffen.
Entweder solltest du den Teil ganz in Asm schreiben, um ungewollte Registerzugriffe zu vermeiden und zu wissen, wo was passiert oder du schreibst ihn ganz in C, außer halt das eine Auslesen von EDX (oder nutzt die fastcall Convention). Dieses sinnlose Pushen von Registern ist jedenfalls ein potenzielles Problem, ohne einen wirklichen Nutzen zu bringen.