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

tirion

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

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

  • Посещение

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

  1. Доброго времени суток Друзья! Не подкинете ли какую-либо статейку где можно почитать о синтаксисе bms скриптов? Похоже это единственный официальный сайт http://aluigi.altervista.org/quickbms.htm, но здесь ничего толкового не написано

  2. Это очень странно.. при таком зацикливании  функции отрабатывают в течение 5сек и затем игра вылетает. Но если вручную быстро кликать Enable Disable, то все нормально. Поэтому, думаю, тут дело не в таймере

  3. Как я тебя понял - всё сработало?

    отчасти да.

     

    Эксперты, подскажите, это корректное зацикливание потока?

    [ENABLE]alloc(newmem,4096)CREATETHREAD(newmem);label(flag)registersymbol(flag)newmem:push 00mov ecx,023FB090call 0x00393A20mov ecx,eaxcall 0x00366100{$lua}sleep(1000){$asm}cmp [flag],0jne newmemretflag:db 1[DISABLE]unregistersymbol(flag)dealloc(newmem)
  4. tirion, попробуй как у MasterGH, т.е. так:

     

    да я и так уже пробовал. Щас детально разбираюсь, по-сколько у меня в этой функции еще 3 подфункции, видимо что-то рушится

    Но все равно спасибо.

    [ENABLE]alloc(newmem,2048)CREATETHREAD(newmem)newmem:call 0x003016B0ret[DISABLE]dealloc(newmem) 
  5. tirion, посмотри у MasterGH здесь, может это поможет?

    прочитал, к сожалению ничего нового не узнал..

    Тоже интересен момент, как именно сделать удаленный поток средствами Cheat Engine.

    Щас буду искать статьи от Dark Byte

     

    А у тебя тоже вылет происходит?

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

     

    В общем вызываю функцию так  (аргументы не принимает)

     
    alloc(newmem,2048)CREATETHREAD(newmem)newmem:call 0x003016B0ret

    получаю вылет

     
     
     
    Вызываю вот так(по срабатыванию инструкции)
    [ENABLE]alloc(newmem,2048)label(returnhere)newmem:mov [ecx+00000080],00000000call 0x003016B0jmp returnhere0042FCDC9:jmp newmemnopnopnopnopnopreturnhere:[DISABLE]dealloc(newmem)0042FCDC9:mov [ecx+00000080],00000000

    все отлично

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

  8. keng, объясни пожалуйста чем CREATETHREAD(mycode); в данном случае будет отличается от label(mycode); ?

    и почему в конце стоит RET? Ведь у той функции, которую вызываем уже есть свой RET и соответственно по ее завершению она перейдет на наш RET в инъекции кода, Но куда он нас выкинет? Разве не должно ли там стоять что-то типа jmp return, где return адрес возврата в оригинальный код

  9. В принципе я это понимаю, но все равно спасибо. А вообще хотелось бы понять, как взаимодействует нажатие клавиш с памятью игры. Правильное ли это рассуждение?

    "При нажатии кнопки, сама игра перехватывает функцию нажатия клавиши, а затем активирует какой-либо флаг, и этот флаг передается в функцию передвижения в качестве аргумента, мол "все ОК, идти разрешаю""

     

    А вот допустим я хочу найти функцию атаки. Если  я поставлю бряк на хп противника, выведит ли он меня на функцию атаки?

  10. Ребят, подскажите пожалуйста каким наиболее удобным способом можно искать внутриигровые функции?

    Допустим как найти функцию передвижения персонажа? А именно в игре мы нажимаем кнопку "w", тем самым заставляя игрока двигаться. Суть в том чтобы заставить персонажа аналогично передвигаться, но при этом, нажимая кнопку из своей программы. Пожалуйста, не надо предлагать использовать WinApi хуки, для меня это как темный лес. Хотелось бы все это провернуть на уровне памяти, либо за счет передачи своих аргументов в функцию. Я полагаю при нажатии кнопки, сама игра перехватывает функцию нажатия клавиши, а затем активирует какой-либо флаг, и этот флаг передается в функцию передвижения в качестве аргумента, мол "все ОК, идти разрешаю", если это даже и так, то я ума не приложу, каким образом его искать с помощью Cheat Engine...

  11. Всем спасибо! Вроде бы  понял разницу между внедрением кода и удаленным потоком. Удаленный поток вызывается по требованию пользователя, т.е он не вешается ни на какую инструкцию и не ожидает ее выполнения, именно поэтому нужно обязательно передавать функции все ее аргументы

  12. Судя по коду, он вызывает функцию по адресу 0x0044FE60 с аргументами (0, 0, 0, -1). Пятый аргумент передается прямо через ecx и это, на мой взгляд, странновато, но мало ли что там себе думает компилятор. Заменяется функция где-то в другом месте. Обычно или заменяется указатель на функцию, или первые 5 байт функции меняются на "JMP 00112233", где 00112233 - адрес функции, которую нужно вызывать хакеру.

    Но, как тогда объянить восстановление регистров после возврата на оригинальную функцию с данными аргументами? Ведь опдкод popad никогда не выполнится

     

     

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

    да, ты совершенно прав, автор использует данный прием

    hProcThread = CreateRemoteThread(hProc,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,pParams,NULL,NULL);

    Это означает что в удаленном потоке не используется никаких джампов ретурнов, вычислений размеров инъекции? И чтобы пролить лучик ясности нужно детально изучить  эту  CreateRemoteThread функцию?

  13. Ребята, прошу прощения, но это выше моих сил. Я думал, задав наводящие вопросы, это позволит мне ближе подойти к разрешению моего основого вопроса, но увы нет. Задам вопрос прямо. Этот кусок кода взят из исходника трейнера. Грубо говоря эта функция вытащена из отладчика и переделана на свой лад, НО не могу понять каким образом она вызывается, а именно подменяет оригинальную функцию, тк тут нет никаких джампов и ретурнов, а самое главное вычисления размера. Я предполагаю что она записывается в свободную область памяти при помощи функции VirtualAllocEx, но каким образом она подменяет оригинальную? У меня была мысль, что на этом месте - call edx она возвращается в оригинальный код, но почему тогда после опкода call edx идет восстановление регистров, ведь он никогда не выполнится по сути.

    void __stdcall Attack_THREAD() { __asm{pushadmov edx,0x0044FE60 // адрес вызываемой функцииmov ecx,dword ptr ds:[BA]mov ecx,dword ptr ds:[ecx+0x1C]mov ecx,dword ptr ds:[ecx+0x20] // структуру игрока пихаем в ecxpush -1 // понятия не имею, что это за параметрыpush 0 // они просто взяты из OllyDbgpush 0push 0call edxpopad}}
    NullAlex: код необходимо обрамлять соответствующим тегом.
  14. А ты попробуй для начала просто связать два файла вместе. Напиши свой инжектор DLL, научись эту DLL запихивать в чужой процесс, внутри самой DLL - разберись, как работать с памятью изнутри нужного адресного пространства, затем - как писать инъекции кода сразу внутри DLL. После - как работать с shared-секцией памяти или сообщениями, чтобы инжектор и DLL друг друга понимали. А потом уже и объединить можно. Способов, как я уже сказал, масса - их можно и банально нагуглить. Если не понимаешь, как подобраться к крупной задаче - разбивай ее на мелкие и решай их.

    спасибо за умные мысли=) Пожалуй, так и поступлю

  15. Додумались они до того, что описывал

    в своих работах Coder. Можно же не использовать внешнюю программу, а внедрить в

    адресное пространство игры свой исполняемый модуль, скажем, DLL! В едином

    адресном пространстве будет сильно удобнее - во-первых, не нужны API-функции

    записи в память - мы можем напрямую ее изменять и копировать, были бы права на

    это. Во-вторых - можно записать нужную ассемблерную вставку прямо в DLL и делать

     инъекцию кода, используя адрес этой вставки, обернув ее в функцию. Это

    позволяет писать намного быстрее и не очень заморачиваться со смещениями и

    цифрами вместо команд - большинство компилируемых языков программирования

    поддерживают ассемблерные вставки в коде программы.

    На этом этапе EXE-файл трейнера выполняет роль красивой обертки, цель которой -

    показать картинку, написать имя автора и то, какой он крутой и молодец, а затем

    внедрить в адресное пространство игры эту самую DLL, которая сделает всю

    дальнейшую работу. Такие вот внедрители DLL и называются инжекторами, только не

    кода, а DLL.

     

    keng, я понял тебя, но уж больно трудно скомпоновать все это в единую мысль

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

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

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