[Help] C++ YangDrop Dll

07/31/2010 09:06 ~Dezion~#1
Guten morgen E*Pvp Community,
Ich wollte mir gestern eine kleine Dll erstellen, die ununterbrochen Yang droppt.
Die Dll lies sich wunderbar compilen, doch als ich die dann injectet hatte, wurde 1 Yanghäufchen gedroppt kurz dannach kaam eine Errormeldung (An exception (C0000005) occurred during DllEntryPoint or DllMain in module c:\dokumente und einstellungen\name\desktop\project1.dll)

Hier mein Source :

Code:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused

void DropYang(DWORD yang)
{
	DWORD dwDropYang = 0x0041DF50;
	__asm
	{
		MOV ECX,DWORD PTR DS:[0x5F1D34]
		PUSH yang
		PUSH 0
		CALL dwDropYang
	}
}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long _Reason, void* lpReserved)
{
	if(DLL_PROCESS_ATTACH == _Reason)
	{
		while(1==1)
		{
			DropYang(1);
		}
	}
	return 0;
}
Was mache ich falsch?
PS : Ich benutze den C++Builder von RAD.
Lg Dez~
07/31/2010 21:08 bloodx#2
In DLL_PROCCESS_ATTACH. Würde ich lieber CreateThread( null, 0, dropyangthread, Null, 0); einfügen kp obs genau richtig so ist schreib it handy und dann halt. DWORD WINAPI dropyangthread(LPVOID Args) { while(true){DropYang(1);}} ist aufjedefall besser.
07/31/2010 22:31 ~Dezion~#3
Wäre dir sehr dankbar wenn du es mir besser erklären würdest - wie gesagt bin blutiger Anfänger.
Aber ein Thx bekommst du aufjedenfall :P
Lg Dez~
07/31/2010 23:25 bloodx#4
Code:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused

void DropYang(DWORD yang)
{
	DWORD dwDropYang = 0x0041DF50;
	__asm
	{
		MOV ECX,DWORD PTR DS:[0x5F1D34]
		PUSH yang
		PUSH 0
		CALL dwDropYang
	}
}

DWORD WINAPI YangDropThread(LPVOID Args)
{
while(true){
DropYang(1);
}
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long _Reason, void* lpReserved)
{
	if(DLL_PROCESS_ATTACH == _Reason)
	{
		CreateThread( 0, NULL, YangDropThread, NULL, 0, NULL);
	}
	return 0;
}
Finde es so viel besser oO du erstellst halt einen Thread für YangDrop ist besser aufjedenfall..

wenn du fragen hast frag hier oder MSDNS
08/01/2010 00:18 ~Dezion~#5
Hmm wenn ich die Dll injecte stürtzt Metin ab ._.
Both injection-methods failed !
(RemoteLoadLibrary ans Detourlinjection)
YangDroper.dll -> metin.exe
Target ist protectet? err:0

Lg Dez~
08/01/2010 00:42 Ende!#6
Sicher, dass in DropYang alles korrekt ist? Hast du das irgendwo kopiert? Eventuell ist es nach dem Call noch nötig den Stack aufzuräumen (add esp, 0x8). Kommt drauf an, ob die Funktion das selber tut oder nicht.
08/01/2010 02:42 ~Dezion~#7
Quote:
Originally Posted by Ende! View Post
Sicher, dass in DropYang alles korrekt ist? Hast du das irgendwo kopiert? Eventuell ist es nach dem Call noch nötig den Stack aufzuräumen (add esp, 0x8). Kommt drauf an, ob die Funktion das selber tut oder nicht.
Hab es einfach direkt aus OllyDBG koppiert.
Ich versuch es mal mit ADD ESP, 0x8 :)
Lg Dez~

EDIT : Jetzt werden ~7 Häufchen Yang gedropt und anschliesend kommt eine Errormeldung (Die selbewie im ersten Post)
08/01/2010 18:40 SmackJew#8
Du bist in der Lage Funktionen im Client zu lokalisieren, aber schaffst es nicht dein Programm zu debuggen? Mhmmmm...
08/01/2010 19:11 ~Dezion~#9
Das Problem ist behoben ^^
Ich hatte eine Funktion übersehen direkt unter dem eigentlichen YangDrop.
Kann geclosed werden, thx an alle die geholfen haben!
Lg Dez~
08/01/2010 21:13 MrSm!th#10
Quote:
Originally Posted by ~Dezion~ View Post
Guten morgen E*Pvp Community,
Ich wollte mir gestern eine kleine Dll erstellen, die ununterbrochen Yang droppt.
Die Dll lies sich wunderbar compilen, doch als ich die dann injectet hatte, wurde 1 Yanghäufchen gedroppt kurz dannach kaam eine Errormeldung (An exception (C0000005) occurred during DllEntryPoint or DllMain in module c:\dokumente und einstellungen\name\desktop\project1.dll)

Hier mein Source :

Code:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused

void DropYang(DWORD yang)
{
	DWORD dwDropYang = 0x0041DF50;
	__asm
	{
		MOV ECX,DWORD PTR DS:[0x5F1D34]
		PUSH [COLOR="Red"][yang][/COLOR]
		PUSH 0
		CALL dwDropYang
	}
}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long _Reason, void* lpReserved)
{
	if(DLL_PROCESS_ATTACH == _Reason)
	{
		while(1==1)
		{
			DropYang(1);
		}
	}
	return 0;
}
eigentlich sollte es so heißen.

wenn nicht, bitte korrigieren, mich verwirren lokale variablen bei inline asm immer
Quote:
Originally Posted by ~Dezion~ View Post
Wäre dir sehr dankbar wenn du es mir besser erklären würdest - wie gesagt bin blutiger Anfänger.
Aber ein Thx bekommst du aufjedenfall :P
Lg Dez~
für solche ist das aber gar nichts :rolleyes:
08/01/2010 22:41 SmackJew#11
Quote:
Originally Posted by MrSm!th View Post
eigentlich sollte es so heißen.

wenn nicht, bitte korrigieren, mich verwirren lokale variablen bei inline asm immer
Nein, [x] ist in dem Fall wie eine Dereferenzierung und würde auf den Wert an Adresse x zugreifen.
08/02/2010 00:01 MrSm!th#12
jop schon klar.
und soweit ich weiß, greift man doch so auf variablen per asm zu oder nicht?
nur der variablenname müsste doch nur die adresse bedeuten.

ich muss zb. folgendes machen

__asm mov [abc], 5;

um 5 in abc zu bekommen.
08/02/2010 00:27 ms​#13
Code:
int global = 0;
int global2 = 0;


int _tmain(int argc, _TCHAR* argv[])
{
	int local = 0;
	int local2 = 0;
	__asm
	{
		mov global, 1
		mov [global2], 1
		mov local, 1
		mov [local2], 1
	}
	printf("global:%d\nglobal2:%d\nlocal:%d\nlocal2:%d\n", global, global2, local, local2);
	system("PAUSE");
	return 0;
}
unter Visual C++

Code:
global:1
global2:1
local:1
local2:1
Press any key to continue . . .
Scheint wohl keinen Unterschied zu machen.


btw, SmackJew = schlurmann? ;O
08/02/2010 00:34 MrSm!th#14
Hm, welche VS Version nutzt du denn?
Ich weiß nicht mehr recht, aber ich meine mich erinnern zu können, dass ich für die Version ohne [] mal nen Compilerfehler bekam.

Hast du es denn auch umgekehrt versucht? Dass du die Quelle einmal mit und einmal ohne [] nutzt? Würde man es dann wirklich als Pointer nutzen, müsste es ja bei der Version mit [] crashen oder nix passieren, da man ja auf Adresse 0x1 zugreifen würde...

Code:
int local1 = 1;
__asm mov eax, [local1];

Falls es schlurmann ist, willkommen zurück ;O
08/02/2010 00:44 ms​#15
2010 Ultimate

Code:
int *global = new int(0);
int *global2 = new int(0);


int _tmain(int argc, _TCHAR* argv[])
{
	__asm
	{
		mov global, 1
		mov [global2], 1 
	}
	printf("global:%d\nglobal2:%d\n", global, global2);
	system("PAUSE");
	return 0;
}
Edit: Beide Pointer werden auf 1 gesetzt, nicht die Variable, auf die gezeigt wird.