Łączenie poprzez NamedPipe do DLLInject-ora

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

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

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

 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 :)
0

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

0

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

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

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

0

InjectDll to tak w skrócie:

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.

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?

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 ;-)

0

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

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 :-)

0

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

0

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

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ę:

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)

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ą -.-

0
    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.

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);
0

A można tak?

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

Ja pId pobrałem tak:

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

Też dobrze? :D

0

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

VirtualFreeEx(hProcess, pRmtLibraryPath, filenameLen, MEM_RELEASE);

Co zje***? :D

0

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

#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.

[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.

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?

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);

0

Otóż mam MessageBoxa i nie pokazuje go :/

0

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

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

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

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