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

Hooking funkcji, zły adres


Rekomendowane odpowiedzi

Opublikowano

Witam.

Mam następujący problem.

 

Podczas hookowania funkcji, kiedy chcę pobrać adres mojej funkcji do której chcę skoczyć, adres jest za przeproszeniem z dupy wzięty. Mój kod:

 

#include <Windows.h>
#include <cstdio>
 
DWORD HookA = 0x00000000;
 
__declspec(naked) void HookFunc()
{
        __asm{
                        MOV EAX, DWORD PTR SS : [ESP + 4]
                        ADD DWORD PTR DS : [01005194h], EAX
                        JMP HookA + 0x5 //5 dalej żeby nie zapętliło
        };
}
 
int FlagClick(int arg)
{
        puts("flagclick event");
        return 4;
}
 
BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
        if (reason != DLL_PROCESS_ATTACH) return 1;
 
        AllocConsole();
        puts("k");
        char asmhook[] = {0xBB, 0x00, 0x00, 0x00, 0x00, //MOV EBX, 00000000h
                0xFF, 0xD3, //CALL EBX
                0x90, 0x90, 0x90 //NOP NOP NOP
        };
 
        puts("pobieram adresy");
        DWORD BaseAddress = (DWORD)GetModuleHandle(0);
        DWORD FlagClickA = (DWORD)HookFunc;
        HookA = BaseAddress + 0x346A;
 
        puts("memcpy adres");
        memcpy(asmhook + 1, &FlagClickA, 4);
 
        printf("BaseAddress: %8x\nFlagClickA: %8x\nHookA: %8x\n", BaseAddress, FlagClickA, HookA);
 
        DWORD old;
        puts("virtualprotect");
        if (VirtualProtect((LPVOID)HookA, 10, PAGE_EXECUTE_READWRITE, &old) == false) {
                puts("VirtualProtect Error"); return 1;
        }
        WriteProcessMemory(GetCurrentProcess(), (LPVOID)HookA, asmhook, 10, NULL);
        //memcpy((void*)HookA, asmhook, 7);
        VirtualProtect((LPVOID)HookA, 10, old, &old);
        return 0;
}
(memcpy źle działało, bo mi zamiast nopów wrzucało jakieś dziwne instrukcje do pamięci)

 

Pytanie - co tu jest źle, że adres funkcji FlagClick jest nieprawidłowy? Nie dość że nie ma w jego miejscu nic, to jeszcze jest poza pamięcią programu (to jest zwykłe winmine.exe, saper z win xp, adresy nie wychodzą ponad 0100FFFF)

 

Wszystko inne działa.

 

/trochę info:

 

Jzcixl4.png

Tak wygląda log w konsoli u mnie po wstrzyknięciu DLL (Winject)

 

JQm7wEU.png

Tak wygląda już zmieniona przez DLLkę funkcja

 

bzvz.png

A tu się kończy pamięć...

846331404756772371599.jpeg
Opublikowano

Jestem bardzo, bardzo zły w RE i takich low levelowych zabawach w ogóle.

 

Więc może bardzo, bardzo głupi strzał:

Jest poza pamięcią, ponieważ jest w twojej DLLce, która z zasady jest poza pamięcią programu, który ją dołącza?

Ta sygnatura jest pusta.

Opublikowano

Dobrze mówię! Chyba. Nie jestem pewny.

Chcesz wywołać funkcję z innego modułu. Jej adres jest w innym module.

 

Rozwiązanie jest proste:

Nie wiem jak to zrobić. Ale może GetProcAddress ?

Ta sygnatura jest pusta.

Opublikowano

Aggresion, niegłupi pomysł. Zaraz zobaczę, dzięki.

 

//Niestety dupa :< Albo ja źle tego używam, próbowałem na dwa sposoby:

DWORD FlagClickA = (DWORD)GetProcAddress(GetModuleHandle(NULL), "HookFunc");
Zwraca 0

 

DWORD FlagClickA = (DWORD)GetProcAddress(LoadLibrary("lewak.dll"), "HookFunc");
o dziwo pierwszy raz Winject "pomyślnie" injectuje DLLkę (zazwyczaj wywalał błąd ale wszystko działało), ale nie działa (brak tekstu w konsoli)
846331404756772371599.jpeg
Opublikowano

Poprostu użyj ms detours..

 

ps

dlaczego tutaj wrzucasz zawartość spod tego adresu?...

memcpy(asmhook + 1, &FlagClickA, 4);

/ GA-970A-UD3 / FX-6300 / Sapphire Xtreme 5830 / OCZ ZS 550W / Brutus M23 /

| MPC Coders Team | MPC Gold Member | C#, C++, PHP, (N)ASM, AutoIT, Python, Java |

Opublikowano

No to tak:

1. Gdy procesor wykonuje "call" na stos wrzucane są argumenty i adres powrotu ( tutaj HookFunc nie ma argumentów ), musisz zadbać o to, żeby stos był w takiej samej postaci po wyjściu z funkcji jak przed jej wywołaniem (inaczej duża szansa na crash). Dlatego nie możesz zrobić w tej funkcji JMP HookA+0x5 powinno być ret.

 

2. Jak wrzucasz adres do rejestru ebx, to musisz być pewny, że tam nie ma nic ważnego z czego program by chciał potem korzystać (bo kasujesz to co tam jest) albo zapisuj wcześniej co jest w ebx (push) i po wyjściu z Twojej funkcji przywróć (pop).

 

3. DllMain musi zwracać TRUE, inaczej od razu system zrobi DLL_PROCESS_DETACH bo inicjalizacja się nie powiodła (return 0), dlatego też prawdopodobnie Twój adres FlagClickA jest dobry, tylko że jak sprawdzasz to to jest poza pamięcia bo Twoje dll już system wywalił

 

PS. WriteProcessMemory nie potrzebuje wcześniej VirtualProtect, natomiast memcpy owszem (do pamięci bez write access)

 

:)

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...