Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

C++/ delphi - cheat / krótki kod.


MrPro

Rekomendowane odpowiedzi

Opublikowano

Hej poszukuję kodu - nigdzie nie mogę znaleźć. Który będę mógł przekompilować na DLL który co dajmy 0.01 sec wywoła takie coś

        vid = player.GetTargetVID()
        if vid != 0 or chr.INSTANCE_TYPE_NPC != chr.GetInstanceType(vid):
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)
            kamer.SendBattlePacket(vid)

Oczywiście jest to skrawek z pythona (powinien działaś) oraz zaimportuje bibliotekę kamer.dll

Z góry dzięki za pomoc ;P

Opublikowano

Mam problem w sumie z wszystkim. Poradniki niezbyt mi coś mówią..

Gra to metin2 ale to nie istotne (lol) a kamer.dll to bilbioteka (dokładnie zawierająca pare funkcji w tym kamer.SendBattlePacket(vid) - która nie jest zaimplementowana w samej grze)

 

Kod w pythonie jeśli będzie potrzebny wygląda mniej więcej tak - http://wklej.org/id/1481717/

Opublikowano

yy ale co ty chcesz zrobic? bo ja nie rozumiem cie xD

 

mozesz zaimportowac funkcje z dllki w winapi w C/C++ i ja normalnie wywolywac, injectujesz swoja dllke w proces, i potem wywolujesz tamta funkcje z innej dllki (o ile jest zaladowana w proces - najprostsze wyjscie), a jesli chcesz zrobic cos innego to powiedz, i to jest dzial c++/asm/delphi a nie pyython

Opublikowano

Właśnie potrzebuję tego w C++ / C# / Delphi (jedno z tych).

 

Nie ogarniam z chiny jak zrobić tę funkcję poradniki nic mi nie dają (chyba jestem za tępy xD).

 

Dokładnie chcę zdefiniować funkcję dajmy "Attack" która będzie wywoływać w procesie kamer.SendBattlePacket(vid) w cholerę szybko (to chyba łatwo ustawić xD)

 

## EDIT ##

#include <windows.h>
#include <Python.h>
#include "detours.h"
#include <string>
#include <sstream>
#include <iostream>
#include <fcntl.h>
#pragma comment(lib, "detours.lib")
using namespace std;

void (__stdcall* MainFunc)();
bool ScanForOffsets();
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
void* GetCallDest(void* addr);
void Main();
void SendPacket(const unsigned char* packetdata, unsigned long len);
void Hook_MainFunc();

DWORD Offset1 = 0; //mainstream
DWORD Offset2 = 0; //AddPacketData Function
DWORD Offset3 = 0; //AddSignatureByte Function
DWORD Offset4 = 0; //Update Function (MainFunc)
DWORD Offset5 = 0; //RegisterVid Function
void AutoAttack();

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            ScanForOffsets();
            MainFunc = (void (__stdcall*)())DetourFunction((PBYTE)Offset4, (PBYTE)Hook_MainFunc); //0x00471F50
            CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, hModule, 0, NULL);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

bool ScanForOffsets()
{
    DWORD Base = 0x00400000;
    DWORD SizeOfCode;

    DWORD i = Base;
    while ((memcmp((void *)i, "PE\0\0", 4)) && (i <= Base + 0x1000))
        i++;

    if (i <= Base + 0x1000)
        SizeOfCode = *(DWORD *)(i + 0x1C);


    BYTE Signature1[] = { 0x8B, 0x0D, 0xF4, 0x1C, 0x5F, 0x00, 0x52, 0x50, 0xE8, 0x67,
                          0x60, 0x00, 0x00, 0xE8, 0x12, 0x7B, 0x12, 0x00, 0x5E};


    BYTE Signature2[] = { 0x8B, 0xC1, 0x8B, 0x50, 0x38, 0x8B, 0x48, 0x34, 0x53, 0x8B,
                          0x5C, 0x24, 0x08, 0x2B, 0xCA, 0x3B, 0xD9};

    BYTE Signature3[] = { 0xC2, 0x04, 0x00, 0x8B, 0xCE, 0xE8, 0xB2, 0xCE, 0x0D, 0x00,
                          0x5E};

    BYTE Signature4[] = { 0x83, 0xEC, 0x08, 0x56, 0x8B, 0xF1, 0x8D, 0x44, 0x24, 0x04,
                          0x50, 0x8D, 0x4C, 0x24, 0x0C, 0x51};

    BYTE Signature5[] = { 0x8B, 0x44, 0x24, 0x04, 0x89, 0x81, 0x9C, 0x04, 0x00, 0x00,
                          0xC2, 0x04, 0x00};


    Offset1 = *(DWORD *)(dwFindPattern(Base + 0x1000, SizeOfCode, Signature1, "xx????xxx????x????x") + 2);
    Offset2 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature2, "xxxxxxxxxxxxxxxxx");
    DWORD Offset3_Address = (dwFindPattern(Base + 0x1000, SizeOfCode, Signature3, "xxxxxx????x") + 6);
    Offset3 = reinterpret_cast<DWORD>(GetCallDest((DWORD *)(Offset3_Address - 1)));
    Offset4 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature4, "xxxxxxxxxxxxxxxx");
    Offset5 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature5, "xxxxxxxxxxxxx") + 4;


    if ((Offset1))
        return true;
    else
        return false;
}

void* GetCallDest(void* addr)
{
    unsigned char* callDestAddr = reinterpret_cast<unsigned char*>(addr) + 1;

    uintptr_t relativeDest = *reinterpret_cast<uintptr_t *>(callDestAddr);
    return reinterpret_cast<void*>(uintptr_t(addr) + relativeDest + 5);
}

bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
    for(;*szMask;++szMask,++pData,++bMask)
        if(*szMask=='x' && *pData!=*bMask )
            return false;
    return (*szMask) == NULL;
}

DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
    for(DWORD i=0; i < dwLen; i++)
        if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
            return (DWORD)(dwAddress+i);
    return 0;
}


void SendPacket(const unsigned char* packetdata, unsigned long len)
{
    DWORD dwSendFunc = Offset2;
    DWORD dwAddSignatureByte = Offset3;
    __asm
    {
        PUSH packetdata
        PUSH len
        MOV EAX, Offset1
        MOV ECX, DWORD PTR DS:[EAX]
        CALL dwSendFunc
        MOV EAX, Offset1
        MOV ECX, DWORD PTR DS:[EAX]
        CALL dwAddSignatureByte
    }
}


void Hook_MainFunc()
{
    _asm pushad
    AutoAttack();
    __asm popad
    return (*MainFunc)();
}

void Main()
{
    AutoAttack();
}

void vid()
{
	    PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("player"), "GetTargetVID"), NULL);
	    if(vid != 0 or chr.INSTANCE_TYPE_NPC != chr.GetInstanceType(vid))
}
void StartAutoAttack(){
    PyObject* args = PyTuple_New(1);
    Py_INCREF(Py_True);
    PyTuple_SetItem(args, 0, Py_True);

    PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("kamer"), "SendBattlePacket(vid)"), args, NULL);
    PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("kamer"), "SendBattlePacket(vid)"), args, NULL);

    Py_XDECREF(ret);
    Py_XDECREF(args);
}

void AutoAttack()
{
    StartAutoAttack();
}

Coś naskrobałem, lecz wywala w cholere errorów. Jakieś pomysły? ._.

Opublikowano
#include "windows.h"
#include <Python.h>
#include "detours.h"

DWORD Offset1 = 0; //mainstream
DWORD Offset2 = 0; //AddPacketData Function
DWORD Offset3 = 0; //AddSignatureByte Function
DWORD Offset4 = 0; //Update Function (MainFunc)
DWORD Offset5 = 0; //RegisterVid Function
void (__stdcall* MainFunc)();
void (__stdcall* RegisterVid)();
bool Key1IsPressed = false;
bool pullmobs = true;
DWORD *vids = new DWORD[1000];
DWORD *nVID = new DWORD[1000];
int nVIDcount = 0;
int VIDcount = 0;
DWORD nhVID = 0;


bool ScanForOffsets();
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
void* GetCallDest(void* addr);
void CatchKeystrokes();
void Hook_MainFunc();
void Hook_RegisterVid();
void SendBattlePacket();
int GetInstanceType(long vid);
double GetCharacterDistance(long vid);
void AppendChat(const char *msg);
bool appIsPressed(long Key);
void RefreshVids();
void AddVID();

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
ScanForOffsets();
MainFunc = (void (__stdcall*)())DetourFunction((PBYTE)Offset4, (PBYTE)Hook_MainFunc); //0x00471F50
RegisterVid = (void (__stdcall*)())DetourFunction((PBYTE)Offset5, (PBYTE)Hook_RegisterVid); //0x004A0154
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

bool ScanForOffsets()
{
DWORD Base = 0x00400000;
DWORD SizeOfCode;

DWORD i = Base;
while ((memcmp((void *)i, "PE\0\0", 4)) && (i <= Base + 0x1000))
i++;

if (i <= Base + 0x1000)
SizeOfCode = *(DWORD *)(i + 0x1C);


BYTE Signature1[] = { 0x8B, 0x0D, 0xF4, 0x1C, 0x5F, 0x00, 0x52, 0x50, 0xE8, 0x67,
0x60, 0x00, 0x00, 0xE8, 0x12, 0x7B, 0x12, 0x00, 0x5E};


BYTE Signature2[] = { 0x8B, 0xC1, 0x8B, 0x50, 0x38, 0x8B, 0x48, 0x34, 0x53, 0x8B,
0x5C, 0x24, 0x08, 0x2B, 0xCA, 0x3B, 0xD9};

BYTE Signature3[] = { 0xC2, 0x04, 0x00, 0x8B, 0xCE, 0xE8, 0xB2, 0xCE, 0x0D, 0x00,
0x5E};

BYTE Signature4[] = { 0x83, 0xEC, 0x08, 0x56, 0x8B, 0xF1, 0x8D, 0x44, 0x24, 0x04,
0x50, 0x8D, 0x4C, 0x24, 0x0C, 0x51};

BYTE Signature5[] = { 0x8B, 0x44, 0x24, 0x04, 0x89, 0x81, 0x9C, 0x04, 0x00, 0x00,
0xC2, 0x04, 0x00};


Offset1 = *(DWORD *)(dwFindPattern(Base + 0x1000, SizeOfCode, Signature1, "xx????xxx????x????x") + 2);
Offset2 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature2, "xxxxxxxxxxxxxxxxx");
DWORD Offset3_Address = (dwFindPattern(Base + 0x1000, SizeOfCode, Signature3, "xxxxxx????x") + 6);
Offset3 = reinterpret_cast<DWORD>(GetCallDest((DWORD *)(Offset3_Address - 1)));
Offset4 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature4, "xxxxxxxxxxxxxxxx");
Offset5 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature5, "xxxxxxxxxxxxx") + 4;


if ((Offset1))
return true;
else
return false;
}

void* GetCallDest(void* addr)
{
unsigned char* callDestAddr = reinterpret_cast<unsigned char*>(addr) + 1;

uintptr_t relativeDest = *reinterpret_cast<uintptr_t *>(callDestAddr);
return reinterpret_cast<void*>(uintptr_t(addr) + relativeDest + 5);
}

bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask )
return false;
return (*szMask) == NULL;
}

DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
return (DWORD)(dwAddress+i);
return 0;
}


void SendPacket(const unsigned char* packetdata, unsigned long len)
{
DWORD dwSendFunc = Offset2;
DWORD dwAddSignatureByte = Offset3;
__asm
{
PUSH packetdata
PUSH len
MOV EAX, Offset1
MOV ECX, DWORD PTR DS:[EAX]
CALL dwSendFunc
MOV EAX, Offset1
MOV ECX, DWORD PTR DS:[EAX]
CALL dwAddSignatureByte
}
}


void Hook_MainFunc()
{
_asm pushad
CatchKeystrokes();
SendBattlePacket();
RefreshVids();
__asm popad
return (*MainFunc)();
}

void SendBattlePacket(long vid)
{
    PyObject* args = PyTuple_New(1);
    PyTuple_SetItem(args, 0, PyInt_FromLong(vid));
    PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("kamer"), "SendBattlePacket"), args, NULL);
if (pullmobs == false) {return;}
pullmobs = false;
int pulledmobs = 0;
for(int i=0; i <= VIDcount && pulledmobs < 113; i++)
{
if (GetInstanceType(vids[i]) == 0)
{
if (GetCharacterDistance(vids[i]) < 4000)
{
unsigned char buf[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF};
*(DWORD *)(buf + 2) = DWORD(vids[i]);
int size = 8;
SendPacket(buf, size);
delete [] buf;
pulledmobs++;
}
}
}
}

int GetInstanceType(long vid)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(vid));

PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("chr"), "GetInstanceType"), args, NULL);

int result = PyInt_AsLong(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}

double GetCharacterDistance(long vid)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(vid));

PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("player"), "GetCharacterDistance"), args, NULL);

double result = PyFloat_AsDouble(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}

void AppendChat(const char *msg)
{
PyObject* args = PyTuple_New(2);
PyTuple_SetItem(args, 0, PyInt_FromLong(1L));
PyTuple_SetItem(args, 1, PyString_FromString(msg));

PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("chat"), "AppendChat"), args, NULL);

Py_XDECREF(ret);
Py_XDECREF(args);


}
bool appIsPressed(long Key)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(Key));

PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("app"), "IsPressed"), args, NULL);

bool result = PyInt_AsLong(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}

void CatchKeystrokes()
{
if (appIsPressed(25) == true) //25 == P
{
if ((Key1IsPressed == false) && (pullmobs == false))
{
pullmobs = true;
}
Key1IsPressed = true;
}
else
{
Key1IsPressed = false;
}
}

void Hook_RegisterVid()
{
__asm pushad
__asm MOV nhVID, EAX
AddVID();
__asm popad
return (*RegisterVid)();
}

void RefreshVids()
{
for(int nvi = 0; nvi < nVIDcount; nvi++)
{
if (GetInstanceType(nVID[nvi]) == 0) //Check if vid is monster
{
DWORD *new_vids = new DWORD[1000];
int ni = 0;
for(int i=0; i < 1000; i++)
{
if (GetInstanceType(vids[i]) == 0) //Check if vid is still there
{
new_vids[ni] = vids[i];
ni++;
}
}
new_vids[ni] = nVID[nvi];
VIDcount = ni;
delete [] vids; //delete the old array
vids = &*new_vids; //make vids pointing to the new generated array
}
}
nVIDcount = 0; //reset Vid Count
}

void AddVID()
{
nVID[nVIDcount] = nhVID;
nVIDcount++;
}

Tak wygląda to teraz.. Że się Ciebie zapytam geniuszu. To forum oraz dział pomocy czy "Podaj mi linka którego widziałem tysiące razy wertując google, nie czytając postu zaznaczającego że nic te poradniki mi nie mówią"?

Opublikowano

Dobrze napisałeś "dział pomocy", a nie odwalanie całej roboty za jakiegoś debila któremu się nawet nie chce kursu przeczytać.

Tak więc oczekuje pomocy, a nie odesłanie gdzieś do forum/strony zewnętrznej. Piszę to tutaj bo chcę pomoc stąd nie od nich.

Kurs tyle o ile przeczytany co nie zmienia faktu że nie ogarniam i jest to dla mnie czarna magia - Nie jestem stworzony programistą.

 

@Refresh

Opublikowano

Nie rozumiem kompletnie co mają do siebie te 4 kolejne kody, które podałeś, bo nic o nich nie napisałeś.

Pomijając więc je:

 

na DLL który co dajmy 0.01 sec wywoła takie coś

... dziwny kod w pythonie

Musisz napisać kod w pythonie, który wywoła to jako funkcję/coś podobnego co 0.01 sec (nie wiem jak, nie siedzę w pythonie)

Później pewnie jakoś skompilować to do DLL (też nie wiem jak) lub napisać program w C lub C++, który wykorzystując API pythona (https://docs.python.org/2/c-api/ ?) będzie wywoływał ten skrypt co ileś czasu. Taki kod będzie łatwiej skompilować do DLL.

 

Coś naskrobałem, lecz wywala w cholere errorów. Jakieś pomysły? ._.

 

Podawaj errory.

 

ten kod http://wklej.org/id/1481717/

mogłeś podać od razu, bo to całkowicie może zmienić istotę problemu dla kogoś kto się na tym zna

 

dałeś dwa dziwne długie brzydkie kody w C++ i mówisz
"Coś naskrobałem"

Ale my nie wiemy co to jest, po co i co ten kod robi. Jak ci mamy pomóc skoro coś sobie tutaj wklejasz i liczysz na to, że odszyfrujemy ten kod nie znając kontekstu? W dodatku dla nas nie ma on nic wspólnego do tego co napisałeś w pierwszy poście.

 

Ten temat wygląda jak twój blog, a nie jak prośba o pomoc czy jakakolwiek dyskusja.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...