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

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. Я тут поспрашивал профессионалов, и говорят что ollyDBG и IDAPro в этом деле нормально могут помочь... Кто нить о них знает как там можно реализовать такое?
  5. Хм. Ну у меня CE 6,4 какраз, i7-4770K, и Windows7, сработает? Пока бегу читать об этой штуке..
  6. Всем привет. Ситуация такая: Есть функция которая меняет значение, я поставил хук на эту функцию и получаю готовое значение, но как мне узнать через какую функцию это значение создается? Так же мне известно что функция которая создает это значение срабатывает при определенном действии в игре. Вот как мне узнать что это за функция во обще? единственное что приходит на ум - как то мониторить все вызываемые функции этой игрой непосредственно в момент определенного действия(нажатия кнопки TAB). Вот через что такое можно осуществить? Знаю как такое сделать можно на перехват WinAPI-функций, а вот как перехватывать все функции игровые? Очень нужна помощь в этом вопросе.
  7. Не ну я думал типа что при каждом вызове функции будет выделятся память... void fonc1(){ char sb[512];}По этому и спросил, а то я так понимаю с++ больше гибок но и более ответственен для программиста язык.. Ну в принципе все понял, почитаю о локальных переменных..
  8. Ну да, эта функция хоть отдаленно похожа на человеческую конкатенацию... Но создание буферов этих везде и всюду меня уже реально начинает поднапрягать... Спасибос за инфу в любом случае, все лучше чем то, как делал я... з.ы. // Конкатенация времени(собственно для этого и нужна была )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#, после выхода из функции все локальные переменные удаляются автоматом?
  9. Короче посмотрел в самой функции что там творится пошагово, и вот такая штука: Аргумент "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);
  10. Короче инжектю 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" и креш...
  11. Ну вот у тебя первое чтение: ReadProcessMemory(hWnd, (void*) Base, (LPVOID) CPed, sizeof(Base), NULL);Что в CPed после этой строки? Да и во обще закинь сюда код и покажи в нем в каком именно месте ошибка, запили обычные MessageBox'ы, и смотри что читает после каждой ReadProcessMemory. Точно узнай в каком именно месте проблема, а то мне лично ничего не понятно во обще, по скринам в которых куски кода.. Ну а так то кстати я хз,но должно быть вроде так: ReadProcessMemory(hWnd, (LPCVOID) Base, (LPVOID) CPed, sizeof(Base), NULL);То есть ты должен сразу адрес читать а не указатель на этот адрес. Если не так сори сам неделю назад ток начал въезжать в c++ )
  12. Действительно, у MessageBoxW оказывается чуть другие типы у параметров чем у MessageBoxA... Вот так работает нормально... Спасибо. INT(WINAPI * RealMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;
  13. Понял. Ну и еще я вот тут счас учусь чуток хукать 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? ОО
  14. Но почему оно скомпилило то, могло и ошибку кинуть.. или это что-то тоже рабочее но не в ту сторону?)
  15. Хм, ну в принципе читать по смещениям это не так уж и сложно должно быть.. Недавно делал похожее... Могу глянуть если проблема именно в получении hWnd окна или процесса... Или проблема уже решена? Ну а так то я заметил что ты не верно написал смещения, в СЕ у тебя стоит первое же смещение "0x14" а ты читаешь "0xE", это же вроде разные значения, или я ошибаюсь? И еще не знаю как в C++, но я когда писал на C# чтение адресов то у меня была проблема что я хранил прочтенные адреса в int вместо uint, так что в эту сторону можешь тоже глянуть, мне помогло..
  16. Короче все нормально работает, это просто руки у меня кривоваты... Было: CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook(), 0, 0, 0);Надо: CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook, 0, 0, 0);.....
  17. Всем доброго времени суток. Начал вот учить хуки 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(как в уроке), то работает нормально(но там другая запись)... А почему не работает тут? Смотрел в СЕ там нормально все джамп ставит куда нужно, но после инжекта сразу креш... Гляньте ..
  18. Причину отжора памяти нашел. Я так сконцентрировался на c++ dll'ке и искал там косяк так, что забыл про c# и что я там каким то образом передавал false аргумент а в SetOptions() приходило true, ну а в хуке была проверка на этот аргумент и если == true тогда создать новый шрифт, короче просто жесть... Нус во общем вышло вот так вот: Довольно такие неплохо как для нуба Но еще такая штука, все нормально работает когда я сначала запускаю игру, инжектю в нее мою dll'ку, и потом запускаю свое c#-приложение. А свот если я сначала запускаю свое приложение, а потом игру и инжектю в нее, то текста нету во обще... Я так понимаю хук срабатывает только раз на тот процесс который первый загрузит dll'ку, вот именно тогда, когда я запускаю свое c#-приложение, и если потом инжектить в игру то он второй раз не работает уже... Во общем как бы этот момент зафиксить еще? ... А нет, посмотрел как был реализован код, который был у меня за основу, изменил как там, и теперь работает не важно в каком порядке запускать, плюс еще один баг зафиксился сразу, ну короче можете меня поздравить, работает и управляется хук просто блестяще теперь Всем огромное спасибо за помощь. А как поставить репутацию так и не понял...
  19. Не, если установить статически: char viewString[128] = "Test1"; или char *viewString = "Test1"; То отображает все нормально... И с памятью тоже все ок... А как только я вызываю(один раз всего лишь) SetOptions(). Сразу начинается отжер памяти...
  20. Я не понимаю, как она может создаватся так много раз если я юзаю SetOptions(), только один раз, забиваю туда строку и все.. А в хуке эта переменная только используется. Или все не так?, я не догоню впритык... И что именно нужно освобождать? В самом хуке надо освобождать я так понимаю да?
  21. Да жесть просто какая-то! Нашел вот такую вот реализацию: #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ГБ памяти и все... Я так понял где то надо дисповсить что-то, но что черт пойми... Нук гляньте может увидите вы...
  22. Короче да, понятия не имею как, но текст, уже перед выводом в моей "hookedEndScene" искажается, такое ощущение что читается не тот указатель...Но почему? Я же записал эту переменную в секцию разделяемой памяти... что за ппц... Ох, и вот что мне пишет при компиляции еще(только что заметил) "LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly" Да уж, рано я обрадовался что с первого раза все заработало... Короче да, проблема именно в секции разделяемой памяти, строки там надо как то по другому записывать что б указатели на них нормально потом работали. Так что ищу помощь в этом деле...
  23. Ну а вот я тут подумал, а если не char* принимать а char[], а потом его перевести в char* уже в dll'ке, стоит пробовать такое или будет тот же результат? А по этому что выше сейчас попробую проверить что в строке прямо перед выводом и после вывода.
  24. Ну я же написал что текст выводит во первых без ошибки во обще, просто выводятся кракозябры. Потом, текст приходит нормальный и записывается в переменную разделяемой памяти нормально, о чом свидетельствуют два 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", то выводит нормально...
×
×
  • Создать...

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

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