Seite 6 von 7

Verfasst: 29.05.2008 03:21
von Bisonte
edel hat geschrieben:Warum programmiert ist das ganze nicht so, das die Daten von aussen
gelesen werden, dann brauchste da auch nicht so viel updaten.
ohmann *klatschankopp*

auf das offensichtliche kommt man natürlich nicht .....

Das ist natürlich die Brennende Idee....

:allright:

Verfasst: 29.05.2008 18:57
von XXcD
Wie jetzt von außerhalb??
Ist damit gemeint die Pakete auszulesen?
Da hat man ja das problem da muss dann wieder der nuconnector benutzt werden.

Verfasst: 30.05.2008 00:10
von edel
Nein, eure "Offsets" werden per Hand eingeben oder kommen aus
einer Datei.

Verfasst: 30.05.2008 02:18
von Bisonte
Ganz simpel per textdatei... bzw mach ich das dann über prefs.

da kann jeder selbst die Offsets verstellen und sich dann über eigenartige Abstürze freuen ;)

Bastel grad dran.
Da hat man ja das problem da muss dann wieder der nuconnector benutzt werden.
eieiei da wird doch nicht einer "botten" wollen ? ;)

Verfasst: 31.05.2008 21:30
von XXcD
Lol ich will nicht botten, nur weil ich bots programmiere?
Hab aber die neuen Offsets falls es einen Interessiert:
  • #define OFFSET_PlayerServer 0x00CEA438
    #define OFFSET_PlayerName 0x00CEA538
    #define OFFSET_PlayerGuild 0x00CEB2AC


    #define OFFSET_PlayerBase 0x00CEBB4C

    #define OFFSET_PlayerLevel 0x00000820

    #define OFFSET_PlayerMaxHP 0x00000448
    #define OFFSET_PlayerCurrentHP 0x00000440

    #define OFFSET_PlayerMaxMP 0x0000044C
    #define OFFSET_PlayerCurrentMP 0x00000444

    #define OFFSET_PlayerXP 0x00000828
    #define OFFSET_PlayerSP 0x00000838
Ich weiß aber irgendwie immernoch nicht wie man die Position auslesen kann, weiß das zufällig einer?

Verfasst: 01.06.2008 03:25
von Bisonte
#define OFFSET_PlayerName 0x00CEA538
Der ist in Unicode. das ist ein bisschen blöd beides zu mischen.
Ichhabs noch nicht hinbekommen Diesen offset auszulesen

ich nehm eigentlich immer den ASCII Servernamen und dann steht nach nem
" : " immer der Charname .... ohne Unicode.
Wenn du dafür den offset hättest.....

Aber Pos auslesen hat bei mir auch noch nie geklappt. wie gesagt, das scheint noch durch ein formel zu laufen, weil die werte eigentlich so wie sie im speicher stehen nicht wirklich sinn ergeben.

Verfasst: 01.06.2008 03:42
von XXcD
Ja ich hab hier noch offsets von Botmon, vielleicht sind das ja die richtigen:
  • [Update]
    Game_Version=1,153
    Update_Id=1,002
    [Addresses]
    Char_Base=CEBB4C
    Server_Name=CEA438
    Char_Name=CEA538
    Guild_Name=CEB2AC
    Gold_Address=F0A924
    Handle_Address=F0A8E8
    Position_Divider=BD3E58
    [Offsets]
    Handle_Offset=34
    xRegion_Offset=7C
    yRegion_Offset1=7C
    yRegion_Offset2=08
    xPosition_Offset=78
    yPosition_Offset=78
    curLVL_Offset=820
    curHP_Offset=450
    maxHP_Offset=448
    curMP_Offset=444
    maxMP_Offset=44C
    curSTR_Offset=834
    curINT_Offset=836
    curEXP_Offset=828
    curSTAT_Offset=83C
    curSKILL_Offset=838
    charGold_Offset1=36C
    charGold_Offset2=04
    charGold_Offset3=04
    charGold_Offset4=08
    charGold_Offset5=08
    charGold_Offset6=10
    charGold_Offset7=7BC
    charGold_Offset8=378
Und ich habe ne formel um die Position auszulesen, aber die ist dafür wenn man die Pakete mit dem NuConnector abfängt.

Code: Alles auswählen

PosX = (XX - 135) * 192 + X / 10
PosY = (YY - 92) * 192 + Y / 10
XX ist die Region und X die Position.

Vielleicht kannst du ja damit was anfangen.
Mich wundert ja auch warum der Offset für X Position und Y Position gleich ist. Das ergibt überhaupt keinen sinn.

Verfasst: 01.06.2008 21:30
von XXcD
Hier hab ich noch die funktion um die Position auszulesen. Ist leider in C++, vielleicht kann das ja einer in Delphi übersetzen:

Code: Alles auswählen

void GetPlayerPosition(DWORD processID, int & finalX, int & finalY)
{
	// Open the process
	HANDLE hProcess = OpenProcess(PROCESS_VM_READ, false, processID);

	// Registers
	DWORD EAX = 0, EBX = 0, ECX = 0, EDX = 0, EBP = 0, EDI = 0, ESI = 0;

	// MOV ECX,DWORD PTR DS:[CAD56C]
	ReadProcessMemory(hProcess, UlongToPtr(OFFSET_PlayerBase), &ECX, sizeof(DWORD), NULL);

	// MOV AX,WORD PTR DS:[ECX+78]
	ReadProcessMemory(hProcess, UlongToPtr(ECX + 0x78), &EAX, sizeof(WORD), NULL);

	// MOVZX EBX,AX
	EBX = EAX;

	// MOV EDI,EBX
	EDI = EBX;
	// MOV EBP,EBX
	EBP = EBX;

	// MOV WORD PTR SS:[ESP+1C],AX
	DWORD ESP_1C = 0;
	ESP_1C = EAX;

	// AND EDI,0FF
	EDI &= 0xFF;

	//MOV DWORD PTR DS:[ESI+424],EDI
	//

	//SHR EBP,8
	EBP >>= 0x08;

	// MOV EAX,DWORD PTR DS:[CAD56C]
	ReadProcessMemory(hProcess, UlongToPtr(OFFSET_PlayerBase), &EAX, sizeof(DWORD), NULL);

	// MOV EDX,DWORD PTR DS:[EAX+7C]
	ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x7C), &EDX, sizeof(DWORD), NULL);

	//ADD EAX,7C
	EAX += 0x7C;

	// MOV DWORD PTR DS:[ESI+3E0],EDX
	DWORD ESI_3E0 = 0;
	ESI_3E0 = EDX;

	// MOV ECX,DWORD PTR DS:[EAX+4]
	ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x04), &ECX, sizeof(DWORD), NULL);

	// MOV DWORD PTR DS:[ESI+3E4],ECX
	DWORD ESI_3E4 = 0;
	ESI_3E4 = ECX;

	// MOV EDX,DWORD PTR DS:[EAX+8]
	ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x08), &EDX, sizeof(DWORD), NULL);

	// MOV DWORD PTR DS:[ESI+3E8],EDX
	DWORD ESI_3E8 = 0;
	ESI_3E8 = EDX;

	// MOV EAX,DWORD PTR DS:[CAD56C]
	ReadProcessMemory(hProcess, UlongToPtr(OFFSET_PlayerBase), &EAX, sizeof(DWORD), NULL);

	float fTmp1 = 0;
	ReadProcessMemory(hProcess, UlongToPtr(EAX + 0x88), &fTmp1, sizeof(float), NULL);

	// FSUB QWORD PTR DS:[C09668]
	double fTmp2 = 0;
	ReadProcessMemory(hProcess, UlongToPtr(OFFSET_PlayerBase), &fTmp2, sizeof(double), NULL);

	// FSTP DWORD PTR DS:[ESI+3EC]
	DWORD ESI_3EC = 0;
	float fTmp3 = 0;
	fTmp3 = fTmp1 - fTmp2;
	memcpy(&ESI_3EC, &fTmp3, sizeof(float));

	// MOV ECX,DWORD PTR DS:[CAD56C]
	ReadProcessMemory(hProcess, UlongToPtr(OFFSET_PlayerBase), &ECX, sizeof(DWORD), NULL);

	// CALL sro_clie.00830700
	//
	EAX = 0; // check this function ^

	// FLD DWORD PTR DS:[ESI+3E0]
	float fTmp4 = 0;
	memcpy(&fTmp4, &ESI_3E0, sizeof(float));

	// MOV DWORD PTR SS:[ESP+20],EAX
	DWORD ESP_20 = EAX;

	// MOV AX,WORD PTR SS:[ESP+1C]
	EAX = ESP_1C;

	// SHR AX,0F
	EAX >>= 0x0F;

	// MOV WORD PTR SS:[ESP+2A],AX
	DWORD ESP_2A = EAX;


	// FDIV QWORD PTR DS:[B9CA10]
	fTmp4 /= (double)-10.0;

	// CALL sro_clie.0098E260 (float to int)
	EAX = (int)fTmp4;

	// LEA ECX,DWORD PTR DS:[EDI+EDI*2-195]
	ECX = EDI + EDI * 2 - 0x195;

	//SHL ECX,6
	ECX <<= 0x06;

	//SUB ECX,EAX
	ECX -= EAX;

	// Store the final X position
	finalX = ECX;

	// FLD DWORD PTR DS:[ESI+3E8]
	memcpy(&fTmp4, &ESI_3E8, sizeof(float));

	// FDIV QWORD PTR DS:[B9CA10]
	fTmp4 /= (double)-10.0;

	// CALL sro_clie.0098E260
	EAX = (int)fTmp4;

	// LEA ECX,DWORD PTR SS:[EBP+EBP*2-114]
	ECX = EBP + EBP * 2 - 0x114;

	// SHL ECX,6
	ECX <<= 0x06;

	// SUB ECX,EAX
	ECX -= EAX;

	// Store the final Y position
	finalY = ECX;
}

int GetPlayerX(DWORD processID)
{
	int finalX;
	int finalY;
	GetPlayerPosition(processID, finalX, finalY);
	return finalX;
}

int GetPlayerY(DWORD processID)
{
	int finalX;
	int finalY;
	GetPlayerPosition(processID, finalX, finalY);
	return finalY;
}

Verfasst: 01.06.2008 22:45
von edel
Dir ist aber schon klar das du dich hier in einem Forum befindest,
das aber auch rein gar nichts mit Delphi zu tun hat?

Verfasst: 04.07.2008 21:31
von ciko84
hi could anyone upload that program? :roll: