|
You last visited: Today at 15:54
Advertisement
[C++] DLL Probleme
Discussion on [C++] DLL Probleme within the C/C++ forum part of the Coders Den category.
12/07/2014, 04:13
|
#1
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,634
Received Thanks: 1,637
|
[C++] DLL Probleme
Hallo EPvP Com,
folgendes Problem. Ich versuche einen Wert der an einer bestimmten Adresse ist auf 0 zu setzen. Aktuell verwende ich dafür "WriteProcessMemory" was auch soweit gut Funktioniert. Jedoch würde ich es gerne in ASM umsetzen. Versucht habe ich es bereits. Aber es ist immer Fehlgeschlagen. Die EndSequence wird ausgeführt das MOV aber leider nicht.
Woran liegt es genau? Vermute hier einen Leichtssinns fehler.. Aber ich finde ihn eben nicht.
Ich habe es schon über XOR probiert aber ebenfalls ohne erfolg. Und eine schleife die X mal DEC ausführt möchte ich auch nicht verwenden.
Eine andere frage wäre, wie ich eine Funktion ausNOPen kann. Also Funktion gegen NOP austauschen.
Folgender ASM Code müsste ausgetauscht werden:
Ich würde mich über Hilfe sehr Freuen (dies muss nicht direkt eine Lösung sondern mehr ein Anstupsen in die Richtige Richung sein.
Google wurde vorher benutzt, lieferte aber nur eine lösung über eine
#if
#...
Lösung an. Aber ich möchte es erst verstehen bevor ich es verwende. Was ich hier leider nicht tu.
Vielen dank!
#edit
Ein neues Problem ist aufgetreten. Und zwar stimmt die Struktur in der Konsole nicht mehr wenn ich "system("cls")" verwende. Ich habe bereits es über eine funktion zu lösen:
Code:
void clearScreen()
{
for (int i = 0; i < 30; i++)
{
cout << endl;
}
}
Jedoch gefällt mir daran nicht, das der Text nach Unten verschoben ist und darüber nun diese Whitespaces sind. Was kann ich dagegen tun?
Morgentliche Grüße
Problem Solved / Erledigt
|
|
|
12/07/2014, 04:16
|
#2
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
General Coding -> C/C++
#moved
|
|
|
12/07/2014, 04:53
|
#3
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
bei einer Dll kannst du genauso den Präprozessor definieren
Projekt -> Eigenschaften -> C++ -> Präprozessor
|
|
|
12/07/2014, 05:14
|
#4
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,634
Received Thanks: 1,637
|
Wtf... ó.o vorhin war es nochh nicht da. Nun aber schon -,-... Danke dennoch.
Vielen dank! Benhero
|
|
|
12/07/2014, 13:20
|
#5
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Du schreibst in deine "Pointer"variable 0, überschreibst also einfach nur die Adresse.
Es müsste mov [aRubish], 0 sein.
Ich empfehle dir aber lieber Funktionszeiger zu verwenden, damit du ganz auf ASM verzichten kannst.
|
|
|
12/07/2014, 13:47
|
#6
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,634
Received Thanks: 1,637
|
Mir ist durchaus bewusst das ich ganz auf ASM verzichten kann.
Ob nun über Funktionspointer (die ich noch nicht kenne) oder über MemoryWrite.
Jedoch ist es wichtig für mich ASM zu verwenden da es mich (wenn auch nicht viel) weiter bringt. Sicherlich wäre reines ASM (OllyDBG, ...) dafür besser geeignet.
Jedoch verbessere ich so meine Kentisse in beiden Bereichen!
Werde mich dennoch erstmal mit Funktionspointern auseinander setzen!
#edit:
habe  gefunden und verstehe zwar wie es funktioniert. Jedoch verstehe ich nicht in welcher hinsicht es einen Unterschied macht wenn ich diese Verwende anstatt direkt Funktionen aufzurufen. Oder meinen Sie etwas anderes als in diesem Beispiel beschrieben?
Grüße
|
|
|
12/07/2014, 14:29
|
#7
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Leider ist nicht direkt gesagt, ob du nur 1 byte, 2 oder 4 byte mit 0 ersetzen willst. Da du ja vermutlich das zweite Argument der sub-Instruktion von 01 auf 00 ändern willst, gehe ich mal von einem byte aus.
Wenn man dein Unterfangen in ASM umsetzen will, ginge das ca. so:
Code:
mov byte ptr [0x421F7C], 1
call endSequence
Ein "mov [aRubish], X" erfüllt nicht den gewünschten Zweck, da es (zumindest im MSVC inline asm) auch lediglich den Variablenwert ändert. Mit einer einzigen Instruktion ist das auch quasi anders gar nicht möglich, da die Variable selbst eine Adresse, entweder absolut (wenn Variable global) oder relativ zum Frame- / Stackpointer (bei lokaler Variable), ist, welche dereferenziert werden muss. Den Wert der Variable, an den man nur mittels dereferenzierung rankommt direkt nochmals in der selben Instruktion zu dereferenzieren ist unter x86 / x64 meines Wissens nach nicht möglich. Das ginge nur über zwei Instruktionen oder halt irgendwelche Makros, die der Assembler anbietet.
Sonst lässt sich das ganze natürlich direkt in C / C++ umsetzen. Zum Aufrufen der Gamefunktion EndSequence beispielsweise kannst du ja keinen direkten Aufruf machen, weil die Funktion nicht teil deines Codes ist. Wenn du nun aber einen Funktionspointer deklarierst und ihm die Adresse der Funktion im Spiel zuweist, kannst du den Aufruf über den Pointer tätigen ohne inline asm oder dergleichen missbrauchen zu müssen:
Code:
typedef void (__stdcall* EndSequence_t)(); // typedef für leichtere Handhabung
EndSequence_t EndSequence = (EndSequence_t)0x405980;
...
EndSequence(); // Aufruf
Das Überschreiben des einzelnen Bytes ist natürlich in C / C++ ebenfalls möglich. Dazu halt einfach einen Pointer nehmen und dereferenzieren.
Mit freundlichen Grüßen
Jeoni
|
|
|
12/07/2014, 18:06
|
#8
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
|
Ob nun über Funktionspointer (die ich noch nicht kenne) oder über MemoryWrite.
|
Mit MemoryWrite kannst du keine Funktion direkt aufrufen. Ich dachte, es geht darum, erst den Parameter zu manipulieren und dann die Funktion aufzurufen?
Quote:
|
Ein "mov [aRubish], X" erfüllt nicht den gewünschten Zweck, da es (zumindest im MSVC inline asm) auch lediglich den Variablenwert ändert. Mit einer einzigen Instruktion ist das auch quasi anders gar nicht möglich, da die Variable selbst eine Adresse, entweder absolut (wenn Variable global) oder relativ zum Frame- / Stackpointer (bei lokaler Variable), ist, welche dereferenziert werden muss.
|
Du hast zwar Recht, was den technischen Hintergrund angeht, aber MSVC macht es hier meiner Erfahrung nach so, dass du mit mov aRubish, X einen Wert in die Variable schiebst (sprich die Adresse implizit dereferenzierst), obwohl es technisch gesehen eine sinnlose Instruction wäre (mov AdresseVonARubish, Wert). Ich habe es in der Konstellation des TEs noch nicht verwendet, ging aber aufgrund dieser Tatsache davon aus, dass mov [aRubish], X dann auch den Wert in aRubish dereferenziert und an die gewünschte Adresse den Wert schreibt. Dafür müssten aber natürlich zwei Instructions generiert werden, von daher kann es gut sein, dass du Recht hast und diese Sache mit mov aRubish, X von MSVC nur der Bequemlichkeit halber bei so einfachen Zugriffen unterstützt wird.
|
|
|
12/10/2014, 01:35
|
#9
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,634
Received Thanks: 1,637
|
Ich habe es jetzt so Probiert wie es Jeoni vorgeschlagen hat, jedoch ohne erfolg.
Es ändert sich weiterhin die Adresse. Aber nicht der Wert der Adresse. Da es sich in diesem Fall um ein 4 Byte Wert handelt habe ich es folgendermaßen probiert:
Wie man vermuten mag ist es mein Wunsch erst den Wert der Adresse 0x421F7C auf 0 zu setzen und dannach die End Sequenz aufzurufen.
Zweiteres funktioniert ohne Probleme. Nur wird beim ersten wie gesagt die adresse umgeschrieben. Siehe screen:
Als zweites möchte ich einen nochmals einen Wert schreiben und dann wie schon vermutet den 2 Parameter einer SUB-Instruktion auf 0 setzen. Auch dafür habe ich schon verschiedene Wege Probiert. Leider ohne erfolg.
Auf folgender Adresse liegt die Instruktion:
in diesem fall habe ich
Code:
mov byte ptr [0x40508D], 0
call endSequence
verwendet. Da das "01" auf dieser Adresse lag wie man hier sehen kann:
Entweder mache ich etwas wirklich falsch ó.o.. oder es geht wirklich nicht...
ICh hoffe nochmals auf eure Hilfe.
Danke
|
|
|
12/11/2014, 11:08
|
#10
|
elite*gold: 0
Join Date: Feb 2008
Posts: 2,754
Received Thanks: 1,748
|
Mal versucht, den Wert einfach in C++ zu ändern? So wie ich das verstanden habe, bist du an der Stelle sowieso im Prozess.
Versuchs mal mit:
Code:
*(DWORD*)(aRubbish) = 0;
Nebenbei: Funktionszeiger sind an sich nicht schwieig und lohnen sich wirklich. Versuch vilt. dir das ganze doch nochmal anzuschauen wenn du Zeit findest.
|
|
|
12/11/2014, 12:33
|
#11
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,634
Received Thanks: 1,637
|
Habe es mitlerweile schon geregelt.
z.B. über:
Code:
mov eax, dword ptr ds : [aScore]
mov dword ptr ds : [eax], 999999
|
|
|
 |
Similar Threads
|
[Sammelthread]Ep2 Linux Probleme/Hilfe/Antworten-Server Probleme
06/21/2013 - Last Chaos Private Server - 11 Replies
In den Letzten Tagen hab ich öfter mal immer neue Threads gesehen, wo es um Linux geht oder um Server Probleme... Da dachte ich mir wieso kein Sammelthread?!
Wenn es unnütz ist kann er gerne wieder geschlossen werden :) Aber denke mal, was wäre eine Art um nicht so viele Threads zu öffnen und wo man schnell andere antwortet nach gucken könnte.(ps.ich meins nur gut:) )
Mfg.Mango?!
Thread zu den Ep2 Files
|
Probleme mit dem Internet(Laggs, Ping und Latenz probleme)
10/09/2012 - Technical Support - 4 Replies
Hallo,
ich hofff ich bin hier richtig.
Mein Problem ist, dass ich Probleme mit der Internetverbindung habe. Angefangen hat es bei Diablo 3 mit Latenzproblemen, wo ich dann nach paar Minuten bei ner Latenz von mehreren 1000 ms rausgeschmissen wurde.
Danach hat es bei Gohst Recon Online funkioniert lagg frei und dann aber auch mit Laggs.
Und jetzt bei LOL ist, muss alle paar 10 sek die Verbindung wiederhergestellt werden. Anfangs bei LOL hab ich den besten Ping und es scheint die...
|
Minecraft Probleme ( Ruckel-, Grafik- und/oder Lag- Probleme
09/10/2011 - Minecraft - 3 Replies
So, es ist das:
Und zwar geh ich gleih zum Punkt, mein Minecraft ruckelt alle 5-6 sec. .
Und wenn ich denn "F3" drücke, kommt doch (glaub ich wenn das das ist) dieser Debug modus, steht / ist ein Bild wo es die Verbindung oder wie das Spiel grad läuft, an.
Hier ein Screenshot: was los ist:
http://imageshack.us/photo/my-images/850/20110910 205313.png/
an den immerwieder gleichmäßigen roten linien die oben aufkommen.
|
All times are GMT +1. The time now is 15:55.
|
|