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

temtriss

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

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

  • Посещение

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

    7

temtriss стал победителем дня 15 октября 2018

temtriss имел наиболее популярный контент!

Репутация

47 Rookie

Информация о temtriss

Посетители профиля

6 156 просмотров профиля
  1. Привет всем, столкнулся с некой странностью, возможно я что-то делаю не правильно?! Я как всегда нашел своё костыльное решение, но хочется знать, возможно ли решить поставленную задачу иначе. Собственно вот костыльный вариант: Я ставлю бряк на 0x00401E45(след инструкция +3 байта) проверяю текущий адреса в onBreakpoint функции. Цель, остановится на инструкции получить значение eax+40 и вывести его в том случае, если после выполнения инструкции EAX не стал 0. То как я себе это представлял: Проверяем в onBreakpoint адрес, если наш, то читаем значение, делаем один шаг в отладчике, сравниваем ЕАХ и выводим в лог. Судя по CE wiki функция debug_continueFromBreakpoint принимает в себя параметр: "co_stepover", "co_stepinto", "co_run", "co_runtill" но при попытке передать co_stepover нечего не происходит. По этому я сделал костыль в виде второго бряка) P.S. параметр пробовал передать как в ковычках, так и без. Результат тот же, при передаче co_run так же работают оба варианта.
  2. Всем привет. Хотел написать простейший инжектор на C#(учу его пару дней уже) Через создание удалённого потока с LoadLibraryA как функция потока. Импортирую все необходимые WinAPI И в случае если инжектор х86 то проблем нет.(Таргет и ДЛЛ х86) Получаю адрес LoadLibraryA записываю путь DLL запускаю поток. Но если инжектор х64(Таргет и ДЛЛ всё так же х86) Появляется проблема при получении LoadLibraryA я естественно получаю х64 функцию. Я придумал временный костыль System.Diagnostics.Process? LoadLibProc = System.Diagnostics.Process.Start("x32GetLoadLib.bin"); if (LoadLibProc != null) Loger.GetInstance().LogI("x32GetLoadLib loader..."); if (LoadLibProc.WaitForExit(10000)) LoadLibFucn = (IntPtr)LoadLibProc.ExitCode; Ну и собственно x32GetLoadLib.bin int main() { return reinterpret_cast<int>(LoadLibraryA); } Можно ли решить данную проблему иначе? P.S. получение адреса LoadLibraryA через PEB->Ldr целевого приложения не предлагать, такой вариант я знаю, но кода будет 100+ строк, а в данном костыле 5)
  3. Извеняюсь за подьем темы, что ищет автор? структуру игрока? я сейчас нахожусь на даче, без компа, под рукой только х86 планшет. От скуки скачал варспиар, ида уже была) Ну и собственно колекцию обьектов нашел минут за 5. Как? Достаточно просто... Начал с поиска своего МП. Далее поставил бряк на запись, что бы чекнуть, что и откуда пишется в МП. смотрим на скрин, видим, что мп находится на смещени 0xFC. Надо бы чекнуть функцию, откуда мы берем обьект. Опа! наш обьект v3 берется из функции параметром которой статический адрес!!! Чекнем функцию! ого! опытные реверсеры сразу увидят, что это деревовидный контейнер! а а2 что-то типо ID. Ну и опираясь на эту инфу и статичный адресс, можно пробежатся по дереву и взять нужный обьект))) P.S. реально скучно без компа)))
  4. Я чуть-чуть ковырял варспиар) чисто интереса ради. Там античитом и не пахло. Это тот момент когда хукаешь ws send, отпраляешь сообщение в чат и видишь в буфере текст своего сообшения :DDD Сори, немного не по теме А по теме, я посоветую, то что советую почти всем) Делайте ДЛЛку и живете в целевом процессе И хранить все адреса а так же обращатся к ним и изменять в случае необходимости очень просто
  5. Всё просто, джампы и колы работают так: ты вызываешь смещение от следущей инструкции. Расчитать?! для 5ти байтового кола. КудаВызывать - ОткудаВызвать - 5,
  6. Ну судя по твоему скрину ты можешь инжектнуть свой код на 1 инструкцию выше(вместе с нужно будет как раз 5 байт) далее востановить 2 инструкции и получить свой адрес. Если на С++ что-то типо этого. И как по мне самый простой способ)
  7. Если я правильно понял, всю нужную информацию ты умеешь получать, тебе ее надо только в файл записать. Смотри, я бы посоветовал ДЛЛку на сях)) и использовать fstream самый быстрый(по кол-ву кода) способ. что-то типо этого... да, это весь логер. fout(полное имя файла, все папки должны существовать, файл не обязательно), всегда в файл будет добавлятся так как папаметр std::ios_base::app - аппенд... Это в принципе быстро и удобно) void Logger::Out(const char* str) { std::ofstream fout(this->m_strLogFileName.c_str(), std::ios_base::app); fout << std::string(str).c_str(); fout.close(); } Если будет интересно, пни в дискорде, расскажу как реализовать логер(тут я просто с своего кода дёрнул кусок, лениво было писать) Wi11ka#4371 Если принципиально надо вин-апи, то... работае это примерно так CreateFile - с параметром OPEN_ALWAYS(0x04 вроде), он подойдет в случае если файла нету, то будет создан новый, если файл есть, то будет открыт существующий. Далее нам надо узнать, сколько занимает файл, что бы не писать в него с нуля и не перезаписывать инфу в нём. Остальные параметны можешь найти на MSDN я на память не помню. GetFileSize(HANDLE - его возвращает CreateFile, NULL) дале узнав размер ставим указатель на конец файла SetFilePointer(HANDLE, Результат GetFileSize, 0, FILE_BEGIN(Вроде этот макрос равен 0)) теперь нам надо записать то, что мы получили в файл. как я понимаю у тебя сырые данные и скорее всего не готовая строка. для С++ я бы использовал sprintf... есть ли какие-то аналоги на WINAPI я без понятия, тут не подскажу.... Но чисто технически её можно будет вызвать из рантайм библиотеки сишной, но это чисто технически, я извращенец ещё тот, но не на столько Далее записать строку в файл WriteFile( HANDLE, Указатель на строку, размер строки, указатель на буфер, в который вернется кол-во записаных байт, NULL) ну и закрыть хэндл CloseHandle(HANDLE) ну опять же учитывая, то что ты написал или то, что я понял из этого, вызвать эти функции ты сможешь, и передать им параметры Надеюсь нечего не забыл, очень давно не юзал WINAPI.
  8. Ну как ты говоришь, игра синхронизируется с сервером. То каким образом тебе поможет подмена пакетов? Ну купил ты к примеру что-то за бабки. Отправил пакет о покупке на сервер. Сервер получил пакет, чекнул твою валюту, у тебя её нету и соответственно послал тебя нафиг. Если подменишь посыл сервера, то это даст только визуальный эфект(и то не факт), ты получишь предмет, которого по факту у тебя нет. И соответсвенно работать он не будет.
  9. Всем спасибо, последняя идея сработала) т.к. функция не использует std::string как std::string Типо так: Сорян, зря открыл тему.
  10. Всем привет :)) Кто может подсказать, возникла необходимость вызвать функцию которая принимает std::string как параметр... Естественно просто подсунуть ей std::string не получится(на сколько мне известно, реализация зависит от кучи факторов, версии компилятора, флагов, погоды :D) по этому они будут отличатся. this ptr у меня есть :)) Я чуток по отлаживал. В моей МСВЦ 2019 std::string строка или указатель на строку находится сразу в std::string В игре же +0x4 так что исходя из этого, получается a2 - что-то... а3 строка или указатель на строку в зависимости от размера строки. > 16 указатель, <=16 строка а8 - размер строки далее вторая std::string чисто технически, я могу вручную вызвать все проверки из этой функции в своём коде и вызвать евент т.к. он вызывается чуть ниже(я уже это сделал, но без всех этих проверок очень легко уронить игру) но кода тут очень много в функции, по этому хотелось бы как-то обойтись) Не кто попадал в подобную ситуацию? чисто технически отработает ли это если я просто подсуну в а3 и а10 char* а, в а8 и а15 strlen на эти строки? P.S. последняя мысль пришла в голову пока писал пост, сейчас пойду опробую
  11. ну да, тут больше нужен ассемблер) Я бы сказал больше всего нужен ассемблер) Так что книги по асму в руки и вперед, далее посоветовал бы почитать про реверсинг, что то типо IDA Pro The Book. По поиску уязвимостей и прочего. На русском языке ты мало чего найдешь, большество информации на английском... Как-то так))
  12. Всем спасибо, решение нашел сам. Если кому-то интересно: Я расширял стэк в своей функции и по хз какой причине на Win 10 это работало нормально, а на win 2012 Server нет. Я сделал патч на расширение стека в оригинальной функции вместо sub esp, 0c пропатчил на sub esp, 10 А в своей функции соответсвенно убрал расширение стека. И всё заработало))) больше 2х недель мучался :DDD В общем тему можно закрыть! Всем спс :)))
  13. Я и так не накосячил со стеком))) я проверял) Да и сложно ошибится, расширил стэк на 4 и почистил на 4 больше)) всё) Темболее, что функция работает. Проблемы с стэком точно нет) Это не совсем хук, я просто внедряю кусок кода. Мне не нужно переписывать всю функцию. Мне нужен маленький кусочек. Когда я переписываю полностью функцию, я так и делаю. А так же какая разница? Я могу так же юзануть detours только вот нечего не поменяется... у меня нету конвенции вызова у функции т.к. она мне не нужна... мне нужно записать из есх(GAntityActor) + HP, MP, STA offset значение)) все... изобретать велосипед не хочется функция и так готовая) И ей абсолютно паралельно сколько байт отправлять(структура кладётся в SingleBlob, функция просто выделяет память и с помощью memcpy копирует то, что ей скормили с проверкой размера < 1024)
  14. Даа) sol мощная либа, пару раз юзал)) Но ИМХО C++ ,SWIG + Python круче)) Ну это чисто ИМХО)) P.s. сори за офтоп.
  15. Ох, как давно меня тут небыло) Всем здарово, кто меня помнит В общем дело такое, занимаюсь в данный момент игрой, расширяю функционал клиентской и серверной части. Столкнулся с некой проблемой: Игра работает с ХП/МП/Стаминой с int32, как клиентская так и серверная часть. Но какого-то беса разрабы решили, в пакетах отправлять int16. Исходников естесвенно нету, но есть ИДА и желание этим заниматся :)) Я нашел функцию в клиентской и серверной части. Переписал полностью клиентскую, и чуток изменил серверную. Ниже по спойлером серверная функция. С которой возникли некоторые проблемы. Сервер прекрасно работает и отправляет мне пакет с int32 параметрами. Клиент так же на ура их принимает и всё работает. И на моей машине проблем нету. Так же держатель сервера тестил на своей локальной машине и так же не каких проблем. А вот при запуске на сервере, при смене локации падает сервак.(после этого тестили ещё на 3-4 машинах под WIn10, на всех работает нормально, сервер под Win2012 Server) В общем что я сделал в данной функции. Я иньекчу кусочек кода __declsepc(naked) функцию в получение параметров movzx eax, word ptr [ecx+1D8h] Вот пример моей функции. Увиличивая стэк, что бы влезла структура с х3 int32(12), оригинальная структура х3 int16(6), но компилятор вырвнял ее до 8)) sub esp, 4 достаточно Далее вношу полные параметры и пушу параметр для new и соответственно прыгаю обратно на new Таже делаю 2 патча небольших, а именно патчу размер структуры тут: push 6 ; size lea ecx, [esp+0Ch] ; Load Effective Address push ecx ; tTD_UPDATE_SIMPLE_STATUS mov ecx, eax ; this call ??0MCommandParameterSingleBlob@minet@@QAE@PBXG@Z вместо 6 пушу 12, можно конечно и бинарник пропатчить, но я в любом случае иньекчусь в процесс, так что без разницы. Ну и поменял пару смешений относительно стека далее по коду и очистку стека. Как я и говорил выше, это прекрасно отработало на всех компах, которых мы тестили под управлением Windows10. Самый интересный момент, сервер плюет exception по адресу, на котором он быть не должен, да и сам exception code странный, не смог его не нагуглить, не error lookup не чего не выдал: 40010006 Так же самая большая странность, если открыть на сервере Вижал студию и присоеденить её как отладчик до ексепшена или во время, то студия не выдаёт ошибок или чего-то еще, а просто продолжает процесс без каких либо проблем. И сервер спокойно работает и проблема исчезает. Но как по мне странно запускать сервер и вешать на него студию в дебаг моде :DDD Может у кого-то вылезал подобный ексепшн или кто-то сталкивался с такой дичью? Всем спс :)) P.s. отлаживать постоянно сервак возможности нету. p.s.s свой Exception handler писал, устанавливал и хукал SetUnhandledExceptionFilter что бы не переставили) Но почему-то результата это не дало. Он не отработал, хотя на Access Violation(специально подстроеный) плюнул мой обработчик.
×
×
  • Создать...

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

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