Это копия, сохраненная 21 апреля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Начинать с фасма, но с синтаксисом MASM и gas тоже ознакомиться (ибо ассемблерные вставки и чужие проекты).
Библия от Intel: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
Библия от AMD: http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/ (раздел Manuals)
Васм уже разложился и плохо пахнет. Но в архиве на главной все еще много годных статей.
Так а по асму только древние статьи и канают, ветхие заветы машинного кода. Ведь архитектуры процессоров особо не меняются, все знания ассемблериста актуальны лет по 10 - 20. Актуальны, конечно, условно, ибо прилагать эти "актуальные" знания на практике имеет всё меньше и меньше смысла (если только ты не компилятор пишешь под конкретную архитектуру).
Нужно из кода ассемблера, выдраного из ollydbg переделать под синтаксис gcc. Пытался осилить несколько статей, они в большинстве своем учат самому ассемблеру, мне нужно лишь только gcc версия для иньекций , запилите пожалуйста небольшой гайдик аля MOV EDX, EAX -> movl %edx, %eax если я не ошибаюсь
Отвечу тут. Судя по пикрелейтед, OllyDbg 2 умеет AT&T-шный синтаксис из коробки. Чего ж ты мучаешься тогда?
Алсо, зачем тебе именно AT&T? Гугли "gcc -masm=intel"
Ну и если тебе совершенно необходимо перевести код, меняй операнды местами: у Intel op destination, source, у gas op source, destination (например, mov edx,eax -> movl %eax,%edx) и гугли правильные написания мнемоник, если компилятор будет ругаться. Можешь погуглить какой-нибудь at&t assembler cheat sheet, там будут основные мнемоники.
собственно всплыли новые траблы
1. все переменные(?) считываются в dex, а в олли дбг они в hex, я закомментил эти команды.
2. есть жалобы от компилятора на некоторые ошибки.
Я думал, у тебя функция простая без зависимостей. Все, что ты закомментил - нужно.
- Все вызываемые функции (call) нужно либо тоже копировать вместе с этой функцией, либо реализовывать непосредственно там, куда ты копируешь код. В любом случае, для начала их нужно как-нибудь назвать.
- Для всех jmp (jz, jnz и т. д.) нужно перед копированием из OllyDbg нужно создать метки (Enter по инструкции call/jmp, правой кнопкой, Add label, называешь как-нибудь, потом минус на numpad, чтобы вернуться обратно).
- Все глобальные данные (там где ds: и адрес) тоже нужно копировать (если по адресу не нули) или хотя бы выделять под них память. И опять же создавать метки.
- В настройках OllyDbg должно быть что-то вроде "Show ARGs and LOCALs in procedures" (так в версии 1 называлось, в 2 ищи сам), если это выключить, не будет соответствующих ошибок при компиляции.
И учитывая, что ты даже близко не представляешь, что делаешь, лучше брось эту глупую затею, найди IDA с HexRays посвежее, нажми F5 и разбирайся, что делает код. Хотя вряд ли ты разберешься, если ты даже функцию правильно вызвать не можешь. Ну или учи асм.
это просто иньект кода в сторонний процесс, оллидбгом вырываю функцию - подсатвляю свои переменные и запускаю в процессе клиента.
Беру тот же процесс клиента, активный, все адреса и функции на месте - просто вызываю ту же функцию, но своим потоком, надеюсь ты понял о чем я.
Это первый раз в жизни, когда мне пришлось с асм столкнутся, сейчас попробую все это пропихнуть. Закомментил я ибо "код не понимает букав" e.g. он считывает то что под $ в десятичной. ??возможно стоит поставть h в конце, но будет та же ошибка компиляции, хз что делать.
когда выклчил эту штуку вроде ошибок меньше, осталось некорректное считывание 16ричной системы i.e. на
JZ $00525FDC он говорит
{standard input}:23: Error: junk `FDC' after expression
думаю ты понял что я имею ввиду
п.с. код я комментил чтобы все ошибки на экран поместились)
У тебя в JZ адрес абсолютный. Даже если это скомпилируется, работать оно будет не так, как ты хочешь. Ты делаешь какую-то бессмысленную ерунду. Если это по туториалу - выкинь его. Чтобы сделать CreateRemoteThread для функции в адресном пространстве другого процесса, ее не нужно никуда копировать, она и так там - достаточно лишь знать ее адрес. Копирование нужно, когда ты хочешь выполнить свой код. И это не просто любой взятый с потолка код, он должен быть написан определенным образом, чтобы не иметь зависимостей от данных и функций, которые ты не копируешь. Использование абсолютной адресации в таком коде требует дополнительных телодвижений, поэтому ее тоже обычно избегают.
Константы в AT&T синтаксисе пишутся так же, как в Си, но с долларом: $12345 (десятичная), $0xdeadbeef (шестнадцатеричная), $0755 (восьмеричная).
Прости, я знаю, я тебя немного подзаебал, но мы близки к победе. На самом деле туториал говорил очень правдивые вещи. Я какбэ писал: мне нужно в игрульке запускать внутреигровые функции и прочее (БОТ). Для этого я должен в своей программе дать возможность вызывать функции клиента. НО! Некоторые функции требуют каких-либо дейстсвий от пользователя, там поожение мышки. Мы берем эту функцию, вычисляем параметр - меняем его на свой, делаем креатремоттХреад и опа - все работает. Я решил начать с функции без параметров - функция снятия таргета. Вот, с твоей помощью узнал много нового) Сейчас только научился перемещать персонажа, радости полные штаны. Алсо лови пастебин. При переводе всех чисел в $0x[0-F]{1,} ошибка. я залил в пастебин два варианта - мой запиленный по твоим не очень доходящим до меня инструкциям и взятый из олли. http://pastebin.com/8HhEWZBS
Что касается ошибок при компиляции:
> Error: bad memory operand `...'
Обращение по адресу (дереференс указателя), $ убираешь.
> Error: operand type mismatch for `call'
$ убираешь.
> operand type mismatch for `jz' (и прочие переходы)
См. >>449268 про метки, иначе управление уйдет в оригинальную функцию (если она будет по старым адресам) или вообще вникуда. Можешь $ убрать и попробовать.
http://pastebin.com/vb73aktN
Вообще, линкер падает, потому что он кривой: код нерабочий, но правильный с точки зрения процессора. Но даже если бы он не падал, код бы не заработал так, как ты хочешь.
Инструкция CALL кодируется так: e8 (опкод) и 32-битное смещение вызываемой функции относительно следующей инструкции. Например, если инструкция call 0x00711140 расположена по адресу, ну допустим, 0x400000, то она закодируется, как call (0x00711140 - (0x400000 + 5) = 0x0031113b), т.е., e8 3b 11 31 00.
Если ты выделишь память по адресу 0x400000, запишешь туда этот CALL и передашь управление, процессор считает инструкцию (опкод e8 и 32-битное смещение) и перейдет по адресу 0x400000 (адрес инструкции CALL) + 5 (размер инструкции CALL) + 0x31113b (смещение) = 0x711140, как ты и предполагал.
Но если ты запишешь эту инструкцию по любому другому адресу, процессор при обработке CALL вычислит другой адрес для перехода, а не 0x711140. И после перехода по этому адресу ничего хорошего не произойдет.
Если вызываемая при помощи CALL функция при каждом запуске лежит по одному и тому же адресу, тебе нужно позаменять все относительные call на примерно такие конструкции:
mov $0x00711140, %eax // Загружаем абсолютный адрес функции в eax
call %eax // Вызываем функцию по адресу, содержащемуся в eax.
Так же самая проблема возникнет у тебя с JMP/JZ, как ее устранить, я уже >>449268 говорил.
я понял, в ресурсе была описана такая функция - клик правой кнопки мышки по объекту(GUID) - переменная - адрес объекта. вот:
wow.Asm.AddLine("mov ecx, {0}", objGUID);
wow.Asm.AddLine("call {0}", fAddress);
wow.Asm.AddLine("retn");
учитывая то что я понял, она должна в инлайн асм выглядеть так, да ?
http://pastebin.com/4xxNjjqH
\n\t забыл поставить
Ну почти, но имей в виду, что по соглашению, функции должны сохранять значения регистров EBX ESI EDI, а ты как раз портишь EBX в RightClickF (можешь добавить pushl %ebx в начало и popl %ebx перед retn или использовать EAX для адреса).
Но в данном случае тебе не нужен асм вообще:
int __attribute__((fastcall)) (∗RightClickF)(DWORD guid) = (void ∗) 0x00711140;
RightClickF(12345);
И сгенерируется точно такой же код, только без асмоебли.
Вдогонку: конвенция __fastcall предполагает, что первый параметр передается в ECX, второй в EDX, остальные в стеке. Может быть, там какая-нибудь другая конвенция, смотри сам.
так, смотри, я не сильно понял что ты пытался сделать в фастклл, я о таком ни на одном сайте не слышал. Вобщем, я делаю по инжектам, я пытался запустить функцию клика правой кнопкой мышки по объекту РЕСУРС. Самое интересное, что функция ТАК ВЫЗВАЛАСЬ и произошел краш игры (в функцию были хуево переданы параметры). НО ОНА ЗАИНЪЕКТИЛАСЬ. вобщем пастрелейтед и пикрлтд.
http://pastebin.com/VdTizf9C
Вызываем:
UINT_PTR params[] = {
guid,
};
...
CreateRemoteThread(..., (LPTHREAD_START_ROUTINE) ta, (LPVOID) params, ...);
...
А RightClickF будет выглядеть примерно так:
void TARGET::RightClickF(UINT_PTR params[]) {
// Вытаскиваешь параметры (ты ведь заранее знаешь, сколько ты их передал).
DWORD guid = params[0];
// int somethingElse = params[1];
// float parameter3 = params[2];
// И т. д., сколько нужно.
// rightClickHandler - указатель на функцию по адресу 0x00711140, которая принимает один параметр.
int __attribute__((fastcall)) (∗rightClickHandler)(DWORD guid) = (void ∗) 0x00711140;
// Вызываешь эту функцию.
rightClickHandler(guid);
}
это именно DWORD, функция с одним параметром. Пока я пытаюсь с ней разобраться, для той программы что я хочу сделать не нужно слишком много сложных функций, почему я не хочу использовать фасткалл - на ресурсе, откуда я беру всю информацию о памяти клиента все инжекты оформлены в виде сишарпных команд уровня AutoIt, которые реализует специальная библиотека blackmagic.
То есть как прямо передать guid ? Разве для вызова функции в памяти клиента достаточно записать только функцию, а параметры можно свои ?
вобщем, я не понимаю как записать в память эти параметры.
так, что то я вообще
вобщем, поставив перед guid & я пришел к тому же самому крашу - переменные не записались - чяднт ?
>>450739
> Разве для вызова функции в памяти клиента достаточно записать только функцию, а параметры можно свои
В память нужно записать все, что требуется для работы функции. Давай разберем:
Стартовая функция потока (ThreadProc), которая у тебя RightClickF принимает один параметр, она использует конвенцию __stdcall, поэтому параметры (параметр) передаются через стек в обратном порядке:
(где-то внутри CreateRemoteThread):
push lpParameter // Заталкивает в стек параметр, который ты передал в CreateRemoteThread, т.е., твой DWORD.
call ThreadProc // Вызывает функцию, адрес которой ты передал как THREAD_START_ROUTINE, т.е., RightClickF.
В результате параметр DWORD guid в RightClickF читается из стека и становится равным тому, что ты передал в CreateRemoteThread. Он - просто число и никак не зависит от других данных в вызывающем и вызываемом процессах.
Но если рассмотреть другой пример, если бы у тебя была не RightClickF(DWORD guid), а, например, AnotherThreadFunc(const char message):
const char message = "hello";
CreateRemoteThread(... (LPTHREAD_START_ROUTINE) AnotherThreadFunc, (LPVOID) message, ...);
После вызова CreateRemoteThread все так же сделает:
...
push lpParameter // Заталкивает в стек параметр, т.е., адрес message.
call ThreadProc
После выполнения этого кода AnotherThreadFunc получает управление, в ее параметр message попадает адрес, который ты передал, но адрес-то этот в вызывающем процессе, а не в клиенте. В результате, при попытке использования параметра в лучшем случае прочитается мусор, а в худшем по этому адресу не окажется ничего, и клиент вывалится. Поэтому чтобы передать указатель, ты выделяешь память на стороне клиента, копируешь туда данные и передаешь указатель уже на эти данные.
Третий пример. Тебе нужно передать два параметра, но ты не можешь - у ThreadProc может быть только один параметр, и CreateRemoteThread принимает только один параметр. Поэтому ты подготавливаешь параметры (выделяешь память на стороне клиента для указателей, если нужно, и т.д.) и пихаешь полученные параметры в массив, который тоже копируешь на сторону клиента. И вот адрес этого массива ты передаешь в CreateRemoteThread. Твоя ThreadProc получит управление, ее первым и единственным параметром будет твой массив.
>>450740
> как записать эти параметры
hProcThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)ta, guid, NULL, NULL); если guid не указатель, он один, и он не занимает больше 4 байт (в DWORD как раз 4).
Почитай что-нибудь по конвенциям вызова уже, гораздо понятней все станет.
> я не хочу использовать фасткалл
Ты не хочешь использовать указатель на функцию. А fastcall - всего лишь конвенция вызова (способ передачи параметров в функцию).
И вообще, нахуй так мучаться, погугли "инжект длл", реализуй в длл весь чит, потом научишься еще длл скрывать из списка модулей, и будет заебись.
Алсо, почему падает вызываемая функция - отдельный вопрос. Вангую, там класс, и в ecx не guid должен попадать. Но проверить не могу, в вов не играю.
>>450739
> Разве для вызова функции в памяти клиента достаточно записать только функцию, а параметры можно свои
В память нужно записать все, что требуется для работы функции. Давай разберем:
Стартовая функция потока (ThreadProc), которая у тебя RightClickF принимает один параметр, она использует конвенцию __stdcall, поэтому параметры (параметр) передаются через стек в обратном порядке:
(где-то внутри CreateRemoteThread):
push lpParameter // Заталкивает в стек параметр, который ты передал в CreateRemoteThread, т.е., твой DWORD.
call ThreadProc // Вызывает функцию, адрес которой ты передал как THREAD_START_ROUTINE, т.е., RightClickF.
В результате параметр DWORD guid в RightClickF читается из стека и становится равным тому, что ты передал в CreateRemoteThread. Он - просто число и никак не зависит от других данных в вызывающем и вызываемом процессах.
Но если рассмотреть другой пример, если бы у тебя была не RightClickF(DWORD guid), а, например, AnotherThreadFunc(const char message):
const char message = "hello";
CreateRemoteThread(... (LPTHREAD_START_ROUTINE) AnotherThreadFunc, (LPVOID) message, ...);
После вызова CreateRemoteThread все так же сделает:
...
push lpParameter // Заталкивает в стек параметр, т.е., адрес message.
call ThreadProc
После выполнения этого кода AnotherThreadFunc получает управление, в ее параметр message попадает адрес, который ты передал, но адрес-то этот в вызывающем процессе, а не в клиенте. В результате, при попытке использования параметра в лучшем случае прочитается мусор, а в худшем по этому адресу не окажется ничего, и клиент вывалится. Поэтому чтобы передать указатель, ты выделяешь память на стороне клиента, копируешь туда данные и передаешь указатель уже на эти данные.
Третий пример. Тебе нужно передать два параметра, но ты не можешь - у ThreadProc может быть только один параметр, и CreateRemoteThread принимает только один параметр. Поэтому ты подготавливаешь параметры (выделяешь память на стороне клиента для указателей, если нужно, и т.д.) и пихаешь полученные параметры в массив, который тоже копируешь на сторону клиента. И вот адрес этого массива ты передаешь в CreateRemoteThread. Твоя ThreadProc получит управление, ее первым и единственным параметром будет твой массив.
>>450740
> как записать эти параметры
hProcThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)ta, guid, NULL, NULL); если guid не указатель, он один, и он не занимает больше 4 байт (в DWORD как раз 4).
Почитай что-нибудь по конвенциям вызова уже, гораздо понятней все станет.
> я не хочу использовать фасткалл
Ты не хочешь использовать указатель на функцию. А fastcall - всего лишь конвенция вызова (способ передачи параметров в функцию).
И вообще, нахуй так мучаться, погугли "инжект длл", реализуй в длл весь чит, потом научишься еще длл скрывать из списка модулей, и будет заебись.
Алсо, почему падает вызываемая функция - отдельный вопрос. Вангую, там класс, и в ecx не guid должен попадать. Но проверить не могу, в вов не играю.
Вау,
пока я не настолько ахуенен чтобы понять и юзать всю ту инфу что ты мне даешь но я регулярно сохраняю ее в блокнотике)
Я владею только плюсами, как писать длл библиотеки я ни малейшего представления пока не имею. Если я правильно понял - фасткалл - вызывает функцию по адресу, но сама функция же нахоидтся в нашем процессе, вероятно ее тоже придется записать в процесс игры. Но ведь она не в ассеблере, как без компиляции можно запускать +совые функции можно ? Вобщем, если остановится на том что я пока пытаюсь понять, есть функция игры - нажатие левой кнопкой мыши по GUID , она принимает в себя собственно GUID объекта, пикрелейтед. О том, что параметр - гуид я узнал в одном треде, по той же версии игры, тем более это очевидно. Если посомтреть на отчет ошибки - можно понять что проблема все-таки в параметрах, все же я их как-то неправильно передаю. Еще раз пасту закину. http://pastebin.com/VrnvqGnG - код, вот еще тект воверрора, может он тебе о чем то скажет.. http://pastebin.com/iywSyzj3
update: вобщем, я потыкал по разным объектам и посмотрел свзяь с реестром в момент клика - eax - тут хранится одно число, оно постоянно для любого сервера\объекта\места, ebx - адрес объекта в памяти, ecx - адрес функции, что мы вызвали, ebx - GUID объекта (DWORD), esp - некоторое число, для локации \ одинаковыъ объектов - похожее, отличается не сильно, ebp - больше числа esp ровно на 16, esi - адрес объекта(еще раз) , edi - опять некоторое число, которое имеет некоторую зависимость.
Если я инъекутирую в вов асм функцию, которая забивает регистр так как мне надо, потом вызову функцию (которая в есх), все должно работать нормально ? Зачем тогда записывать в процесс параметры?
Hу вот смотри, что мы можем увидеть из скриншота кроме блядского AT&T синтаксиса.
1) (0x00711141) В edi записыается то, что ты передал первым параметром функции (ecx).
2) (0x00711143) По адресу edi+0x1a0 что-то читается.
3) Из этого заключаем, что первый параметр нихуя не DWORD, нихуя не guid, и вообще, учитывая, что он передается через ecx, это не __fastcall, а __thiscall, т.е., стандартный способ вызовов методов объекта, когда указатель на объект (this) кладется в ecx, а параметры в стек.
4) (0x00711149, 0x0071114b, 0x0071114e) Оказывается, из переданного в функцию объекта прочитался указатель на какой-то другой объект, у этого объекта мы вызываем какой-то виртуальный метод. Собственно, в этом месте все и падает, потому что передал ты нихуя не объект, и у него нихуя нет указателя на другой объект по смещению 0x1a0.
5) К ESP (указателю стека) функция не обращается (только корректирует стек после чего-то похожего на printf), а retn в конце не чистит стек, что позволяет заключить, что функция наша без аргументов.
Итого: по 0x00711141 лежит невиртуальный метод объекта (видимо, класса Player), который не принимает аргументов (кроме this). Где ты там guid нашел, я не знаю.
> как писать длл библиотеки
Так же как и обычные программы. Это уж точно проще, чем пистаь читы. В любом случае, google gcc make dll или google how to make dll with qt.
> о том, что параметр - гуид я узнал в одном треде
Это в принципе может быть объект класса GUID, хотя вряд ли.
> фасткалл - вызывает функцию по адресу
> но сама функция же нахоидтся в нашем процессе, вероятно ее тоже придется записать в процесс игры
Да, просто копируешь RightClickF в процесс игры, как и раньше и вызываешь. Поменяй только fastcall на, как мы выяснили, thiscall.
>>450769
Через eax, edx, esi, edi, ebx обычно ничего не передается, эти регистры используются для хранения промежуточных значений. esp/ebp - указатель стека и указатель на кадр стека, что это и зачем - гугли про стек, даже в wikibooks все разжевано,
> реестр
> путает регистр и реестр
> пишет чит
> Если я инъекутирую в вов асм функцию, которая забивает регистр так как мне надо
Если ты найдешь, по какому адресу (нихуя не фиксированному скорее всего) хранится адрес объекта player, положишь его в ecx и вызовешь 0x00711140, все будет ок.
Hу вот смотри, что мы можем увидеть из скриншота кроме блядского AT&T синтаксиса.
1) (0x00711141) В edi записыается то, что ты передал первым параметром функции (ecx).
2) (0x00711143) По адресу edi+0x1a0 что-то читается.
3) Из этого заключаем, что первый параметр нихуя не DWORD, нихуя не guid, и вообще, учитывая, что он передается через ecx, это не __fastcall, а __thiscall, т.е., стандартный способ вызовов методов объекта, когда указатель на объект (this) кладется в ecx, а параметры в стек.
4) (0x00711149, 0x0071114b, 0x0071114e) Оказывается, из переданного в функцию объекта прочитался указатель на какой-то другой объект, у этого объекта мы вызываем какой-то виртуальный метод. Собственно, в этом месте все и падает, потому что передал ты нихуя не объект, и у него нихуя нет указателя на другой объект по смещению 0x1a0.
5) К ESP (указателю стека) функция не обращается (только корректирует стек после чего-то похожего на printf), а retn в конце не чистит стек, что позволяет заключить, что функция наша без аргументов.
Итого: по 0x00711141 лежит невиртуальный метод объекта (видимо, класса Player), который не принимает аргументов (кроме this). Где ты там guid нашел, я не знаю.
> как писать длл библиотеки
Так же как и обычные программы. Это уж точно проще, чем пистаь читы. В любом случае, google gcc make dll или google how to make dll with qt.
> о том, что параметр - гуид я узнал в одном треде
Это в принципе может быть объект класса GUID, хотя вряд ли.
> фасткалл - вызывает функцию по адресу
> но сама функция же нахоидтся в нашем процессе, вероятно ее тоже придется записать в процесс игры
Да, просто копируешь RightClickF в процесс игры, как и раньше и вызываешь. Поменяй только fastcall на, как мы выяснили, thiscall.
>>450769
Через eax, edx, esi, edi, ebx обычно ничего не передается, эти регистры используются для хранения промежуточных значений. esp/ebp - указатель стека и указатель на кадр стека, что это и зачем - гугли про стек, даже в wikibooks все разжевано,
> реестр
> путает регистр и реестр
> пишет чит
> Если я инъекутирую в вов асм функцию, которая забивает регистр так как мне надо
Если ты найдешь, по какому адресу (нихуя не фиксированному скорее всего) хранится адрес объекта player, положишь его в ecx и вызовешь 0x00711140, все будет ок.
То есть, на каждый шаг в диссасемблерном коде можно нажать, и посмотреть состояние памяти, что там у нас в стеке, куче, етц.
В скриптовых языках такое видел.
А OllyDbg/x64dbg чем не угодили? Можно нажать, можно трейсить, можно смотреть состояние памяти, хэндлы, потоки, кучу, можно грузить символы, пользоваться кучей плагинов и т. д. Или под линукс надо? Для gdb GUI есть.
Я понял, я могу вычислить адрес объекта\гуид, у меня уже написан сканер ресурсов который их сохраняет в стек для дальнейшего собирания. То есть, если я запишу в регистр все что там было в момент когда я перехватил функцию, потом просто вызову ее коллом, все должно работать ? Зачем тогда передавать параметры в CreateRemoteThread, если все и так можно записать?
я начал было уже пилить в функцию заполнение регистра нужными данными, но тут отака хуйня. Что делать? Функции 0071140 нет, все начинается с 7С. Алсо адреса сохранились, т.к. бот функционирует
конкретных гайдов нет, адреса функций нашел на форуме, далее в оллидбдж вбиваю адрес функции, нажимаю F2, захожу в игру - выполняю действие, если происходит остановка процесса - функция найдена правильно. Параметры функций никто не говорит, но есть несколько асм вставок на C# в библиотеке blackmagic, которые обычно пиндосы и используют. Я как бы пытаюсь реализовать то же самое на qt, в итоге задача сводится к тому, чтобы переписать почти все функции библиотеки с нуля, сложно но интересно)
p.s. http://zhyk.ru/forum/showthread.php?t=414162 - c этой статьи я начал.
содомит
> Зачем тогда передавать параметры в CreateRemoteThread, если все и так можно записать?
Адрес, скорее всего, не фиксированный и меняется от запуска к запуску.
>>450850
> отака хуйня
Не понял, что ты хочешь сказать этим скриншотом. Адреса в окне кода принадлежат системной библиотеке ntdll. Нажми Ctrl+G, чтобы перейти к нужному адресу.
Статью твою посмотрю чуть позже.
>>450884
Обратная инженерия, отладка, низкоуровневые трюки, понимание сути происходящего при кодинге, ембеддед. Я вообще считаю, что кроме ассемблера программисту желательно еще и о каком-нибудь HDL представление иметь
>>451068
В ассемблере ничего нет. Ассемблер - это транслятор, а не компилятор. Как и многое другое, у кодящего на ассемблере это должно быть в голове. Иначе ниже какого-нибудь скриптоязыка не стоит и пытаться лезть.
>>451007
В ступи сначала.
всмысле все в порядке, посмотри сюда - >>450755
видишь адреса ? они все были с 00 сначала, i.e. 00{0..9}(6), теперь появились >>450850 7С вначале, вообще все поменялось, адреса функций. естесственно, не показываются, это произошело и на ноуте и на пекарне, реинстал-ресет не помог. Как все могло так поменяться ?
всмысле адреса другие. стрл g ничего не показывает, я понятия не имею чтопроизошло, мб параметр отображения другой ? Один и тот же процесс всегда открывал
Ctrl+G, 0x00711141, Enter, блять. Если там не будет функции, значит у тебя игра по разным адресам грузится. В статье, ссылку на которую ты кидал, есть про базовые адреса.
то есть как, одна версия игры уже 7й год кажись, все это время адреса не менялись, на форуме потерты все оффсеты, и тут оппа - мы меняем базовый адрес ? 7С с начала и до конца, если прлистывать, раньше были 00, это может быть связяно ТОЛЬКО с заменой базового адреса, то есть я в оллидбг ничего лишнего не мог клацнуть ?
даже если так, базовый адрес поменялся, то почему продолжает правильно работать моя прога? Все характеристики верно отображатся, сканер объектов работает. Ведь весь этот ункционал основан н тех же самых адресах, а оллидбг выдает 7С, втф
Скриншот Alt+E и того, что тебе говорит олли при переходе на 0x00711140 по Ctrl+G.
прости аутиста,
в ктрл дж я пропускал 0 в названии, при этом мне почему то казалось, что олли показывает ВСЕ адреса, вобщем, надо поспать
Олли показывает непрерывные регионы памяти одного типа (их по Alt+M посмотреть можно, Enter выбрать).
Циклы не модны, в этом сезоне их никто не носит.
Стек ниже твоего пикрелейтед. А ты опять какую-то хуйню творишь.
Тебе не нужно устанавливать перед вызовом НИКАКИХ регистров, кроме ecx. В ecx передается указатель на объект.
ну а чем мне может ЭТО помешать ? у меня и так происходит вылет клиента, я понятия не имею с чем это связано, посмотри там на память\исходники, я просто не понимаю уже
Есть такая строка:
83 3D 34 F3 19 01 04 cmp dword pts ds:[119F334h],4
какой тут будет и как вы это поняли?
Это какие-то локальные мемы^W термины советские? И зачем они нужны? Для доступа к памяти используется такая штука, как effective address, состоящий из base_reg+index_reg*scale+displacement, где любой из компонентов может отсутствовать например, в твоей cmp будет только displacement.
Сегментный префикс используется всегда, просто сейчас ты сам его обычно не пишешь. У него же очевидный копипаст из окна дизасма оллидебага.
Каким образом это относится с моему посту или к посту спрашивающего? Алсо, если "сегментный префикс" - это segment override, то используется он редко, потому что у инструкций/регистров есть дефолтовые сегменты. Но иногда бывает нужно, например, для доступа к TEB в винде (fs/gs).
Возможно, ты имеешь в виду Rich-сигнатуру, добавляемую линкером от Microsoft (link.exe). В ней содержится статистика использованных для сборки утилит и некоторых библиотек - ничего уникального, никаких серийных номеров или чего-то подобного.
По первому результату в гугле достаточно информации, чтобы пропатчить слинкованный файл или даже сам линкер, если Rich чем-то мешает.
Начинай наверное, чего ждать.
Пытаюсь вызвать с помощью внешней программы внутренню функцию вова (каст спелла). Для этого я запилил в qt (c++) инджект, который пушает нужные параметры, и собственно вызывает функцию каста спелла. Происходит воверрор, итд. Пикрелетед1 - перехват функции оллидбдж, когда я кастую спелл из клиента, пикрелейтед2 - перехват уже заинжекшеной функции, вроде, как мне кажется, проблема в последнем параметре стека, вероятно он там не нужен. Так же в НЕХ под названием ST0-7 есть какие-то значения, возможно, их тоже следует заполнить надлежащим образом. http://pastebin.com/BUfgzYff асм-кун, вернись (
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int CastSpellDelegate(int spellId, int itemId = 0, ulong guid = 0, int isTradeskill = 0, int a5 = 0, int a6 = 0, int a7 = 0);
push 0 //unk a7
push 0 //unk a6
push 0 //unk a5
push 0 //istradeskill
push 0 //high guid
push 0 //low guid
push 0 //itemId
push 1337 //spellId
call 0x0080DA40
add esp, 0x20
retn
kak-to tak.
функция инжектится, ничего не вылетает, но ничего не происходит, каст идет Frost Armor, id = 168 (A8), версия 3.3.5, все точно так должно быть ? http://pastebin.com/2RDsqHJP
это селф-каст, ни одна из функций не запиливает в регистр то, что запиливает функция из клиента => пушается неверные данные, я хз, не на с# пишу, проблемы возникают на ровном месте, пока мне кажется, что то что добавляет в стек моя функция - портит весь инжект (05410018). Как забрать эту штуку не знаю.
Это копия, сохраненная 21 апреля 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.