2010-10-24 6 views
5

Ich möchte lernen, andere Prozesse Speicher lesen und haben mein Programm die anderen Prozesse Funktionen aufrufen und was nicht mit meinen eigenen Parametern und Sachen. Ich habe es gegoogelt und es scheint, dass Sie Dinge wie ReadProcessMemory verwenden müssen, aber ich konnte keine guten Tutorials finden, die erklären, wie man sie benutzt. Kann mir jemand in die richtige Richtung zeigen, solche Dinge zu lernen? Ich möchte es in C++ (oder Java wenn möglich) unter Windows (7 und 64bit, wenn das wichtig ist).Wie können Sie auf Speicher eines anderen Prozesses zugreifen und seine Funktionen aufrufen?

Ich weiß auch, dass dies subjektiv klingt und für bösartige Zwecke verwendet werden könnte, aber ich garantiere, dass ich keine daraus gewonnenen Erkenntnisse aus irgendwelchen schädlichen Gründen verwenden werde. Ich will das nur aus Spaß lernen und mir etwas Neues beibringen.

+0

Was genau wollen Sie * tun * mit Readprocessmemory? Ihre Frage ist nicht spezifisch genug. – wj32

+1

Nun, ich war auf der Suche nach jemanden, der ein Tutorial vorschlägt, wie man Dinge wie ReadProcessMemory und whatnot benutzt. Ich habe momentan nicht wirklich etwas Bestimmtes im Sinn. Was ich im Grunde tun möchte, ist zu lernen, meine eigenen Programme zu "hacken". Ich möchte etwas wie ein Programm machen, das den Benutzer auffordert, die obige Zeichenfolge einzugeben, um fortzufahren. Dann möchte ich einen 'Bot' machen, der den Speicher des Prozesses liest, um zu sehen, was der String ist, und ihn dann selbst eingeben. Ich möchte nur mit solchen Dingen herumspielen, aber ich weiß nicht, wo ich anfangen soll. – krej

Antwort

5

Sie können Funktionen in anderen Prozessen nicht direkt aufrufen, da Ihr Prozess und der andere Prozess unterschiedliche Adressräume haben. Eine Möglichkeit, dies zu umgehen, besteht darin, einen Remote-Thread im Prozess zu erstellen (mit CreateRemoteThread oder RtlCreateUserThread), der jedoch nur die Übergabe eines Parameters an die Funktion zulässt. Sie könnten versuchen, einen Remote-Thread zu erstellen, die Parameter in seinen Stack zu schreiben und seine Register mit SetThreadContext zu ändern. Eine andere Möglichkeit besteht darin, eine eigene DLL zu injizieren, die die Funktion aufruft.

Ein anderes Problem ist das Auffinden der aufzurufenden Funktion. Sie müssten wahrscheinlich Symbole für EXEs oder DLLs laden, bei denen die von Ihnen benötigte Funktion nicht exportiert wird.

Bei allgemeinen Fragen zu Windows-Interna fragen Sie bitte nach Sysinternals Forums.

EDIT: Was Sie gesagt haben (Lesen einer Zeichenfolge, die der Prozess gegen Benutzereingabe prüft) ist sehr schwer in einem Programm zu tun, ohne vorher das Layout der Anweisungen und Daten in der Bilddatei zu kennen. Wenn Sie beispielsweise ein Crackme-Programm haben, verwenden Sie entweder ein statisches Analysetool wie IDA Pro oder führen das Programm unter einem Debugger aus. In beiden Fällen erfordern diese Dinge normalerweise menschliche Eingaben und sind schwer automatisch zu erledigen.

+0

Downvoter: erklären Sie sich. – wj32

1

Processes, von Entwurf und Definition sind voneinander isoliert. Sie haben einen separaten Adressraum.

Das Betriebssystem hält seine Prozesse getrennt und ordnet die Ressourcen, die sie benötigen, so dass sie weniger wahrscheinlich mit jedem andere ...

einzumischen Sie können sicher kommunizieren, aber nur, wenn sie sich dafür entscheiden, durch irgendeine Form von inter-process communication.

Jedoch teilen , manchmal bekannt als leichtgewichtiger Prozess, ihren Adressraum und können die Datenstrukturen jeder anderen lesen.

Nicht sicher, was Sie meinten, durch

Aufruf die anderen Prozesse funktioniert

Eine Funktion f() kann in mehrere Prozesse ausführbaren Code kompiliert werden. Prozess A und Prozess B können in ihrem Kontext unabhängig voneinander f() aufrufen.

Andernfalls kann Prozess A mit Prozess B "kommunizieren", um eine Aktion auszuführen, die z. B. in Funktion g() in B implementiert werden kann.B kann es in seinem Kontext ausführen und das Ergebnis an A "kommunizieren".

0

Ich sehe keinen nützlichen Nutzen davon, aber trotzdem. Es gibt mindestens zwei Möglichkeiten, einen anderen Prozess aufzurufen:

1) CreateRemoteThread(), erstellt einen Thread in einem Prozess.

2) QueueUserAPC() wird einen vorhandenen Thread in diesem Prozess eine Callback-Funktion aufrufen.

Wenn ASLR deaktiviert ist, genügt es, eine Funktion ohne Parameter aufzurufen. Sonst benötigen Sie auch VirtualQueryEx(), ReadProcessMemory() und WriteProcessMemory().

Ja, und es ist nicht etwas in Java zu tun :)

+0

Benutzer-APCs werden nicht ausgeführt, wenn der Thread keine warnbare Wartezeit ausführt. Die meisten Threads nicht. – wj32

+0

@ wj32 richtig, aber wenn ein anderer Prozess Ihr ist, dann können Sie sie alarmierbar machen. – ruslik

+0

Aber, nach dem Ziel des OPs zu urteilen, wäre das Betrug. :) Natürlich sollte es möglich sein, einen entfernten Thread bei NtTestAlert zu erstellen, so dass der Thread die APC unmittelbar nach der Wiederaufnahme ausführt. – wj32

Verwandte Themen