Frage zu Speicheradressen

03/23/2010 17:21 Canalien#1
hi
ich habe mich schon ein bissel mit ollydbg, cheatengine und so beschäftigt.
habe jez tdm noch ne frage.
wir haben ein programm, ist egal was, einfach ne form mit nem button druf, der meinetwegen beim draufklicken ne messagebox anzeigt. ;)
so jez möchte ich wissen, ob es möglich ist, die messagebox anzuzeigen, ohne den button zu betätigen?!
also ich schreibe mir ein anderes prog mit nem button und der soll dann das erste prog beischeidgeben, dass er die messagebox anzeigen soll.
ist dies mithilfe von speicheradressen und pointern usw möglich, oder was benötigt man sonst dafür?

es wäre natürlich ausgezeichnet, wenn mir das jmd an einem beispiel darstellen könnte, aber mir reichen auch schon ein paar stichworte, die ich dann weiter googlen werde ;)

mfg canalien
03/23/2010 17:25 xNopex#2
Wenn du auf den Button drückst, wird eine Funktion aufgerufen, die wiederum die MessageBox ausführt. Du brauchst im Prinzip nur die Adresse der Funktion die aufgerufen wird, dann injezierst du eine DLL in den Zielprozess, die die Funktion, die die MessageBox ausführt, über einen Funktionszeiger aufruft. Und fertig. Kommunikation zwischen injektions-Dll und eigener Applikation kann über Sockets erfolgen.
03/23/2010 19:27 xWaffeleisen#3
Statt über Sockets würde ich mal das hier empfehlen^^
Interprozesskommunikation ? Wikipedia

Aber warum eigentlich nicht alles in einem Prozess? Oder willst du das bei einem fremden Prozess machen? Dann musste wohl die Stelle suchen und dann eben z.B durch Dll injection aufrufen.
03/23/2010 20:04 @night@#4
Wenn du es mit Autoit schreibst würde ich die Befehle StdoutRead() und Consolewrite() benutzen.
[Only registered and activated users can see links. Click Here To Register...]
mfg
@night@
03/23/2010 20:59 Canalien#5
danke schon mal ;)
ja ich möchte in einen fremden prozess zugreifen.
iwann sollte es ein bot für battleforge werden, halt ohne tastendrücke und ohne mausbewegung.
sollte alles intern stattfinden.
das wär dann sowas wie im menü eine weltkrate öffnen, eine mission auswählen, mission starten, boss killen und wieder ins menü danach.
da das mit maus ganz gut geht, aber man halt alles auflösungsspezifisch und bei jeden pc ne andere sleep zeit braucht, wollt ich das mal über den speicher versuchen.
ich werde mir mal eure links angucken und sehen wie weit ich damit komme.
falls sich jmd gut mit sowas auskennt und mir bereit wäre persöhnlich tipps zu geben, kann er/sie (<-- hab ich höflichkeitshalber hingeschrieben ;) ) mich gerne bei msn oder steam adden.
addy gibs bei pm.

mfg canalien

PS: das mit dem game ist nur eine möglichkeit und deshalb hab ich den thread nicht in der battleforge kategorie gepostet. wollte es eher allgemein halten.
03/24/2010 19:30 Canalien#6
so ich hab mir mal son universal dll injector downloaded.
dann hab ich mir in c++ ne dll geschrieben.

Code:
struct MyStruct
{
      int       SomeId;
      double SomePrice;
};

extern "C" __declspec(dllexport) void PassStructIn(MyStruct* myStruct);

void PassStructIn(MyStruct* myStruct)
{
	int* c = (int*)0x7EFDB394;
	int wert = *c;

      if (myStruct != NULL)
      {
            myStruct->SomeId = wert;
            myStruct->SomePrice = 456.23;
      }
}

und hab ein c# programm womit ich die dll aufrufe.

Code:
static void Main(string[] args)
        {
            NativeMethods.MyStruct myStruct;
            myStruct.SomeId = 23;
            myStruct.SomePrice = 30.52;
            NativeMethods.PassStructIn(ref myStruct);

            Console.WriteLine("SomeId={0}; SomePrice={1}", myStruct.SomeId, myStruct.SomePrice);
        }

und eine NativeMethods.cs erstellt.

Code:
public struct MyStruct
        {
            public int SomeId;
            public double SomePrice;
        }

        [DllImport(@"C:\...\Desktop\dll_2.dll")]
        public static extern void PassStructIn(ref MyStruct theStruct);
so ich hänge die dll an ieinen prozess.
das funktioniert auch.
dann rufe ich mein c# programm über die console auf.
wenn ich bei der dll mal die adresse auskommentiere und so und
Code:
myStruct->SomeId = wert;
den wert durch eine zahl ersetze, dann bekomm ich auch das richtige ergebniss.
wenn ich allerdings ne adresse nehmen will, krieg ich eine

AccessViolationExeption: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
bei c#Programm.NativeMethods.PassStructIn(MyStruct& theStruct)
bei c#Programm.Programm.Main(String[] args)


kann mir einer sagen, warum das nicht funktioniert?
thx

mfg canalien
03/24/2010 20:28 xNopex#7
Vermutung: Die Adresse ist falsch und zeigt auf eine Page, die von dem Programm nicht genutzt wird bzw. einem fremden Programm gehört. Dann kackt das Programm natürlich ab.
03/24/2010 21:05 Canalien#8
darf eig nicht sein, da ich die adresse mit olly und CE geprüft habe.
hatte auch einen wert.
habe auch mehrere adressen ausprobiert...
kann natürlich sein, dass gerade immer diese wirklich gesperrt sind für mein programm.


mfg canalien
03/25/2010 00:09 MrSm!th#9
Ich verstehe deinen Code ehrlich gesagt nicht ganz.
Wozu ist denn nun c da? Ich sehe keine Verwendung der Variable.
Zum Problem:
Sicher, dass an der Stelle etwas ist? Ist der Speicher auch nicht auf Read-Only?

Wie du schon gut bemerkt hast, ist internes Aufrufen von Funktionen viel eleganter als Tastendrücke.
Allerdings musst du dafür nicht nur einfache MessageBox Funktionen finden, sondern meist den Client des Spiels sehr genau analysieren, um die gesuchten Funktionen zu finden.
Dann musst du noch die Callingconvention und die Parameter der Funktion herausfinden und natürlich auch den Rückgabewert.
Dann kannst du die Funktion einfach callen.
03/25/2010 06:14 degret backing#10
Enlish Version:

Hi
I've been a bissel with OllyDbg, cheat engine, and so busy.
jez ne tdm still have to ask.
we have a program, no matter what, just ne form with druf nem button, click on it on my account at the ne messagebox displays.
jez so I want to know whether it is possible to display messagebox without pressing the button too?
So I write with another prog nem button and will be the first prog beischeidgeben that he is to show messagebox.
This is possible by using memory addresses and pointers, etc., or whatever else you need for that?

it would of course excellent, if I could be the jmd at one example, but I also know a few wealthy stichworte, which I will then continue googling

mfg canali



__________________

[Only registered and activated users can see links. Click Here To Register...]


[Only registered and activated users can see links.
Click Here To Register...]