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

temtriss

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

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

  • Посещение

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

    7

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

  1. Привет всем, столкнулся с некой странностью, возможно я что-то делаю не правильно?! 

    Я как всегда нашел своё костыльное решение, но хочется знать, возможно ли решить поставленную задачу иначе.

    Собственно вот костыльный вариант:

     

    Спойлер
    g_count = 0;
    g_Addr = 0;
    
    function debugger_onBreakpoint()
             -- Have call this one at loop
             -- will finish breaking after 10k times
             if(g_count > 10000) then
                        debug_removeBreakpoint(0x00401E45);
                        debug_removeBreakpoint(0x00401E48);
             end
    
             g_count = g_count + 1;
    
             if(EIP == 0x00401E78) then
                    if(EBX == 0) then
                           debug_continueFromBreakpoint(co_run);
                           return 1;
                    end
                    print(string.format("%d, 0x%08x", g_count, EBX));
    
             elseif(EIP == 0x00401E45) then
                    g_Addr = readInteger(EAX + 0x40);
                    debug_continueFromBreakpoint("co_run");
                    return 1;                            -- Ignore message box
             elseif(EIP == 0x00401E48) then
                    if(EAX ~= 0) then
                           print(string.format("0x%08x", g_Addr));
                    end
                    debug_continueFromBreakpoint("co_run");
                    return 1;                            -- Ignore message box
             end
    end
    debug_setBreakpoint(0x00401E45);
    debug_setBreakpoint(0x00401E48);

     

     

     

     

    Я ставлю бряк на 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.

    Как? Достаточно просто... Начал с поиска своего МП. Далее поставил бряк на запись, что бы чекнуть, что и откуда пишется в МП.

    image.thumb.png.722383bfa2625bafc31780dd4c286810.png

    смотрим на скрин, видим, что мп находится на смещени 0xFC.

    Надо бы чекнуть функцию, откуда мы берем обьект.

    image.thumb.png.6bd60f9382323f470dc6dcdbd2bb521b.png

    Опа! наш обьект v3  берется из функции параметром которой статический адрес!!!

    Чекнем функцию!

    image.thumb.png.7c7787a23e8bb5f7b82e3409bb028beb.png

    ого! опытные реверсеры сразу увидят, что это деревовидный контейнер! а а2 что-то типо ID. 

    Ну и опираясь на эту инфу и статичный адресс, можно пробежатся по дереву и взять нужный обьект)))

    P.S. реально скучно без компа)))

    • Плюс 1
  4. В 16.09.2021 в 14:51, Xipho сказал:

    Если у этой игры есть античит,

    Я чуть-чуть ковырял варспиар) чисто интереса ради. Там античитом и не пахло.

    Это тот момент когда хукаешь ws send, отпраляешь сообщение в чат и видишь в буфере текст своего сообшения :DDD

    Сори, немного не по теме :(

     

    А по теме, я посоветую, то что советую почти всем) Делайте ДЛЛку и живете в целевом процессе :)

    И хранить все адреса а так же обращатся к ним и изменять в случае необходимости очень просто :)

  5. В 24.10.2021 в 17:56, соловьев сказал:

    как рассчитать смещение call, то есть 004B490D? видно что смещение 0xb9c7 но откуда 004B490D?

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

    Расчитать?!

    для 5ти байтового кола.

    КудаВызывать - ОткудаВызвать - 5,

     

  6. Ну судя по твоему скрину ты можешь инжектнуть свой код на 1 инструкцию выше(вместе с нужно будет как раз 5 байт)

    далее востановить 2 инструкции и получить свой адрес.

    Если  на С++ что-то типо этого. И как по мне самый простой способ)

    Спойлер
    
    __try
    {
    	DWROD dwAddr = NULL;
    	DWORD dwBackAddr = 0xDEADCODE;			// your back addr
    	_asm
    	{
    		// restore bytes
    		mov eax, [ebx+10h]
    		mov [eax], ecx			
    		// take addr
    		mov dwAddr, ecx
    		// do somtehing with addr
    		// add to global or init your code 
    		jmp dwBackAddr
    	}
    	
    }
    __except(1);

     

     

  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 я без понятия, тут не подскажу.... Но чисто технически её можно будет вызвать

    из рантайм библиотеки сишной, но это чисто технически, я извращенец ещё тот, но не на столько :D

     

    Далее записать строку в файл WriteFile(

    HANDLE,

    Указатель на строку,

    размер строки,

    указатель на буфер, в который вернется кол-во записаных байт, 

    NULL)

     

    ну и закрыть хэндл 

    CloseHandle(HANDLE) 

     

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

    Надеюсь нечего не забыл, очень давно не юзал WINAPI. 

     

     

  8. В 12.02.2021 в 03:18, VelikiR сказал:

    Возможно ли сделать подмену пакетов, дабы добиться успеха?

    Ну как ты говоришь, игра синхронизируется с сервером. То каким образом тебе поможет подмена пакетов? 

    Ну купил ты к примеру что-то за бабки. Отправил пакет о покупке на сервер. Сервер получил пакет, чекнул твою валюту, у тебя её нету и соответственно послал тебя нафиг. 

    Если подменишь посыл сервера, то это даст только визуальный эфект(и то не факт), ты получишь предмет, которого по факту у тебя нет. И соответсвенно работать он не будет.

  9. Всем привет :)) Кто может подсказать, возникла необходимость вызвать функцию которая принимает std::string как параметр... Естественно просто подсунуть ей std::string не получится(на сколько мне известно, реализация зависит от кучи факторов, версии компилятора, флагов, погоды :D) по этому они будут отличатся. 

    image.thumb.png.de7746b2b89c5d9082a6d1c25d85eb50.png

    this ptr у меня есть :))

    Я чуток по отлаживал. В моей МСВЦ 2019 std::string строка или указатель на строку находится сразу в std::string

    В игре же +0x4

    так что исходя из этого, получается a2 - что-то... а3 строка или указатель на строку в зависимости от размера строки. > 16 указатель, <=16 строка

    а8 - размер строки

    далее вторая std::string 

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

    но кода тут очень много в функции, по этому хотелось бы как-то обойтись)

    Не кто попадал в подобную ситуацию? :)

    чисто технически отработает ли это если я просто подсуну в а3 и а10 char* а, в а8 и а15 strlen на эти строки?

    P.S. последняя мысль пришла в голову пока писал пост, сейчас пойду опробую :) 

     

  10. 41 минуту назад, Kvazimado сказал:

    Особенно это видно по последним предложениям "то что для создания нужно и знать чистый Си"

    ну да, тут больше нужен ассемблер) Я бы сказал больше всего нужен ассемблер)

    Так что книги по асму в руки и вперед, далее посоветовал бы почитать про реверсинг, что то типо IDA Pro The Book. По поиску уязвимостей и прочего. На русском языке ты мало чего найдешь, большество информации на английском... Как-то так))

  11. Всем спасибо, решение нашел сам. Если кому-то интересно:

    Я расширял стэк в своей функции и по хз какой причине на Win 10 это работало нормально, а на win 2012 Server нет.

    Я сделал патч на расширение стека в оригинальной функции 

    вместо 

    sub esp, 0c

    пропатчил на 

    sub esp, 10

    А в своей функции соответсвенно убрал расширение стека. И всё заработало))) больше 2х недель мучался :DDD

    В общем тему можно закрыть! Всем спс :)))

    • Понравилось 1
  12. 13 минут назад, roma912 сказал:

    накосячишь со стеком

    Я и так не накосячил со стеком))) я проверял) 

    Да и сложно ошибится, расширил стэк на 4  и почистил на 4 больше)) всё)

    Темболее, что функция работает. Проблемы с стэком точно нет)

    13 минут назад, roma912 сказал:

    Ну вот такие хуки

    Это не совсем хук, я просто внедряю кусок кода. Мне не нужно переписывать всю функцию. Мне нужен маленький кусочек.

    13 минут назад, roma912 сказал:

    detours 1.5, или же 3

    Когда я переписываю полностью функцию, я так и делаю.

    А так же какая разница? Я могу так же юзануть detours только вот нечего не поменяется... у меня нету конвенции вызова у функции т.к. она мне не нужна... мне нужно записать из есх(GAntityActor) + HP, MP, STA offset значение)) все... изобретать велосипед не хочется :) функция и так готовая) И ей абсолютно паралельно сколько байт отправлять(структура кладётся в SingleBlob, функция просто выделяет память и с помощью memcpy копирует то, что ей скормили с проверкой размера < 1024)

  13. Ох, как давно меня тут небыло) Всем здарово, кто меня помнит :)

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

    Столкнулся с некой проблемой:

    Игра работает с ХП/МП/Стаминой с int32, как клиентская так и серверная часть. Но какого-то беса разрабы решили, в пакетах отправлять int16.

    Исходников естесвенно нету, но есть ИДА и желание этим заниматся :))

    Я нашел функцию в клиентской и серверной части. Переписал полностью клиентскую, и чуток изменил серверную.

    Ниже по спойлером серверная функция. С которой возникли некоторые проблемы.

    Спойлер

    image.thumb.png.83a967e3eef20184430ab41ed7c0e088.png

    Сервер прекрасно работает и отправляет мне пакет с int32 параметрами. Клиент так же на ура их принимает и всё работает. И на моей машине проблем нету. Так же держатель сервера тестил на своей локальной машине и так же не каких проблем.

    А вот при запуске на сервере, при смене локации падает сервак.(после этого тестили ещё на 3-4 машинах под WIn10, на всех работает нормально, сервер под Win2012 Server) 

    В общем что я сделал в данной функции. Я иньекчу кусочек кода __declsepc(naked) функцию в получение параметров

    movzx eax, word ptr [ecx+1D8h]

    Вот пример моей функции.

    Спойлер

    image.png.b2ffcbc1e52394161d0cdc62e2315c56.png

    Увиличивая стэк, что бы влезла структура с х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(специально подстроеный) плюнул мой обработчик.

  14. К моему величайшему сожалению, в связи с печальными обстоятельствами(жена попала в больницу :((( ) на этой неделе я не успел подготовить урок и соответственно записать, да и так как ребенок полностью на мне, записать даже готовый материал было бы очень проблематично. Так что надеюсь на неделе наверстать упущенное, и к след. выходным сделать несколько уроков сразу(да и выходные вроде длинные будут - 3 дня). 

    • Понравилось 1
  15. Вышел новый урок! Кому интересно на форуме в видео! Новое качество звука! Новое оформление канала, новое качество видео! Огромное спасибо за помощь @vagingameh

     

     

    И сразу еще +1 :))

    • Понравилось 2
    • Плюс 1
  16. 18 часов назад, PresetX сказал:

    Каким образом составлять сигнатуру

    Можешь воспользоваться плагином для ЦЕ - SigMaker, но он делает маленькие сигнатуры, они могут быть не уникальными... Можешь воспользоваться плагином для х64дбг - SwissArmyKnife он создаст сигнатуру на столько байт, на сколько тебе надо. И там же можешь проверить её на уникальность

  17. 48 минут назад, pachela сказал:

    хотелось видеть в теме сообщения по существу

    Сообщение выше было и так по существу.

    std::map - ассоциативный контейнер, с парами ключ-значение, в std::map(в std::multimap могут!) ключи повторятся не могут... 

     

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

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

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