Łączenie poprzez NamedPipe do DLLInject-ora

Łączenie poprzez NamedPipe do DLLInject-ora
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Witam, nie mam co robić i z nudów pisze bota do Tibii, wersja 8.60.
Otóż mam problem, ładuję offsety do Constants, przez Pipe - pakietami odpowiednimi, ładuje je ale albo wywali na

Kopiuj
const DWORD sleepResult = ::SleepEx(INFINITE, TRUE);

w PipeThreadProc albo wywali tu memcpy(&dwOldCall, (LPVOID)(dwAddress+1), 4); //Get the old function address for unhooking

Kopiuj
 w `HookCall`.
`sleepResult` wynosi wtedy 192.
Kod main.cpp: http://4programmers.net/Pastebin/3069
Biblioteka którą używam: http://tibiaapi.googlecode.com/svn/trunk/tibiaapi/InjectedDLL/
z niej także mam klase Packet :)

Wole programowac niz spac :)
edytowany 1x, ostatnio: TheAifam5
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0

Przy drugim wariancie sprawdź adresy czy są w miarę możliwe.


Asm/C/C++
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Offsety które wysyłam przez Pipe są poprawne. Natomiast po wysłaniu pakietu uruchamiający hooki itd... wywala teraz aby

Kopiuj
const DWORD sleepResult = ::SleepEx(INFINITE, TRUE);

Wole programowac niz spac :)
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Pomoże ktoś, mniej więcej jak działa ten InjectedDLL jakie trzeba pakiety wysłać??


Wole programowac niz spac :)
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0

InjectDll to tak w skrócie:

Kopiuj
void InjectDll(HANDLE hProcess, const char * szDllPath)
{
    size_t sLibPathLen = (strlen(szDllPath)+1);
    SIZE_T bytesWritten = 0;

    void * pRmtLibraryPath = VirtualAllocEx(hProcess, NULL, sLibPathLen, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, pRmtLibraryPath, (void*)szDllPath, sLibPathLen, &bytesWritten);
    HMODULE hKernel32 = GetModuleHandle("Kernel32");
    FARPROC pfnLoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA");
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pfnLoadLibraryA, pRmtLibraryPath, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    VirtualFreeEx(hProcess, pRmtLibraryPath, sizeof(pRmtLibraryPath), MEM_RELEASE);
}

Poza tym, wątpię, że ktokolwiek ci pomoże, bo nie każdy w tibii grzebie.


Asm/C/C++
edytowany 3x, ostatnio: mwl4
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Jeśli użyję Twojego kodu na InjectDLL to DLL-ka po CloseHandle(w Twojej funckji) nadal bedzie w aplikacji do której injectuje?


Wole programowac niz spac :)
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0

Kod Dllki powinien być jeszcze w pamięci injectowanego procesu po CloseHandle :-) . Ale możesz to zawsze sprawdzić jak nie wierzysz :)
No bo, ty tylko zamykasz wątek, a nie zwalniasz dllki ;-)


Asm/C/C++
edytowany 1x, ostatnio: mwl4
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Wytłumacz mi działanie Injectingu... jak to działa?


Wole programowac niz spac :)
mwl4
Zobacz sobie mój post, w którym opisałem co nieco injectDll oraz hookowanie.
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0

Nie rozwodząc się:
Chodzi o to, że alokujemy w procesie injectowanym ileś tam pamięci na ścieżkę do dllki, następne zapisujemy do tej pamięci właśnie tą ścieżkę, następnie pobieramy uchwyt do kernel32.dll, próbujemy ładować z kernel32.dll funkcję o nazwie LoadLibraryA, no i kiedy już będziemy mieli wskaźnik na tą funkcję, no to tworzymy nowy wątek w tym procesie injectowanym, gdzie funkcją początkową jest właśnie LoadLibrary, i przekazujemy parametr do tej funkcji właśnie ścieżkę do dll, ale ścieżkę zapisaną już w tym injectowanym procesie :-)
I w tym momencie jeśli stworzyliśmy wątek w którym LoadLibrary załaduje do injectowanego procesu naszą dllkę to tylko zwalniamy ten wątek kiedy już zakończy działanie, zwalniamy pamięć użytą na ścieżkę do dllki, i voila!
W tym momencie dllka którą załadowaliśmy przez LoadLibrary jest w procesie injectowanym, wykonało się DllMain, a gdy DllMain się zakończy to dllka i tak dalej jest w tym procesie.
I w tym momencie możesz w dllce zająć się hookami, zabawą w pamięci, dosłownie czym chcesz, ponieważ jesteś w procesie :-)


Asm/C/C++
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Dzięki ;) A DLL którą injectuje gdzie ma sie znajdować? w ścieżce programu który injectuje czy w programie injectującym?


Wole programowac niz spac :)
mwl4
Raczej musi się znajdować w programie injectującym. Bo musisz ją przepisać do procesu incjectowanego :-) No a przepisać tzn: VirtualAllocEx w którym za proces podajesz ten pobrany lub utworzony przez CreateProcess, WriteProcessMemory, i na końcu jak już ścieżka do dllki nie jest potrzebna w procesie injectowanym to VirtualFreeEx. Wszystko masz na górze :)
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Mam funkcję (przepisałem ją z http://tibiaapi.googlecode.com/svn/trunk/tibiaapi/Objects/Client.DllHelper.cs):

Kopiuj
bool Inject(std::string filename, HANDLE hProcess)
{
	size_t filenameLen = strlen(filename.c_str() + 1);
	SIZE_T bytesWritten = 0;

	void * pRmtLibraryPath = VirtualAllocEx(hProcess, 0, filenameLen, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	WriteProcessMemory(hProcess, pRmtLibraryPath, filename.c_str(), filenameLen, &bytesWritten);

	HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"), pRmtLibraryPath, 0, 0);
	WaitForSingleObject(hThread, INFINITE);

	VirtualFreeEx(hProcess, pRmtLibraryPath, filenameLen, MEM_RELEASE);
	std::cout << bytesWritten << std::endl;
	std::cout << pRmtLibraryPath << std::endl;
	std::cout << hThread << std::endl;
	std::cout << pRmtLibraryPath << std::endl;
	return hThread > 0 && pRmtLibraryPath > 0;
}

Otóż każda ze zmiennych którą wysyłam do konsoli jest równa 0.

Tak wywołuję funkcję:

Kopiuj
Inject("C:\\Users\\TheAifam5\\Documents\\Visual Studio 2013\\Projects\\TiBot\\Debug\\Core.dll", hTibia)

w Debuggerze zauważyłem to "COŚ":
The thread 0x1b1c has exited with code -1073741510 (0xc000013a)


Wole programowac niz spac :)
edytowany 2x, ostatnio: TheAifam5
mwl4
W takim razie hTibia jest niepoprawne :-) Poza tym, funkcja którą masz jest identyczna jak moja, tylko, że ja używam bardziej śmieci z C, a ty z C++.
TheAifam5
Ale z hTibia pobieram pid itd.. Wygląda to tak: HWND hTibia = FindWindow("TibiaClient", NULL);
mwl4
HANDLE hProcess to nie HWND ;-)
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Więc jak odczytać HANDLE procesu? :D
tzn jaka funkcją, nie chce by ktoś mi mówił znów że czekam aby na gotową odpowiedź bo tacy idioci się znajdą -.-


Wole programowac niz spac :)
edytowany 1x, ostatnio: TheAifam5
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0
Kopiuj
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {  
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Tutaj już masz HANDLE procesu

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

Możesz poszukać innej metody. To jest pobieranie już gotowego procesu.
Sam osobiście ja bym ci radził użyć czegoś innego.
Potraktować program injectujący jako launcher.

Kopiuj
char szGameExePath [MAX_PATH] = "sciezka_do_exe"; 
char szGamePath[MAX_PATH] = "sciezka_tam_gdzie_exe_egzystuje";
STARTUPINFO siStartupInfo = {0};
PROCESS_INFORMATION piProcessInformation = {0};
siStartupInfo.cb = sizeof(siStartupInfo);

if(!CreateProcess(szGameExePath, "cmd_line", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, szGamePath, &siStartupInfo, &piProcessInformation))
{
    MessageBox(NULL,"Cannot create game process.","Error",MB_ICONERROR);
    return E_FAIL;
}

char szPath[MAX_PATH] = { 0 };
GetModuleFileName(NULL,szPath,MAX_PATH);
for(unsigned int i = strlen(szPath); i > 0; i--)
{
    if (szPath[i] == '\\')
    {
        szPath[i] = '\0';
        break;
    }
}
 
strcat(szPath,"\\core.dll");
 
InjectDll(piProcessInformation.hProcess,szPath);
 
ResumeThread(piProcessInformation.hThread);

Asm/C/C++
edytowany 2x, ostatnio: mwl4
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

A można tak?

Kopiuj
HANDLE getHandle(DWORD pID)
{
	return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
}

Wole programowac niz spac :)
mwl4
Można, tylko pid musisz mieć ;-) A żeby pobrać pid musiałbyś zrobić coś takiego jak ja na górze :-)
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Ja pId pobrałem tak:

Kopiuj
DWORD TibiaPid;
GetWindowThreadProcessId(FindWindow("TibiaClient", NULL), &TibiaPid);

Też dobrze? :D


Wole programowac niz spac :)
mwl4
Dobrze, napisałem to w nowym poście, ale usunięte. Ale ja ci radzę dobrze się zastanowić czy forma launchera nie byłaby lepsza :-) Byłbyś od samego początku tworzenia gry, i mógłbyś bez większego wysiłku pobierać po kolei uchwyty do np. IDirect3D9/Hwnd czy innych.
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Więc tak jest następny problem. Otóż dostaję kod. (GetLastError : 87)

Kopiuj
VirtualFreeEx(hProcess, pRmtLibraryPath, filenameLen, MEM_RELEASE);

Co zje***? :D


Wole programowac niz spac :)
TheAifam5
Zmieniłem "filenameLen" na "sizeof(pRmtLibraryPath)". Lecz bez zmian
mwl4
Daj lepiej tak: void * pRmtLibraryPath = VirtualAllocEx(hProcess, 0, filenameLen, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); Poza tym, notacja węgierska nie obowiązuje? (facepalm)
TheAifam5
Właśnie że tak mam. Literka w literke. "void * pRmtLibraryPath = VirtualAllocEx(hProcess, 0, filenameLen, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);"
mwl4
sizeof(pRmtLibraryPath) = 4 ;-) Sprawdzaj argi.
KR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

Moze wstrzykniecie przy odpalaniu? Kiedys taki maly loader sobie zrobilem. Calkiem dobrze sie sprawowal.

Kopiuj
#include "stdafx.h"

#include <iostream>
#include <algorithm>

using namespace std;

#define MAXNAMESIZE 255

string buildFilePath(string path, string fileName) {
	string tmp = path + "\\" + fileName, result;
	for (int i = 0; i < tmp.size(); i++) {
		if (tmp[i] == '\\') {
			result += "\\";
			result += "\\";
		}
		else {
			result += tmp[i];
		}
	}
	return tmp;
}

PROCESS_INFORMATION startProcess(string exeFilePath, string params) {

	STARTUPINFOA lpStartupInfo = { sizeof(lpStartupInfo) };
	PROCESS_INFORMATION lpProcessInfo;

	memset(&lpStartupInfo, 0, sizeof(lpStartupInfo));
	memset(&lpProcessInfo, 0, sizeof(lpProcessInfo));

	CreateProcessA(exeFilePath.c_str(),
		(LPSTR) params.c_str(), NULL, NULL,
		NULL, NULL, NULL, NULL,
		&lpStartupInfo,
		&lpProcessInfo);

	return lpProcessInfo;
}

int main() {

	char folderPath[MAX_PATH], dllName[MAXNAMESIZE], exeName[MAXNAMESIZE], params[MAXNAMESIZE];
	GetCurrentDirectoryA(MAX_PATH, folderPath);
	string configFilePath = buildFilePath(folderPath, "loader.cfg");

	GetPrivateProfileStringA("Loader", "dllName", "", dllName, MAXNAMESIZE, configFilePath.c_str());
	GetPrivateProfileStringA("Loader", "exeName", "", exeName, MAXNAMESIZE, configFilePath.c_str());
	GetPrivateProfileStringA("Loader", "params", "", params, MAXNAMESIZE, configFilePath.c_str());

	string exeFilePath = buildFilePath(folderPath, exeName);
	string dllFilePath = buildFilePath(folderPath, dllName);

	if (exeName[0] == '\0') {
		cerr << "Unable to load config file.\n" + configFilePath + '\n';
		system("pause");
		return -1;
	}

	PROCESS_INFORMATION pInfo = startProcess(exeFilePath, params);
	HMODULE hKernel32 = GetModuleHandleA("KERNEL32");
	void* pLibRemote;

	pLibRemote = VirtualAllocEx(pInfo.hProcess, NULL, MAXNAMESIZE, MEM_COMMIT, PAGE_READWRITE);
	WriteProcessMemory(pInfo.hProcess, pLibRemote, (void*) dllFilePath.c_str(), MAXNAMESIZE, NULL);
	CreateRemoteThread(pInfo.hProcess, NULL, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(hKernel32, "LoadLibraryA"), pLibRemote, 0, NULL);

	return 0;
}

Programik wraz z loader.cfg wrzuca sie do folderu z gra i z niego odpala.

Kopiuj
[Loader]
exeName=cstrike.exe
dllName=AntiBan.dll
params=-game cstrike

Moznaby rozszerzyc na podpinanie pod procesy pochodne procesu startowanego rowniez. Steama tym odpalalem na przyklad ;) W procesy ktore potem steam odpala mozna wpiac sie rowniez.

mwl4
Napisałem mu już o tym.
TheAifam5
Kuszące. zaraz potestuje
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Już wiem co było przyczyną...
Otóż przeczytałem w dokumentacji VirtualFreeEx, że jeśli ostatni parametr jest MEM_RELEASE, to poprzedni musi być równy 0(czyli rozmiar), jeśli natomiast ustawiłbym MEM_DECOMMIT, musiałbym podać rozmiar. ;)

A teraz jak sprawdzić czy na pewno DLLka sie zainjectowała?


Wole programowac niz spac :)
edytowany 1x, ostatnio: TheAifam5
mwl4
  • Rejestracja:ponad 12 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:399
0

Na początku DllMain MessageBox i już powinieneś wiedzieć :D

A poza tym, możesz sobie konsolę stworzyć żeby printować różne rzeczy:

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONIN$", "r", stdin);


Asm/C/C++
edytowany 1x, ostatnio: mwl4
TheAifam5
Wiesz może jak nazywała sie ta biblioteka co pozwala na debugowanie? Ona była napisana w C++ i linkowałeś biblioteke do projektu oraz dodawałeś chyba header i coś jeszcze.. wiem że takie coś jest pod VS
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Otóż mam MessageBoxa i nie pokazuje go :/


Wole programowac niz spac :)
mwl4
W takim razie dllka się nie ładuje. Pewny jesteś, że podajesz dobrą ścieżkę do LoadLibrary?
TheAifam5
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:127
0

Dobra.. Mam! ;3 U Cb widziałem

Kopiuj
size_t filenameLen = strlen(filename.c_str() +1);

coś podobnego z +1... usunąłem to +1 i teraz MessageBoxy działaja :)


Wole programowac niz spac :)
Zobacz pozostałe 2 komentarze
TheAifam5
No już to poprawiłem ;) Teraz jest inny problem. Nie mogę podłaczyć się pod Pipe. Injector ma "serwer", a DLLka ma sie pod niego podłączyć ;) Jak nie będę wiedział co robić to napisze ;)
mwl4
Poprzez usunięcie +1 nie naprawiłeś tylko ciągle masz nadzieję, że po stringu nastąpi cudem 0, ale jeśli nie nastąpi to śmieciuchy będą wyświetlane/brane do funkcji jak np. LoadLibrary. Poza tym, Pipe? co to jest do cholery?
mwl4
Głupszej rzeczy nie widziałem. Po co ci to? Launcher to tylko launcher, uruchamiasz, po 5 sekundach znika i nie ma po nim ani śladu. Wszystko co ma się dziać ma zostać zawarte w dllce.
TheAifam5
Dzięki za pomoc, będę kombinować ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.