C-Funktion von Inline-Assembly callen
-
Hallo
Wie kann ich eine C Funktion von inline assembly aufrufen, ich möchte als Beispiel folgenden Code auflisten:
[...]
int WriteMe(void *addr, int wb) { HANDLE h=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,1, GetCurrentProcessId()); return WriteProcessMemory(h, addr, &wb, 1, NULL); }
[...]
__asm("pushl $0x74"); __asm("pushl $Here"); __asm("call WriteMe"); /// HIER __asm("addl $8, %esp");
[...]
Ich krieg von Dev-C++ immer folgende Fehlermeldung:
[Linker error] undefined reference to `WriteMe'
ld returned 1 exit status
[test.exe] Error 1Vielen Dank,
TheAsmNoob
-
Son Spielkram
, nimm doch gleich C oder C++ und feddisch.
-
Schau dir mal an, wie inline-Assembler mit dem GCC funktioniert. Die Syntax die du benutzt _ist_ falsch!
Ansonsten: http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
-
Danke für eure Antworten
proggingmania: Danke für deine konstruktive Antwort. Würdest du verstehen was ich will würdest du nicht so einen Mist zusammen schreiben. Das nächste Mal bitte zuerst denken ob es sich lohnt einen sinnlosen Kommentar abzuliefern.
rüdiger: Was ist daran falsch, es scheint nur die Zeile mit " << HIER " falsch zu sein, das andere ist at&t assembly.
Und jetzt bitte, hat wer ne Ahnung?
Danke
-
Mit dem Microsoft Compiler geht das ganz easy mit den Funktionsaufrufen:
#include <stdio.h> void aha( ) { puts("AHA"); } int main() { __asm { call aha; } return 0; }
Mein Kommentar wird erst dann sinnlos, wenn du mich vom Gegenteil überzeugst.
-
#include <stdio.h> char format[] = "%s %s\n"; char what[] = "I am so bored"; char when[] = "today"; void main( void ) { __asm { mov eax, offset when push eax mov eax, offset what push eax mov eax, offset format push eax call printf pop ebx pop ebx pop ebx } }
-
#include <stdio.h> char format[] = "%s %s\n"; char what[] = "I am so bored"; char when[] = "today"; int main() { __asm { push offset when push offset what push offset format call printf add esp, 12 } }
-
TheAsmN00b schrieb:
rüdiger: Was ist daran falsch, es scheint nur die Zeile mit " << HIER " falsch zu sein, das andere ist at&t assembly.
__asm("call WriteMe"); // << Hier
das müsste glaube ich so aussehen. Bin mir aber nicht sicher
__asm__ __volatile__ ("call %1" : : "1"(WriteMe) :);
siehe hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html
@others
was ihr postet ist sinnlos, da er nicht den MSVC nutzt...
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Assembler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hmmm.... das klappt auch nicht, leider. Kann mir wer sonst helfen?
gruss TheAsmN00b
-
vielleicht muss die Adresse relativ sein für call. Aber wie gesagt, schau einfach mal in die zahlreichen Links, die in der FAQ stehen (siehe die beiden Links von mir...)
-
Ich habe jetzt alles durchgeschaut und fand nichts. Hat jemand eine Idee?
danke
-
Probier's mal so:
void foo() { printf("bar\n"); } //... __asm__ __volatile__("call *%0\n"::"r"(foo));
-
Danke Overflow, voll geil, das hat geklappt.
Ich möchte gerne den ganzen Source posten (wer weiss, vllt kann man das ins Faq für andere Personen verschieben):
/* IDE: Dev-C++ 4.9.9.2 Compiler: MinGW (version unkown) [gcc for win32] */ #include <stdio.h> #include <stdlib.h> #include <windows.h> int change(void *address, int wb) { HANDLE h=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,1, GetCurrentProcessId()); return WriteProcessMemory(h, address, &wb, 1, NULL); } int main(int argc, char* argv[]) { asm("pushl $0x74"); asm("pushl $Here"); __asm__ __volatile__("call *%0\n"::"r"(change)); asm("addl $8, %esp"); asm("Here: jmp Here"); printf("The JMP was now changed to JZ ;-)\n"); system("pause"); return 0; }
Danke für die Hilfe.
Viel Spass, AsmNoob