DLL Inject nie działa - prosty przykład

Odpowiedz Nowy wątek
2011-08-25 13:54
aaa
0

Witam, chciałem nauczyć się tej techniki więc napisałem prosty program w którym dodaję albo odejmuję wartości od zmiennej i je wyświetlam, wygląda tak:

int main()
{
    int liczba = 0;
    char znak;
    for (;;)
    {
        std::cin >> znak;
        if (znak == '+')
            liczba++;
        if (znak == '-')
            liczba--;
        if (znak == 'k')
            break;
        std::cout << "Wartosc: " << liczba << std::endl;
    }
    return 0;
}

Napisałem przykładowe DLL:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
    switch(reason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,L"Injected",L"Udalo sie",MB_OK);
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return true;
}

Oraz injector z kursu:

bool Wstrzyknij(char* nazwa_dll,int PID)
{
    HANDLE Proces = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION,false,PID);
    if (!Proces)
    {
        std::cout << "Nie udalo sie otworzyc procesu" << std::endl;
        return false;
    }
    void* adres = VirtualAllocEx(Proces,NULL,strlen(nazwa_dll)+1,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
    if (!WriteProcessMemory(Proces,adres,(LPVOID) nazwa_dll,strlen(nazwa_dll),NULL))
    {
        std::cout << "Nie udalo sie zapisac nazwy dll do procesu" << std::endl;
        return false;
    }
    HMODULE Kr32 = GetModuleHandle(L"Kernel32");
    HANDLE WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"LoadLibraryA"),adres,0,NULL);
    WaitForSingleObject(WWatek,INFINITE);
    DWORD AdresDLL;
    GetExitCodeThread(WWatek,&AdresDLL);
    CloseHandle(WWatek);
    VirtualFreeEx(Proces,adres,0,MEM_RELEASE);
    WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"FreeLibrary"),(void*)&AdresDLL,0,NULL);
    WaitForSingleObject(WWatek,INFINITE);
    CloseHandle(WWatek);
    return true;
}
 
int main()
{
    int PID = 0;
    std::cout << "Podaj PID:" << std::endl;
    std::cin >> PID;
    if (!Wstrzyknij("DLL.dll",PID))
        std::cout << "Nie udalo sie" << std::endl;
    else
        std::cout << "Udalo sie" << std::endl;
    getch();
    return 0;
}

Wsadziłem DLL.dll do katalogu z Injectorem no i uruchomiłem pierwszy progam, zobaczyłem jego PID w Menedżerze Zadań i podałem i program wypisuje: "Udalo sie" lecz nigdzie nie pojawia się MessageBox.

Pozostało 580 znaków

2011-08-25 14:28
msm
0

Na pierwszy rzut oka OK. Po porównaniu ze swoim (pisanym dość dawno) działającym kodem również ok.

Możesz dodać lepszą obsługę błędów bo tak się składa że OpenProcess i VirtualAlloc to nie jedyne rzeczy które mogą się nie powieść. Na przykład mieszasz typy stringów - projekt kompilujesz jako ascii czy unicode?

A jak wygląda wstrzykiwana biblioteka?

Pozostało 580 znaków

2011-08-25 14:33
aaaa
0

Może chodzi o kompilator: uzywam MSVC 2008++ EE
DLL skompilował w trybie C, podobno ma pomóc - nie pomogło.

Wstrzykiwana biblioteka jest podana w 1 poście, lecz podam jeszcze raz:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
        switch(reason)
        {
        case DLL_PROCESS_ATTACH:
                MessageBox(NULL,L"Injected",L"Udalo sie",MB_OK);
                break;
        case DLL_PROCESS_DETACH:
                break;
        case DLL_THREAD_ATTACH:
                break;
        case DLL_THREAD_DETACH:
                break;
        }
        return true;
}

Projekt Unicode. Zmieniłem argument na DLL.dll\0 lecz wciąż nic. Dodam obsługę błędów i zobaczę co wyrzuca.

Pozostało 580 znaków

2011-08-25 14:38
aaa
0

Okej to zwraca błąd:

HANDLE WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"LoadLibraryA"),adres,0,NULL);
if (WWatek == NULL)
{
std::cout << "Watek nie zostal utworzony1" << std::endl;
return false;
}

Pozostało 580 znaków

2011-08-25 14:43
aaa
0

Przepraszam za post pod postem, proszę moderatora o ich połączenie.

Dostaję:

ERROR_ACCESS_DENIED

moderator chyba by nie miał co robić. nie łątwiej się zarejestrować? - krwq 2011-08-26 00:32

Pozostało 580 znaków

2011-08-25 14:46
aaa
0

Okej, działa. Wystarczyło dodać:
PROCESS_CREATE_THREAD

Pozostało 580 znaków

2011-08-25 14:50
aaa
0

Przepraszam za ten spam, ale raz zadziałało i już nie chce współpracować i żadna funkcja nie zwraca błędu x_x

Pozostało 580 znaków

2011-08-25 15:42
ocbocb
0

strzelam ze jakis defender/av blokuje ci virtualalloc

Pozostało 580 znaków

2011-08-25 16:33
aaa
0

Dobra jestem głupi x_x Zapomniałem dać DLL i Injectora tam gdzie exe - już wszystko działa. Dziękuję wszystkim.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0