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

Jak znalezc adres statyczny?


Rekomendowane odpowiedzi

Opublikowano

Witam macie jakieś szybkie sposoby na znalezienie adresów statycznych np do hp?

Szukasz kogoś kto wykona grafikę, logo do drużyny esportowej? 


Napisz do mnie postaram się wykonać prace jak najlepiej.


Aktualnie nie mam czasu na wykonywanie grafik.

Opublikowano

Zobaczyć co ma do niego dostęp w dehbuggerze

Co masz na myśli ?

Szukasz kogoś kto wykona grafikę, logo do drużyny esportowej? 


Napisz do mnie postaram się wykonać prace jak najlepiej.


Aktualnie nie mam czasu na wykonywanie grafik.

Opublikowano

Nie mysle by adresem statycznym byla ilosc HP.. bardziej juz adres do klasy Gracza ktora zawiera offset z HP.
Poczytaj o "multi level pointers".

Musisz zobaczyc gdzie jest alokowana i zapisywana klasa gracza, nastepnie znalezc offset.

Powodzenia

Opublikowano

@TheAifam5

Nie musisz mieć klasy gracza, tylko obiekt tej klasy który jest rzeczywiście wykorzystywany przez grę.

 

@TheDarkRider

Chodzi o to, abyś ustawił breakpoint np. na event zmiany wartości hp (on write), wtedy gdy twoje hp spadnie/zwiększy się powinieneś skoczyć na np. taką linijkę:

MOV DWORD PTR DS : [EDX + 0x18], EAX;

W tym miejscu musisz popatrzeć co siedzi w rejestrze EDX, a 0x18 będzie offsetem do wartości hp, szukasz który adres wskazuje na wartość EDX, jeśli jest to adres statyczny to zadanie wykonane, jeśli nie to robisz tak do skutku aż znajdziesz adres statyczny. Pamiętaj o zapisywaniu poszczególnych offsetów.

Bot do gry NosTale:


[bOT] NosBota 1.3v

Opublikowano

@TheAifam5

Nie musisz mieć klasy gracza, tylko obiekt tej klasy który jest rzeczywiście wykorzystywany przez grę.

 

@TheDarkRider

Chodzi o to, abyś ustawił breakpoint np. na event zmiany wartości hp (on write), wtedy gdy twoje hp spadnie/zwiększy się powinieneś skoczyć na np. taką linijkę:

MOV DWORD PTR DS : [EDX + 0x18], EAX;

W tym miejscu musisz popatrzeć co siedzi w rejestrze EDX, a 0x18 będzie offsetem do wartości hp, szukasz który adres wskazuje na wartość EDX, jeśli jest to adres statyczny to zadanie wykonane, jeśli nie to robisz tak do skutku aż znajdziesz adres statyczny. Pamiętaj o zapisywaniu poszczególnych offsetów.

Powiedzmy ze już znalazłem dobrą metode na znajdywanie adresów czy wskaznikow na adres, ponter scan. I pytanie mam sobie adres do amunicji wygląda on tak "mp.dll"+00131A70, widze ze często adresy wyglądają tak 0x432BB0, 0x432C04. Jak zmienić mój otrzymany adres na tak wyglądający 0x432BB0, 0x432C04?

Szukasz kogoś kto wykona grafikę, logo do drużyny esportowej? 


Napisz do mnie postaram się wykonać prace jak najlepiej.


Aktualnie nie mam czasu na wykonywanie grafik.

Opublikowano

"mp.dll" to adres bazowy, taki adres zwróci ci funkcja GetModuleHandle.

00131A70, dwa zera na początku są nieznaczące, więc możesz to zapisać jako 0x131A70

 

Najczęściej: adres bazowy + pointer [ + offset ] = obiekt, który poszukujesz, aczkolwiek nie zawsze.

Opublikowano

@TheAifam5

Nie musisz mieć klasy gracza, tylko obiekt tej klasy który jest rzeczywiście wykorzystywany przez grę.

 

@TheDarkRider

Chodzi o to, abyś ustawił breakpoint np. na event zmiany wartości hp (on write), wtedy gdy twoje hp spadnie/zwiększy się powinieneś skoczyć na np. taką linijkę:

MOV DWORD PTR DS : [EDX + 0x18], EAX;

W tym miejscu musisz popatrzeć co siedzi w rejestrze EDX, a 0x18 będzie offsetem do wartości hp, szukasz który adres wskazuje na wartość EDX, jeśli jest to adres statyczny to zadanie wykonane, jeśli nie to robisz tak do skutku aż znajdziesz adres statyczny. Pamiętaj o zapisywaniu poszczególnych offsetów.

Kolega wie co to: ASLR?

Co prawda dostaniesz sie bezposrednio do obiektu klasy ale... po ponownym uruchomieniu gry, adres juz moze byc calkiem inny, no chyba ze gra jest dosyc stara to nie bedzie posiadac ASLR.

Dlatego napisalem ze najlepiej znalezc globalny adres do gracza lub poprzez swiat, wtedy offset i problem z glowy.

(A jeszcze lepiej, sygnature :) By po aktualizacji nadal sie nie ciackac z szukaniem adresow recznie)

 

 

@TheAifam5

Nie musisz mieć klasy gracza, tylko obiekt tej klasy który jest rzeczywiście wykorzystywany przez grę.

 

@TheDarkRider

Chodzi o to, abyś ustawił breakpoint np. na event zmiany wartości hp (on write), wtedy gdy twoje hp spadnie/zwiększy się powinieneś skoczyć na np. taką linijkę:

MOV DWORD PTR DS : [EDX + 0x18], EAX;

W tym miejscu musisz popatrzeć co siedzi w rejestrze EDX, a 0x18 będzie offsetem do wartości hp, szukasz który adres wskazuje na wartość EDX, jeśli jest to adres statyczny to zadanie wykonane, jeśli nie to robisz tak do skutku aż znajdziesz adres statyczny. Pamiętaj o zapisywaniu poszczególnych offsetów.

Powiedzmy ze już znalazłem dobrą metode na znajdywanie adresów czy wskaznikow na adres, ponter scan. I pytanie mam sobie adres do amunicji wygląda on tak "mp.dll"+00131A70, widze ze często adresy wyglądają tak 0x432BB0, 0x432C04. Jak zmienić mój otrzymany adres na tak wyglądający 0x432BB0, 0x432C04?

 

 

Jesli injectujesz swoja DLLke (internal) do gry to najlepiej "GetModuleHandle" wykorzystac + offset do danych.

Jesli robisz jako EXE (external) to juz OpenProcess z flaga PROCESS_ALL_ACCESS, ReadProcessMemory i tez :)

 

Jesli robisz to jako external to kod pomocniczy w C++:

#pragma once
 
#include <Windows.h>
 
#include <memory>
#include <exception>
 
#include <boost\type_traits\is_pointer.hpp>
#include <boost\type_traits\is_array.hpp>
#include <boost\type_traits\remove_pointer.hpp>
#include <boost\type_traits\remove_bounds.hpp>
#include <boost\utility\enable_if.hpp>
 
class ProcessMemory
{
private:
    HANDLE _processHandle;
 
    bool IsValidHandle(HANDLE handle)
    {
        return handle != NULL && handle != INVALID_HANDLE_VALUE;
    }
 
public:
    ProcessMemory(int processId)
    {
        _processHandle = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, processId);
 
        if(!IsValidHandle(_processHandle)) throw std::exception();
    }
 
    ~ProcessMemory()
    {
        if(IsValidHandle(_processHandle))
        {
            CloseHandle(_processHandle);
            _processHandle = NULL;
        }
    }
 
    void Read(LPCVOID address, LPVOID buffer, SIZE_T size)
    {
        SIZE_T bytesRead;
 
        if(ReadProcessMemory(_processHandle, address, buffer, size, &bytesRead) == 0)
            throw std::exception();
 
        if(bytesRead != size)
            throw std::exception();
    }
 
    template<typename T>
    T Read(LPCVOID address, ...)
    {
        T object;
 
        Read(address, &object, sizeof(T));
 
        return object;
    }
 
    template<typename T>
    std::unique_ptr<typename boost::remove_pointer<T>::type>
    Read(LPCVOID address, typename boost::enable_if<boost::is_pointer<T>>::type* dummy = 0)
    {
        typedef boost::remove_pointer<T>::type TType;
 
        TType* object = new TType;
 
        try
        {
            Read(address, object, sizeof(TType));
        }
        catch(...)
        {
            delete object;
 
            throw;
        }
 
        return std::unique_ptr<TType>(object);
    }
 
    template<typename T>
    std::unique_ptr<T> Read(LPCVOID address, size_t elementCount, typename boost::enable_if<boost::is_array<T>>::type* dummy = 0)
    {
        typedef boost::remove_bounds<T>::type TType;
 
        TType* objects = new TType[elementCount];
 
        try
        {
            Read(address, objects, sizeof(TType) * elementCount);
        }
        catch(...)
        {
            delete[] objects;
 
            throw;
        }
 
        return std::unique_ptr<TType[]>(objects);
    }
 
    void Write(LPVOID address, LPCVOID buffer, SIZE_T size)
    {
        SIZE_T bytesWritten;
 
        if(WriteProcessMemory(_processHandle, address, buffer, size, &bytesWritten) == 0)
            throw new std::exception;
 
        if(bytesWritten != size)
            throw std::exception();
    }
 
    template<typename T>
    void Write(LPVOID address, const T &object)
    {
        Write(address, &object, sizeof(T));
    }
 
    template<typename T, size_t elementCount>
    void Write(LPVOID address, T (&objects)[elementCount])
    {
        Write(address, &objects, sizeof(objects));
    }
};
Opublikowano

@TheAifam5

Nic ci nie da klasa gracza, jeśli nie znajdziesz jej obiektu.... Nie jestem nawet pewien, czy klasy które nie są używane w kodzie w ogóle są brane pod uwagę przez kompilator

 

"adres do gracza"

Adres do czego? Czym według ciebie jest gracz? Nie ma czegoś takiego jak adres do gracza.

 

"po ponownym uruchomieniu gry, adres juz moze byc calkiem inny,"

WTF, przecież po to napisałem jak znaleźć adres statyczny

Bot do gry NosTale:


[bOT] NosBota 1.3v

Opublikowano

Dzięki, a pytanko polecacie jakieś poradniki gdzie nauczę się od zera odczytywać i robić wpisy do procesów? C++ w miarę ogarniam lecz z procesami jeszcze nie miałem do czynienia.

Szukasz kogoś kto wykona grafikę, logo do drużyny esportowej? 


Napisz do mnie postaram się wykonać prace jak najlepiej.


Aktualnie nie mam czasu na wykonywanie grafik.

Opublikowano

No dobra rozumiem :P to jak polecicie coś ?

Szukasz kogoś kto wykona grafikę, logo do drużyny esportowej? 


Napisz do mnie postaram się wykonać prace jak najlepiej.


Aktualnie nie mam czasu na wykonywanie grafik.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...