BYTE InjectAndExecute(char* code, int len,DWORD pid,INJECTOR inj) { HANDLE hProcThread; HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid); if (!hProcess) return 0;
WriteProcessMemory(hProcess,inj.pFunction,code,len,NULL); //WriteProcessMemory(hProcess,pParams,Params,250,NULL); параметры нам больше не нужны, удалим эту строчку
// pParam заменим на NULL, так как праметров у нас теперь нет hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)inj.pFunction,NULL,NULL,NULL); if(hProcThread==INVALID_HANDLE_VALUE) return 0;
Я замучился разбираться,что же здесь не так ,за сегодняшний день
клиент крашился раз 20-25
Уважаемые форумчане,прошу помощи)
Пишу на Visual Studio 10 на c++,Windows XP,Тестирую на РуОффе
Последний раз редактировалось aloned; 04.05.2013 в 21:47.
Добавлено через 10 минут
я просто понять не могу для чего тогда эта функция и ,что с ней дальше делать,я как понимаю на этом моменте данные пуляются в память приложения InjectAndExecute(fdata,118,pid,inj);
Последний раз редактировалось aloned; 04.05.2013 в 22:17.
Причина: Добавлено сообщение
1. Выделяете память в открытом процессе "elementclient.exe"
pfunc = (DWORD*)VirtualAllocEx(hProcess,NULL,511,MEM_COMMI T,PAGE_READWRITE);
2. Записываете в эту память вашу функцию inj.pFunction.
WriteProcessMemory(hProcess,inj.pFunction,code,len ,NULL);
3. Создаете поток в процессе для запуска записанной туда функции.
hProcThread = CreateRemoteThread(hProcess,NULL,NULL, (LPTHREAD_START_ROUTINE)inj.pFunction,NULL,NULL,NU LL);
В вашем коде нет текста функции inj.pFunction.
К примеру.
//Класс
class INJECTOR
{
void pFunction();
};
//Метод класса
void INJECTOR :: pFunction()
{
//код который вы запускаете в процессе elemenclient.exe и который вы не показали.
}
//Объект класса
INJECTOR inj;
//вы показали только следующее:
.................
inj.pFunction
Раз 20 - это очень мало. Я боюсь даже подумать, сколько он у меня вылетал. В итоге я пошел по пути внедрения dll c нужными мне функциями.
.................
Последний раз редактировалось Bludun; 05.05.2013 в 00:10.
я как понял по этому гайду внедряется не asm вставка,а массив данных char fdata[118]="\x60\xA1\x00\x00\x00\x00\x8B\xB0\x11\x11\x11\x11 \x8B\x8E\x22\x22\x22\x22\x6A\x01\xBB\x33\x33\x33\x 33\xFF\xD3\x89\xC7\x8D\x44\xE4\x0C\x50\x68\x44\x44 \x44\x44\x89\xF9\xBB\x55\x55\x55\x55\xFF\xD3\x8B\x 8E\x66\x66\x66\x66\x6A\x00\x6A\x01\x57\x6A\x01\xBB \x77\x77\x77\x77\xFF\xD3\xA1\x88\x88\x88\x88\x8B\x 80\x99\x99\x99\x99\x8B\x80\xAA\xAA\xAA\xAA\x8B\x40 \x30\x8B\x48\x04\xB8\xBB\xBB\xBB\xBB\x89\x41\x20\x B8\xCC\xCC\xCC\xCC\x89\x41\x24\xB8\xDD\xDD\xDD\xDD \x89\x41\x28\x61\xC3";
Добавлено через 21 час 52 минуты
Код:
BYTE InjectAndExecute(void *Func, void* Params,DWORD pid,INJECTOR inj)
{
HANDLE hProcThread;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if (!hProcess) return 0; // выйдем из функции если не удалось открыть процесс
WriteProcessMemory(hProcess,inj.pFunction,Func,250,NULL);
WriteProcessMemory(hProcess,inj.pParams,Params,250,NULL);
hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)inj.pFunction,inj.pParams,NULL,NULL);
if(hProcThread==INVALID_HANDLE_VALUE) return 0; // не удалось создать поток
WaitForSingleObject(hProcThread,INFINITE); // ожидаем завершения работы потока
CloseHandle(hProcThread); // закрываем хэндл нашего потока
CloseHandle(hProcess); // закрываем хэндл процесса
return 1; // успешная инъекция и выполнение кода
}
void Move(move m)
{
float x,y,z;
DWORD flying,CallAddress1,CallAddress2,CallAddress3,GAMEADRESS;
x=m.x;
y=m.y;
z=m.z;
flying = m.walkmode;
GAMEADRESS = GA;
CallAddress1 = 0x479A40;
CallAddress2 = 0x47DD40;
CallAddress3 = 0x479EB0;
_asm
{
pushad
mov eax, dword ptr [GAMEADRESS]
mov esi, dword ptr [eax+0x34]
mov ecx, dword ptr [esi+0x10BC]
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+0x18]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+0x10BC]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, dword ptr [GA]
mov eax, dword ptr [eax+0x34]
mov eax, dword ptr [eax+0x10BC]
mov eax, dword ptr [eax+0x30]
mov ecx, dword ptr [eax+0x4]
mov eax, x
mov dword ptr[ecx+0x20], eax
mov eax, z
mov dword ptr[ecx+0x24], eax
mov eax, y
mov dword ptr[ecx+0x28], eax
popad
}
}
mi.walkmode=0;
mi.x =0;
mi.y = 0;
mi.z = 0;
InjectAndExecute(&Move,&mi,pid,inject);
переписал код и все-равно вылетает клиент
Последний раз редактировалось aloned; 06.05.2013 в 18:33.
Причина: Добавлено сообщение
struct INJECTOR
{
DWORD pid; // Идентификатор Процесса
void* pFunction; // Указатель на память для функций
void* pParams; // Указатель на память для параметров
}
BYTE SendPacket(PACKET* pack)
{
HANDLE hProcThread;
char fdata[29]="\x60\x8B\x0D\x00\x00\x00\x00\x8B\x49\x20\x68\x11\x11\x11\x11\x68\x22\x22\x22\x22\xB8\x33\x33\x33\x33\xFF\xD0\x61\xC3";
int lenfunc=29;
DWORD func=F_SEND_PACKET;
DWORD ba=BA;
DWORD len=pack->len;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if (!hProcess) return 0;
WriteProcessMemory(hProcess,pParams,pack->Bytes,len,NULL); // инжектим данные пакета
DWORD addr=DWORD(pParams); // возьмём адрес расположения данных нашего пакета
memcpy(fdata+3,&ba,4);
memcpy(fdata+11,&len,4);
memcpy(fdata+16,&addr,4); // запишем адрес расположения пакета прямо в массив кода
memcpy(fdata+21,&func,4);
WriteProcessMemory(hProcess,pFunction,fdata,lenfunc,NULL); // инжектим наш код
hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,NULL,NULL,NULL);
if(hProcThread==INVALID_HANDLE_VALUE) // не удалось создать поток
{
CloseHandle(hProcess);
return 0;
}
WaitForSingleObject(hProcThread, INFINITE); // ожидаем завершения работы потока
CloseHandle(hProcThread); // освобождаем
CloseHandle(hProcess);
return 1; // успешная инъекция и выполнение кода
}
// Структура пакета
struct PACKET
{
int len; // длина
BYTE Bytes[60]; // данные пакета
};
// Убрать таргет
void TargetOff()
{
PACKET pack;
pack.len=2;
pack.Bytes[0]='\x08';
pack.Bytes[1]='\x00';
SendPacket(&pack);
}
Что у вас за версия компилятора, которая воспринимает такую строку:
char fdata[29]="\x60\x8B\x0D\x00\x00\x00\x00\x8B\x49\x20\x68\x11 \x11\x11\x11\x68\x22\x22\x22\x22\xB8\x33\x33\x33\x 33\xFF\xD0\x61\xC3";
Что это вообще?
Массив символов размером 29 символов.
Почему 29? Тут явно не 29.
Что означает запись \x60? \x такого спецсимвола я что-то не припомню, ну а с другой стороны, если это шестнадцатеричный код, то запись должна быть {'0x60',...};
Ну, и опять же, почему размер 29? Компилятор как и я ругаемся на такую длинну массива, потому что символов тут явно больше....
Последний раз редактировалось Xantrax; 07.05.2013 в 12:28.
код не мой,а из одной из тем,вы не внимательно прочитали мои посты ,а я там писал,что у автора небольшой косяк с размерами массивов char там по всюду надо прибавить 1
\x - это управляющий символ обозначающий,что за ним следует шестнадцетиричное число
Когда вы написали мне:"Пробовал...", а я спросил у вас: "покажете?", неужели вы подумали что я прошу чужой код?
Если код не ваш, то в таком случае (извиняюсь за выражение) нафига его плодить по всему форуму? Дали бы ссылку и все, а дальше я бы уже спрашивал, если бы мне не что-то непонятно было.
Цитата:
\x - это управляющий символ обозначающий,что за ним следует шестнадцетиричное число
Ну, вообще я понимаю, что это. Не нужно мне повторять прописные истины. Вы бы лучше бы линк сделали на сайт где о нем (управляющем символе) можно почитать, а то ни [Ссылки могут видеть только зарегистрированные пользователи. ], ни [Ссылки могут видеть только зарегистрированные пользователи. ], ни [Ссылки могут видеть только зарегистрированные пользователи. ] нет упоминаний.
Нашел упоминание об этом управляющем символе у Герберта Шилдта в "Полный справочник по С", ну и еще на одном сайте.
Вопрос:
Что такое F_SEND_PACKET и чему оно равно. Автор говорит, что значение приведено в теме с офсетами, но я видимо не туда смотрю, в общем не вижу.