Перейти к содержанию

SiriusED

Пользователи
  • Постов

    65
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные SiriusED

  1. Короче хукнуть получилось, но проблема теперь такая, функция принимает толи char* толи BYTE*, и во общем если принимаю char* то получаются кракозябры, мне нужно походу перевести эти байты в HEX.

    Но я уже реально сижу два часа и рабочего кода так и не нашел... То вылеты, то тупо не работает запарился уже просто... Помогите перевести байты в HEX-строку.

  2. Ну во общем дали мне на одном форуме точный адрес и ollyDBG-паттерн к ней, ну и еще дали тело функции вместе с типами и аргументами, короче дали все что нужно..

    Но все таки это просто дали, но как это сделать самому я так и не понял, а именно:

     

    Смотри, под словом сигнатура я имел введу типы и количество аргументов, которые принимает эта функция, вот скажем пример:

    Нашел я через тот же Ultimap адрес нужной мне функции, но зная один лишь адрес, я хукнуть эту функцию не смогу никак... Ибо мне нужно знать точное количество и типы всех принимающих\возвращающих параметров. Вот собственно меня интересует в первую очередь как мне эти параметры узнать и на сколько это сложно?

     

    Ну и еще такая вот штука, вот тот адрес который мне дали, короче на нем не "call адрес функции", а вот такие инструкции:

    mov eax,[esp+0C] // Вот эта инструкция висит на том адресе что мне дали на форумеcmp eax,10jnl 00961007mov eax,[esp+04]mov [eax+04],00000005xor al,alret

    Так вот что мне хукать то? прямо этот адрес или что? А то как то впадлу переспрашивать уже на том форуме после благодарствий :)

  3. Не ну кажется адрес я уже нашел, да и даже если не нашел то найду, ибо СЕ мне нашел 407 возможных вариантов вызова функций при моем действии... Но вот как мне теперь найти сигнатуру то? А без сигнатуры я не смогу же поставить хук, правильно?

     

    Во общем в чем лучше всего искать сигнатуру, и как это делается в СЕ Ultimap?

     

    P.S. Ну а так то функция являет собой шифратор, и возможно дешифратор текста. Так что в любом случае она 100% должна принимать и возвращать текст, но вот даже уже с таким вариантом может быть два варианта:

    Возврат текста через^

    char* Function(char* inText);//илиvoid Function(char* out\ref inText);

    Ну я так понимаю что сигнатуру вычислить это просто ацки сложная задача да?

  4. Всем привет. Ситуация такая: Есть функция которая меняет значение, я поставил хук на эту функцию и получаю готовое значение, но как мне узнать через какую функцию это значение создается?

    Так же мне известно что функция которая создает это значение срабатывает при определенном действии в игре.

     

    Вот как мне узнать что это за функция во обще? единственное что приходит на ум - как то мониторить все вызываемые функции этой игрой непосредственно в момент определенного действия(нажатия кнопки TAB). Вот через что такое можно осуществить?

     

    Знаю как такое сделать можно на перехват WinAPI-функций, а вот как перехватывать все функции игровые? Очень нужна помощь в этом вопросе.

  5. Не ну я думал типа что при каждом вызове функции будет выделятся память...

    void fonc1(){       char sb[512];}

    По этому и спросил, а то я так понимаю с++ больше гибок но и более ответственен для программиста язык.. Ну в принципе все понял, почитаю о локальных переменных..

  6. Ну да, эта функция хоть отдаленно похожа на человеческую конкатенацию... Но создание буферов этих везде и всюду меня уже реально начинает поднапрягать...

    Спасибос за инфу в любом случае, все лучше чем то, как делал я...

     

    з.ы.

    // Конкатенация времени(собственно для этого и нужна была )char sb[512];wsprintf(sb, "%d-%d-%d", time->tm_hour, time->tm_min, time->tm_sec);

    Ну и вот еще маленький вопросец, как все таки правильно будет:

    char sb[512];tm* time = GetCurrentDateTime(); // Получаем указатель на структуру времени// Вот так?wsprintf(sb, "%d-%d-%d", time->tm_hour, time->tm_min, time->tm_sec);// Или можно так?wsprintf(sb, "%d-%d-%d", GetCurrentDateTime()->tm_hour, GetCurrentDateTime()->tm_min, GetCurrentDateTime()->tm_sec);

    Правильно ли я понимаю что в 1м случаем создается указатель на указатель, а во втором используется сразу указатель который вернет функция?

    Или это одно и тоже во обще?

     

    Ну и еще нужно ли писать

    delete[] sb;

    Или тут как в c#, после выхода из функции все локальные переменные удаляются автоматом?

  7. Короче посмотрел в самой функции что там творится пошагово, и вот такая штука:

    Аргумент "filePath" я делаю так:

    //Переменные глобальные:string DllPath = "c:\\programm\\release";char* logFileName = "\\log.txt";// Вызов функцииWriteToFile(strcat((char*) DllPath.data(), logFileName), "Test1");

    Ну и оказывается что конкатенация в c++ совсем не такая как в c# штоли...

    Ибо первый раз "filePath = c:\\programm\\release\\log.txt".

    А вот второй раз "filePath = c:\\programm\\release\\log.txt\\log.txt".

     

    Вот такая вот фигня... Походу не ту функцию я выбрал для конкатенации...


    Во общем сделал что б полный путь создавался один раз при инжекте, и дальше уже просто использовался.

    А функцию записи в файл написал вот так:

    bool WriteToFile(char* filePath, char* content){	ofstream outfile;	outfile.open(filePath, ios_base::app);	if (!outfile.is_open())	{		outfile.close();		return false;	}	else		outfile << content;	outfile.close();	return true;}

    Работает нормально, но вот как просто соединять char* строки, что бы оригиналы не изменялись я вот только вот так нугуглил:

    char* one = "one";char* two = "two";char* three = "three";char* four = "four";string result = string(one) + string(two) + string(three) + string(four);
  8. Короче инжектю dll'ку и нужно что б там она записывала в .txt файл данные.

     

    Я вот пишу вот так вот, но не работает,сразу креш...

    bool WriteToFile(char* filePath, char* content){    ofstream outf;    try    {        outf.open(filePath, std::ofstream::out | std::ofstream::app);    }    catch (...){}    if (outf.fail())    {        MessageBox(0, "False", "", 0);        outf.close();        return false;    }    else        outf.write(content, sizeof(content));    outf.close();    return true;}

    И через FILE *outf; тоже пробовал..

    Тупо креш.. И дело даже не в "char* content и wchar_t* content", ибо я для теста тупо пишу "wwwwwwww", и все равно креш...

    Использую я эту функцию в хуке другой в игре, и она там довольно часто юзается, но пишет благополучно только первые данные, второй раз уже "outf == NULL" и креш...

  9. Ну вот у тебя первое чтение:

    ReadProcessMemory(hWnd, (void*) Base, (LPVOID) CPed, sizeof(Base), NULL);

    Что в CPed после этой строки?

    Да и во обще закинь сюда код и покажи в нем в каком именно месте ошибка, запили обычные MessageBox'ы, и смотри что читает после каждой ReadProcessMemory. Точно узнай в каком именно месте проблема, а то мне лично ничего не понятно во обще, по скринам в которых куски кода..

     

    Ну а так то кстати я хз,но должно быть вроде так:

    ReadProcessMemory(hWnd, (LPCVOID) Base, (LPVOID) CPed, sizeof(Base), NULL);

    То есть ты должен сразу адрес читать а не указатель на этот адрес. Если не так сори сам неделю назад ток начал въезжать в c++ )

  10. /*---------------------------------------------------------------------------*/

     

    (LPTHREAD_START_ROUTINE) Hook вернёт адрес Hook, сконвертированный в 

    LPTHREAD_START_ROUTINE, а (LPTHREAD_START_ROUTINE) Hook() - результат 

    выполнения Hook(), сконверченный туда же. Если не уверен в результате того или

    иного выражения - вынеси его в отдельную переменную и проверь в отладчике.

     

    /*---------------------------------------------------------------------------*/

     

    Понял.

    Ну и еще я вот тут счас учусь чуток хукать WinAPI, действительно все очень просто, если разобратся с Detours... Но вот такой вот вопросец ее у меня есть:

    Вот я хукал SendMessageW, как сверху, и оригинальный адрес сохранял так:

    LRESULT(WINAPI * RealSendMessageW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) = SendMessageW;

    А вот как так же сохранить адрес MessageBoxW на пример?

    INT(WINAPI * RealMessageBoxW)(HWND hWnd, LPCTSTR  lpText, LPCTSTR lpCaption, UINT uType) = MessageBoxW; // Ошибка после "=".

    P/S. Че реально Detours Pro стоит $10,000? ОО

  11. Хм, ну в принципе читать по смещениям это не так уж и сложно должно быть..  Недавно делал похожее...

    Могу глянуть если проблема именно в получении hWnd окна или процесса...

     

    Или проблема уже решена?

     

    Ну а так то я заметил что ты не верно написал смещения, в СЕ у тебя стоит первое же смещение "0x14" а ты читаешь "0xE", это же вроде разные значения, или я ошибаюсь?

     

    И еще не знаю как в C++, но я когда писал на C# чтение адресов то у меня была проблема что я хранил прочтенные адреса в int вместо uint, так что в эту сторону можешь тоже глянуть, мне помогло..

  12. Всем доброго времени суток.

    Начал вот учить хуки WinAPI-функций.

     

    Во общем вот код с использованием Detours 1.5, который хукает firefox.exe->SendMessageW(). То есть вместо тайтла в окне всегда должно писать "Hooked":

    DETOUR_TRAMPOLINE(LRESULT WINAPI MySendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam), SendMessageW);LRESULT WINAPI MySendMessageW_Hooked(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam){	return MySendMessageW(hWnd, Msg, wParam, (LPARAM) L"Hooked");}int Start(){	::DetourFunctionWithTrampoline((PBYTE) MySendMessageW, (PBYTE) MySendMessageW_Hooked);	return 0;}BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved){	if (dwReason == DLL_PROCESS_ATTACH)	{		CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Start(), 0, 0, 0);	}	return TRUE;}

    Если записать через Detours 3.0(как в уроке), то работает нормально(но там другая запись)... А почему не работает тут? Смотрел в СЕ там нормально все джамп ставит куда нужно, но после инжекта сразу креш... Гляньте ..

  13. Причину отжора памяти нашел.

    Я так сконцентрировался на c++ dll'ке и искал там косяк так, что забыл про c# и что я там каким то образом передавал false аргумент а в SetOptions() приходило true, ну а в хуке была проверка на этот аргумент и если == true тогда создать новый шрифт, короче просто жесть...


    Нус во общем вышло вот так вот:

     

    Довольно такие неплохо как для нуба :)

     

    Но еще такая штука, все нормально работает когда я сначала запускаю игру, инжектю в нее мою dll'ку, и потом запускаю свое c#-приложение. А свот если я сначала запускаю свое приложение, а потом игру и инжектю в нее, то текста нету во обще...

    Я так понимаю хук срабатывает только раз на тот процесс который первый загрузит dll'ку, вот именно тогда, когда я запускаю свое c#-приложение, и если потом инжектить в игру то он второй раз не работает уже... Во общем как бы этот момент зафиксить еще?


    ...

    А нет, посмотрел как был реализован код, который был у меня за основу, изменил как там, и теперь работает не важно в каком порядке запускать, плюс еще один баг зафиксился сразу, ну короче можете меня поздравить, работает и управляется хук просто блестяще теперь :)

     

    Всем огромное спасибо за помощь. А как поставить репутацию так и не понял...

    • Плюс 1
  14. Не, если установить статически:

    char viewString[128] = "Test1";

    или

    char *viewString = "Test1";

     

    То отображает все нормально... И с памятью тоже все ок...

     

    А как только я вызываю(один раз всего лишь) SetOptions(). Сразу начинается отжер памяти...

  15. Я не понимаю, как она может создаватся так много раз если я юзаю SetOptions(), только один раз, забиваю туда строку и все..

    А в хуке эта переменная только используется.

     

    Или все не так?, я не догоню впритык...

     

    И что именно нужно освобождать? В самом хуке надо освобождать я так понимаю да?

  16. Да жесть просто какая-то!

    Нашел вот такую вот реализацию:

    #pragma data_seg("sms")char viewString[512] = "Test1";#pragma data_seg()#pragma comment(linker, "/section:sms,RWS")extern "C" __declspec(dllexport)void SetOptions(char* string = "Test1"){    lstrcpy(viewString, string); // Вот тут копирую string в viewString}

    Ну и выводит теперь нормально, но через секунд 10-20 забивается 16ГБ памяти и все... Я так понял где то надо дисповсить что-то, но что черт пойми...  Нук гляньте может увидите вы...

  17. Короче да, понятия не имею как, но текст, уже перед выводом в моей "hookedEndScene" искажается, такое ощущение что читается не тот указатель...Но почему? Я же записал эту переменную в секцию разделяемой памяти... что за ппц...

     

    Ох, и вот что мне пишет при компиляции еще(только что заметил)

    "LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly"

     

    Да уж, рано я обрадовался что с первого раза все заработало...


    Короче да, проблема именно в секции разделяемой памяти, строки там надо как то по другому записывать что б указатели на них нормально потом работали. Так что ищу помощь в этом деле...

  18. Ну а вот я тут подумал, а если не char* принимать а char[], а потом его перевести в char* уже в dll'ке, стоит пробовать такое или будет тот же результат?

    А по этому что выше сейчас попробую проверить что в строке прямо перед выводом и после вывода.

  19. Ну я же написал что текст выводит во первых без ошибки во обще, просто выводятся кракозябры. Потом, текст приходит нормальный и записывается в переменную разделяемой памяти нормально, о чом свидетельствуют два MessageBox'а, ну и с этого следует что проблема уже при создании шрифта и выводе текста, вот в этих вот строчках:

    	D3DXCreateFont(pDevice, 16, 0, FW_NORMAL, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PALETTE | FF_DONTCARE, "Arial", &font);	font->DrawText(NULL, viewString, -1, &pRect, 0, D3DCOLOR_ARGB(255, 230, 230, 230));

    Вот и спрашиваю гляньте что в этих строках может быть кривое, что давало бы такой результат вывода текста на экран? Но с другой стороны если просто заинжектить dll'ку с дефолтным viewString = "Test1", то выводит нормально...

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.