"Größe einer Funktion"
-
Manfred Schmidtke schrieb:
Ansonsten brauchts da keine Funktionen. char-Pointer holen, nachschauen auf welchen Wert er zeigt, Pointer weiterverschieben bis 0xC3 (=195). Differenz = Größe.
Ja ich meine es ernst
Es geht um meinen eigenen Prozess aber könntest du diesen Satz von dir etwas weiter erklären?
Ich dachte an folgendes:char buffer[4096]; DWORD bread; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrrentProcessId()); ReadProcessMemory(hProcess, somefunction, buffer, 4096, &bread);
Dann sollte ich ja den Speicherbereich im buffer haben (zur not weiter suchen)
aber wie finde ich dieses "C3" im buffer?Danke
-
Wozu brauchst du das eigentlich? Reicht es dir nicht, einfach im Debugger nachzuschauen, wie groß die Funktion ist?
-
Und wie willst du den Anfang der Funktion finden? Die haben ja keinen Namen mehr.
-
Jetzt gehts es aber hier los
Für Ringding: Die Vorgehensweise ist sicherlich nicht plattform- oder compilerübergreifend. Im Code-Segment steht jedoch nur Code. Irgendwelche Daten sind auf Stack und Heap etc. verteilt. Ein vorzeitiges Return führt im ausführbaren Code nur zu einem Sprungbefehl auf das ret, da in aller Regel noch Stack aufzuräumen ist.
Aber ist das wichtig
Für icy: Was soll ProcessMemory mit dem Parameter somefunction? C3 ist hexadezimal und steht für dezimal 195. Das kriegt Du, indem Du den Speicherbereich Byte für Byte durchgehst, bis ein Byte den Wert 195 enthält.
-
DWORD GetFunctionSize(void *address) { HANDLE hProcess; char buffer[4096]; DWORD bytesread; DWORD i; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); if (hProcess == NULL) return -1; if (ReadProcessMemory(hProcess, address, buffer, 4096, &bytesread) == 0) return -1; for (i=0;i<bytesread;i++) { if (buffer[i] == 0xC3) // 195/ret return i; } return -1; }
Das sollte nur mal ne Testfunktion sein aber scheint nicht hinzuhauen
-
static void HalloBallo() { } static void NurZuBesuch() { } DWORD dwFuncSize = (DWORD)NurZuBesuch - (DWORD)HalloBallo;
in seltenen fällen funktioniert das nicht, dann musst du mal bei den projektoptionen in den optimierungseinstellungen rumprobieren, aber im normalfall gibt's damit keine probleme
-
C/C++ Code:
static void HalloBallo() {}
static void NurZuBesuch() {
}
DWORD dwFuncSize = (DWORD)NurZuBesuch - (DWORD)HalloBallo;
in seltenen fällen funktioniert das nicht, dann musst du mal bei den projektoptionen in den optimierungseinstellungen rumprobieren, aber im normalfall gibt's damit keine probleme
Berechnung der Grösse der Funktion HalloBallo() nehme ich an ??
Das ist jetz aber nicht dein Ernst oder ?
-
Manfred Schmidtke schrieb:
Ein vorzeitiges Return führt im ausführbaren Code nur zu einem Sprungbefehl auf das ret.
Unsinn. Vielleicht ist das bei manchen Compilern so, wenn man ohne Optimierung compiliert, aber normal ist das nicht.
Im Code-Segment steht jedoch nur Code. Irgendwelche Daten sind auf Stack und Heap etc. verteilt.
Das ist mir auch klar. Aber was ist dann z.B. damit:
B0C3 mov al, c3
EDIT:
Redhead schrieb:
Das ist jetz aber nicht dein Ernst oder ?
Immerhin funktioniert das um einiges robuster als die andere Methode.
-
Hi Ringding,
Redhead schrieb:
Das ist jetz aber nicht dein Ernst oder ?Immerhin funktioniert das um einiges robuster als die andere Methode.
Und du meinst wirklich das du damit einen sinnvollen und verlässlichen Wert rauskriegst.
-
Was hab ich hier bloß angerichtet!?!?
Hätt' ich doch bloß die Finger von der Tastatur gelassen. Es ging doch nur darum, das "sowas nicht geht". Jetzt läuft dieses Thema bald auf der dritten Seite und wird, fürchte ich, dadurch noch viel mehr "Interessenten" anziehen.
Bezüglich C3 hab ich mich ein bisschen sehr undeutlich ausgedrückt. Es reicht natürlich nicht die Suche nach C3, sondern der Assembler-Code müsste entsprechend analysiert werden, also z. B. bei B0 entsprechend das nächste Byte überspringen usw.
Wird ne ziemlich lange Liste, fürchte ich.
Ob die Compiler-Optimierungen ggf. zusätzliche ret's einsetzen, weiß ich nicht. Vermutlich hast Du recht (ich werd's nicht überprüfen). Generell muss aber doch jede Funktion zunächst den Stack aufräumen und sich die Rücksprungadresse holen. Wahrscheinlich erzeugt eine Geschwindigkeitsoptimierung tatsächlich diesen Code mehrfach.
-
Redhead schrieb:
Berechnung der Grösse der Funktion HalloBallo() nehme ich an ??
Das ist jetz aber nicht dein Ernst oder ?Ich hab doch bereits eingeräumt, dass diese Variante nicht vollkommen deterministisch ist, aber wenn er die Größe der Funktion unbedingt haben will, dann kann er es ja so machen. In einigen Fällen ist es bei mir vorgekommen, dass die zweite Funktion vor der ersten angeordnet wurde und somit ein hoher negativer Wert rausgekommen ist. Aber wenn die kompilierte Version erstmal funktionierte, dann ging es auch auf jedem NT-System, auf dem ich diese Methode getestet habe.
-
Was ist denn der Sinn von der ganzen Sache? Nur mal so aus Langeweile was Neues ausprobieren oder steckt da noch mehr hinter?
-
Er will wohl seinen Funktionscode irgendwo injecten (Buffer-Overflows, RemoteThreads).Ansonsten wüsste ich auch keine wirkliche Verwendung dafür
-
Nein, will ich nicht. Wenn ich wollte, würde es auch reichen einen größeren Wert anzugeben aber darum geht es mir eben nicht. Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?
Entweder man verrät seine Idee oder man wird als Virenautor abgestempelt? Traurig.
-
icy schrieb:
Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?
Weil es idR eine bessere Lösung gibt.
Beispiel:
Frage: wie kann ich mir Flügel wachsen lassen??
Antwort: geht nicht. was willst du denn machen??
Frage: ich will einmal fliegen.
Antwort: dann bau dir ein fluggerät siehe diese links: ...Geil oder?
-
icy schrieb:
Nein, will ich nicht. Wenn ich wollte, würde es auch reichen einen größeren Wert anzugeben aber darum geht es mir eben nicht. Warum zur Hölle muss denn immer diese dümmliche "Sinn?"-Diskussion gestartet werden?
Entweder man verrät seine Idee oder man wird als Virenautor abgestempelt? Traurig.Wie du meinem Smiley entnehmen kannst, war meine Aussage nicht ganz ernst gemeint und eigentlich ist es mir auch egal, was du damit machen willst. Und als Virenautor hab ich dich schon gar nicht abgestempelt, das ist vielleicht eine leichte Überinterpretation meiner Aussage
-
Hm da hast du recht Shade of Mine aber ich bin mir 100%ig sicher, dass ich es genau so haben will bzw nicht anders geht.
Masterofx32: Tut mir leid, hab wohl ein bisschen überreagiert.
-
Wie sehen denn nun deine aktuellen Ergebnisse aus? Nutzt du die (nicht ganz saubere) Subtraktionsmethode oder probierst du dich doch an der Ablaufverfolgung des Funktioncodes?
-
Die Code Injection würde wohl auch kaum funktionieren. Du kannst nicht einfach eine Funktion für sich allein nehmen und woanders hinkopieren, da sind ja in der Regel haufenweise Absolutadressen hardcoded drin.
Wenn du es dir leisten kannst, einen Compiler aufzurufen, kannst du ja auch mal mit einem leeren Rumpf compilieren und dann die Größe des .text-Segments mit der vollständigen Version vergleichen.
-
Ringding schrieb:
Die Code Injection würde wohl auch kaum funktionieren. Du kannst nicht einfach eine Funktion für sich allein nehmen und woanders hinkopieren, da sind ja in der Regel haufenweise Absolutadressen hardcoded drin.
Wenn du es dir leisten kannst, einen Compiler aufzurufen, kannst du ja auch mal mit einem leeren Rumpf compilieren und dann die Größe des .text-Segments mit der vollständigen Version vergleichen.
Das mit der Code-Injection funktioniert sehr wohl. Du musst nur selbstverständlich Funktionsaufrufe und Stringliterale,etc vermeiden. Zum Beispiel kannst du dir Funktionspointer zu LoadLibrary, GetProcAddress und FreeLibrary übergeben und dann mit CreateRemoteThread deine Funktion ausführen, die du injected hast. Von dort aus könntest du eine weitere DLL im fremden Prozess laden und von dort aus hast du ja wieder die möglichkeit "normal" weiterzuprogrammieren