2010-12-02 2 views
1

Ich versuche, einen "Shunt" für eine vorhandene Anwendung zu schreiben, um Daten auszuspähen, damit ich sie in einige Analysen integrieren kann, die ich versuche, durchzuführen, aber ich habe eine Sackgasse erreicht. Ich habe die Anweisungen isoliert, von denen ich lesen möchte, aber ich weiß nicht genau, wie ich das erreichen soll.Wie kann ich einen Prozess anhängen und von bestimmten Anweisungen lesen?

Dies ist der Befehlssatz I (speziell der Wert von 00412159) zu isolieren bin versucht:

00412153 - mov [eax+04],edx 
00412156 - fld dword ptr [ecx+08] 
00412159 - fstp dword ptr [eax+08] 
0041215c - ret 
0041215d - int 3 

Ergebnisse von drei Speicher Scans für die gleiche Variable ergab folgende Ergebnisse:

EAX=1798B4E0 
ECX=0018D5C0 
EDX=00000016 

EAX=18D96298 
ECX=0018D5C0 
EDX=00000016 

EAX=18D3DCA8 
ECX=0018D5C0 
EDX=00000016 

Wenn ich einen Debugger an das laufende Programm angehängt habe, ist der Wert, den ich möchte, bei EAX, aber der Wert von EAX ändert sich jedes Mal, wenn der Zielprozess neu gestartet wird.

Offensichtlich, was ich renne, ist DMA (Dynamic Memory Access) alias Heap-Based Memory Allocation und dies verursacht die Zeigerzuordnung zur Laufzeit generiert werden. Meine kurze Untersuchung des Themas zeigt, dass die zwei Komponenten, die ich herausfinden muss, ein statischer Basiszeiger sind und der Offset, der verwendet wird, um den Laufzeitzeiger zu erreichen.

Ich habe insgesamt 4 Stunden Erfahrung mit ASM verbracht, so dass mein Problem sein könnte, oder ich bin nur ein Problem anzugehen, das derzeit aus meiner Liga ist. Irgendwelche Ideen über den besten Weg, um den Wert aus der Anweisung bei 00412159 oder einen Vorschlag, wie der Basiszeiger und Offset zu finden?

+1

Können Sie bitte klarstellen, was Sie mit "Lesen von einer bestimmten Anweisung" meinen? Was meinst du mit "Speicherscans"? Die Art, wie Sie es verwenden, lässt mich eher glauben, dass Sie die Daten überprüfen wollen, auf die der Befehl bei '00412159' zugreift, und Sie sind überrascht, dass sich das für den Zugriff auf diese Daten verwendete Register jedes Mal ändert, wenn Sie Ihren Haltepunkt erreichen. –

Antwort

0

Entschuldigung für die späte Antwort.

Grundsätzlich weist die Anwendung beim Start dynamisch Speicher zu. (Denken Sie malloc oder etwas in High-Level-Programmierung)

Wenn Sie diesen Zuordnungscode finden, können Sie die Adresse des Beginns des Speichers zugewiesen finden und es ist Größe, die ich denke, wichtige Variablen zu wissen. Geben Sie dann einen Haltepunkt bei 00412159 ein und führen Sie eine Rückwärtsverfolgung durch, indem Sie manuell in den Code gehen und dort suchen, wo EAX mit dieser dynamischen Adresse initialisiert wurde.

Dann müssen Sie mit Ihrem Debugger arbeiten.

Abgesehen davon war das Besiegen von DMA immer eine Frage der Erfahrung und des Debuggens, da jedes Programm anders ist. Wenn Sie hier ein Assembly-Listing veröffentlichen, kann ich Ihnen vielleicht in die richtige Richtung helfen.

Verwandte Themen