-
Постов
65 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные SiriusED
-
-
Ну во общем дали мне на одном форуме точный адрес и ollyDBG-паттерн к ней, ну и еще дали тело функции вместе с типами и аргументами, короче дали все что нужно..
Но все таки это просто дали, но как это сделать самому я так и не понял, а именно:
Смотри, под словом сигнатура я имел введу типы и количество аргументов, которые принимает эта функция, вот скажем пример:
Нашел я через тот же Ultimap адрес нужной мне функции, но зная один лишь адрес, я хукнуть эту функцию не смогу никак... Ибо мне нужно знать точное количество и типы всех принимающих\возвращающих параметров. Вот собственно меня интересует в первую очередь как мне эти параметры узнать и на сколько это сложно?
Ну и еще такая вот штука, вот тот адрес который мне дали, короче на нем не "call адрес функции", а вот такие инструкции:
mov eax,[esp+0C] // Вот эта инструкция висит на том адресе что мне дали на форумеcmp eax,10jnl 00961007mov eax,[esp+04]mov [eax+04],00000005xor al,alret
Так вот что мне хукать то? прямо этот адрес или что? А то как то впадлу переспрашивать уже на том форуме после благодарствий
-
Не ну кажется адрес я уже нашел, да и даже если не нашел то найду, ибо СЕ мне нашел 407 возможных вариантов вызова функций при моем действии... Но вот как мне теперь найти сигнатуру то? А без сигнатуры я не смогу же поставить хук, правильно?
Во общем в чем лучше всего искать сигнатуру, и как это делается в СЕ Ultimap?
P.S. Ну а так то функция являет собой шифратор, и возможно дешифратор текста. Так что в любом случае она 100% должна принимать и возвращать текст, но вот даже уже с таким вариантом может быть два варианта:
Возврат текста через^
char* Function(char* inText);//илиvoid Function(char* out\ref inText);
Ну я так понимаю что сигнатуру вычислить это просто ацки сложная задача да?
-
Я тут поспрашивал профессионалов, и говорят что ollyDBG и IDAPro в этом деле нормально могут помочь... Кто нить о них знает как там можно реализовать такое?
-
Хм. Ну у меня CE 6,4 какраз, i7-4770K, и Windows7, сработает? Пока бегу читать об этой штуке..
-
Всем привет. Ситуация такая: Есть функция которая меняет значение, я поставил хук на эту функцию и получаю готовое значение, но как мне узнать через какую функцию это значение создается?
Так же мне известно что функция которая создает это значение срабатывает при определенном действии в игре.
Вот как мне узнать что это за функция во обще? единственное что приходит на ум - как то мониторить все вызываемые функции этой игрой непосредственно в момент определенного действия(нажатия кнопки TAB). Вот через что такое можно осуществить?
Знаю как такое сделать можно на перехват WinAPI-функций, а вот как перехватывать все функции игровые? Очень нужна помощь в этом вопросе.
-
Не ну я думал типа что при каждом вызове функции будет выделятся память...
void fonc1(){ char sb[512];}
По этому и спросил, а то я так понимаю с++ больше гибок но и более ответственен для программиста язык.. Ну в принципе все понял, почитаю о локальных переменных..
-
Ну да, эта функция хоть отдаленно похожа на человеческую конкатенацию... Но создание буферов этих везде и всюду меня уже реально начинает поднапрягать...
Спасибос за инфу в любом случае, все лучше чем то, как делал я...
з.ы.
// Конкатенация времени(собственно для этого и нужна была )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#, после выхода из функции все локальные переменные удаляются автоматом?
-
Короче посмотрел в самой функции что там творится пошагово, и вот такая штука:
Аргумент "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);
-
Короче инжектю 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" и креш...
-
Ну вот у тебя первое чтение:
ReadProcessMemory(hWnd, (void*) Base, (LPVOID) CPed, sizeof(Base), NULL);
Что в CPed после этой строки?
Да и во обще закинь сюда код и покажи в нем в каком именно месте ошибка, запили обычные MessageBox'ы, и смотри что читает после каждой ReadProcessMemory. Точно узнай в каком именно месте проблема, а то мне лично ничего не понятно во обще, по скринам в которых куски кода..
Ну а так то кстати я хз,но должно быть вроде так:
ReadProcessMemory(hWnd, (LPCVOID) Base, (LPVOID) CPed, sizeof(Base), NULL);
То есть ты должен сразу адрес читать а не указатель на этот адрес. Если не так сори сам неделю назад ток начал въезжать в c++ )
-
Действительно, у MessageBoxW оказывается чуть другие типы у параметров чем у MessageBoxA... Вот так работает нормально... Спасибо.
INT(WINAPI * RealMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;
-
/*---------------------------------------------------------------------------*/
(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? ОО
-
Но почему оно скомпилило то, могло и ошибку кинуть.. или это что-то тоже рабочее но не в ту сторону?)
-
Хм, ну в принципе читать по смещениям это не так уж и сложно должно быть.. Недавно делал похожее...
Могу глянуть если проблема именно в получении hWnd окна или процесса...
Или проблема уже решена?
Ну а так то я заметил что ты не верно написал смещения, в СЕ у тебя стоит первое же смещение "0x14" а ты читаешь "0xE", это же вроде разные значения, или я ошибаюсь?
И еще не знаю как в C++, но я когда писал на C# чтение адресов то у меня была проблема что я хранил прочтенные адреса в int вместо uint, так что в эту сторону можешь тоже глянуть, мне помогло..
-
Короче все нормально работает, это просто руки у меня кривоваты...
Было:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook(), 0, 0, 0);
Надо:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook, 0, 0, 0);
.....
-
Всем доброго времени суток.
Начал вот учить хуки 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(как в уроке), то работает нормально(но там другая запись)... А почему не работает тут? Смотрел в СЕ там нормально все джамп ставит куда нужно, но после инжекта сразу креш... Гляньте ..
-
Тема более неактуальна, все порешал в другой теме.
-
Причину отжора памяти нашел.
Я так сконцентрировался на c++ dll'ке и искал там косяк так, что забыл про c# и что я там каким то образом передавал false аргумент а в SetOptions() приходило true, ну а в хуке была проверка на этот аргумент и если == true тогда создать новый шрифт, короче просто жесть...
Нус во общем вышло вот так вот:
Довольно такие неплохо как для нуба
Но еще такая штука, все нормально работает когда я сначала запускаю игру, инжектю в нее мою dll'ку, и потом запускаю свое c#-приложение. А свот если я сначала запускаю свое приложение, а потом игру и инжектю в нее, то текста нету во обще...
Я так понимаю хук срабатывает только раз на тот процесс который первый загрузит dll'ку, вот именно тогда, когда я запускаю свое c#-приложение, и если потом инжектить в игру то он второй раз не работает уже... Во общем как бы этот момент зафиксить еще?
...
А нет, посмотрел как был реализован код, который был у меня за основу, изменил как там, и теперь работает не важно в каком порядке запускать, плюс еще один баг зафиксился сразу, ну короче можете меня поздравить, работает и управляется хук просто блестяще теперь
Всем огромное спасибо за помощь. А как поставить репутацию так и не понял...
- 1
-
Не, если установить статически:
char viewString[128] = "Test1";
или
char *viewString = "Test1";
То отображает все нормально... И с памятью тоже все ок...
А как только я вызываю(один раз всего лишь) SetOptions(). Сразу начинается отжер памяти...
-
Я не понимаю, как она может создаватся так много раз если я юзаю SetOptions(), только один раз, забиваю туда строку и все..
А в хуке эта переменная только используется.
Или все не так?, я не догоню впритык...
И что именно нужно освобождать? В самом хуке надо освобождать я так понимаю да?
-
Да жесть просто какая-то!
Нашел вот такую вот реализацию:
#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ГБ памяти и все... Я так понял где то надо дисповсить что-то, но что черт пойми... Нук гляньте может увидите вы...
-
Короче да, понятия не имею как, но текст, уже перед выводом в моей "hookedEndScene" искажается, такое ощущение что читается не тот указатель...Но почему? Я же записал эту переменную в секцию разделяемой памяти... что за ппц...
Ох, и вот что мне пишет при компиляции еще(только что заметил)
"LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly"
Да уж, рано я обрадовался что с первого раза все заработало...
Короче да, проблема именно в секции разделяемой памяти, строки там надо как то по другому записывать что б указатели на них нормально потом работали. Так что ищу помощь в этом деле...
-
Ну а вот я тут подумал, а если не char* принимать а char[], а потом его перевести в char* уже в dll'ке, стоит пробовать такое или будет тот же результат?
А по этому что выше сейчас попробую проверить что в строке прямо перед выводом и после вывода.
-
Ну я же написал что текст выводит во первых без ошибки во обще, просто выводятся кракозябры. Потом, текст приходит нормальный и записывается в переменную разделяемой памяти нормально, о чом свидетельствуют два 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", то выводит нормально...
Вопрос по реверсингу, наверно...
in Создание трейнеров в специальных студиях
Опубликовано
Короче хукнуть получилось, но проблема теперь такая, функция принимает толи char* толи BYTE*, и во общем если принимаю char* то получаются кракозябры, мне нужно походу перевести эти байты в HEX.
Но я уже реально сижу два часа и рабочего кода так и не нашел... То вылеты, то тупо не работает запарился уже просто... Помогите перевести байты в HEX-строку.