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

Pomóżcie z DLL


Zenek97

Rekomendowane odpowiedzi

Opublikowano

Robię sobie wg tego poradnika http://www.p-programowanie.pl/cpp/odczytywanie-pamieci-wskaznikami-generycznymi/

Problem polega na tym, że kod programu wykona się raz.

extern "C" BOOL __stdcall DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
    switch(Reason)
    {
        case DLL_PROCESS_ATTACH:
            void* wsk = (void*)0x1005194;
            int liczba = (int)*(unsigned char*)wsk;   // odczytujemy wartosc liczba;
            liczba = liczba * 2;    // mnozymy razy 2
            *(char*)wsk = liczba;     // zapisujemy nowa wartosc zmiennej
         break;
    }
    return TRUE;
}

Ja chcę, żeby to była funkcja, która będzie się wykonywała wiele razy na sekundę.

Ponieważ będę do funkcji przekazywał parametr - mnożnik, który będzie przemnażał końcową liczbę do wstrzyknięcia...

void funkcja (int *mnoznik)
{
extern...
...
liczba = liczba * mnoznik;
...
} 

Niestety przy takim czymś wyskakuje mi błąd (przy extern):

error C2598: linkage specification must be at global scope
error C2601: 'DllMain' : local function definitions are illegal

 

Jak to naprawić? Jak wielokrotnie wstrzykiwać dane?

 

Opublikowano

 No właśnie z pętlą mi nie wychodziło, ale teraz widzę że nawet takie coś nie działa... 

Tz. nie ustawia mi na 20, tylko tyle ile ma być w oryginale 

extern "C" BOOL __stdcall DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
	while (1)
	{
		switch (Reason)
		{
		case DLL_PROCESS_ATTACH:
			void* wsk = (void*)0x123456;
			*(double*)wsk = 20;    
			break;
		}
		return TRUE;
	}
}

Udało mi się zrobić podmienianie pamięci funkcją WriteProcessMemory.

Ale wydaje mi się, że jest to brzydka metoda ponieważ robię to z poziomu DLLki. Gdybym zrobił EXEca to tak...

Patrząc na CheatEngin to adres komórki pamięci na pewno jest dobry, oraz jest typu double.

Ktoś może wie, dlaczego extern nie chce działać? 

Opublikowano
void funkcja (int *mnoznik)
{
extern...
...
liczba = liczba * mnoznik;
...
} 

Dlaczego robisz DllMain w funkcji? DllMain jest jak zwykły main tylko, że dla DLL'a i musi być widoczna globalnie.

 

 

 No właśnie z pętlą mi nie wychodziło, ale teraz widzę że nawet takie coś nie działa... 

Tz. nie ustawia mi na 20, tylko tyle ile ma być w oryginale 

extern "C" BOOL __stdcall DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
	while (1)
	{
		switch (Reason)
		{
		case DLL_PROCESS_ATTACH:
			void* wsk = (void*)0x123456;
			*(double*)wsk = 20;    
			break;
		}
		return TRUE;
	}
}

Nie zapętlaj DllMain, bo LoadLibrary nie wyjdzie i Twój injecter trafi szlag. Stwórz osobny wątek, który będzie się tym zajmował. A propos:

 

        case DLL_PROCESS_ATTACH:
            double* wsk = reinterpret_cast<double*>(0x123456);
            *wsk = 20;
            break;

YOU MUST DIE

- Ganon, Koridai

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...