Этого треда уже нет.
Это копия, сохраненная 21 апреля 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
13 Кб, 250x250
Assembler для чайников! #447420 В конец треда | Веб
сразу FASM (куча литературы, примеры, простота освоения) или MASM (только простота освоения), остальное рукожопное вырвиглазное дерьмо переиначеное как зеркальное отражение названного шайкой пидорасов и оно абсолютно недостпно для изучения(там вместо (intel) mov eax, ebx пишут(AT&T) mov %ebx,%eax, при этом результат одинаковый, ебанутые).
#2 #447526
>>447420
Начинать с фасма, но с синтаксисом 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)
#3 #447569
wasm.ru - в школе полюбливал сей ресурс.
#4 #447592
>>447569
Васм уже разложился и плохо пахнет. Но в архиве на главной все еще много годных статей.
#5 #447681
>>447592
Так а по асму только древние статьи и канают, ветхие заветы машинного кода. Ведь архитектуры процессоров особо не меняются, все знания ассемблериста актуальны лет по 10 - 20. Актуальны, конечно, условно, ибо прилагать эти "актуальные" знания на практике имеет всё меньше и меньше смысла (если только ты не компилятор пишешь под конкретную архитектуру).
34 Кб, 640x480
#6 #449030
спрошу тут
Нужно из кода ассемблера, выдраного из ollydbg переделать под синтаксис gcc. Пытался осилить несколько статей, они в большинстве своем учат самому ассемблеру, мне нужно лишь только gcc версия для иньекций , запилите пожалуйста небольшой гайдик аля MOV EDX, EAX -> movl %edx, %eax если я не ошибаюсь
176 Кб, 766x571
#7 #449033
>>449030
Отвечу тут. Судя по пикрелейтед, 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, там будут основные мнемоники.
#8 #449056
>>449033
большое спасибо, не знал что можно менять дизассембл в настройках, добра)
#9 #449064
>>449056
А ещё можно в исходном файле прописать директиву
.intel_syntax noprefix
241 Кб, 1280x800
#10 #449065
>>449033
собственно всплыли новые траблы
1. все переменные(?) считываются в dex, а в олли дбг они в hex, я закомментил эти команды.
2. есть жалобы от компилятора на некоторые ошибки.
#11 #449268
facepalm.jpg
Я думал, у тебя функция простая без зависимостей. Все, что ты закомментил - нужно.
- Все вызываемые функции (call) нужно либо тоже копировать вместе с этой функцией, либо реализовывать непосредственно там, куда ты копируешь код. В любом случае, для начала их нужно как-нибудь назвать.
- Для всех jmp (jz, jnz и т. д.) нужно перед копированием из OllyDbg нужно создать метки (Enter по инструкции call/jmp, правой кнопкой, Add label, называешь как-нибудь, потом минус на numpad, чтобы вернуться обратно).
- Все глобальные данные (там где ds: и адрес) тоже нужно копировать (если по адресу не нули) или хотя бы выделять под них память. И опять же создавать метки.
- В настройках OllyDbg должно быть что-то вроде "Show ARGs and LOCALs in procedures" (так в версии 1 называлось, в 2 ищи сам), если это выключить, не будет соответствующих ошибок при компиляции.

И учитывая, что ты даже близко не представляешь, что делаешь, лучше брось эту глупую затею, найди IDA с HexRays посвежее, нажми F5 и разбирайся, что делает код. Хотя вряд ли ты разберешься, если ты даже функцию правильно вызвать не можешь. Ну или учи асм.
#12 #449296
>>449268
это просто иньект кода в сторонний процесс, оллидбгом вырываю функцию - подсатвляю свои переменные и запускаю в процессе клиента.
Беру тот же процесс клиента, активный, все адреса и функции на месте - просто вызываю ту же функцию, но своим потоком, надеюсь ты понял о чем я.
Это первый раз в жизни, когда мне пришлось с асм столкнутся, сейчас попробую все это пропихнуть. Закомментил я ибо "код не понимает букав" e.g. он считывает то что под $ в десятичной. ??возможно стоит поставть h в конце, но будет та же ошибка компиляции, хз что делать.
#13 #449333
>>449268
когда выклчил эту штуку вроде ошибок меньше, осталось некорректное считывание 16ричной системы i.e. на
JZ $00525FDC он говорит
{standard input}:23: Error: junk `FDC' after expression
думаю ты понял что я имею ввиду
п.с. код я комментил чтобы все ошибки на экран поместились)
#14 #449339
Аноны, начинать с SICP - хорошая идея? Погуглил, вроде бы годная вещь. Алсо, для этого ведь надо ставить vim какой-нибудь?
#15 #449343
>>449339
Racket идет со средой разработки DrRacket, вим ставить не надо.
Вещь годная.
sage #16 #449370
>>449333
У тебя в JZ адрес абсолютный. Даже если это скомпилируется, работать оно будет не так, как ты хочешь. Ты делаешь какую-то бессмысленную ерунду. Если это по туториалу - выкинь его. Чтобы сделать CreateRemoteThread для функции в адресном пространстве другого процесса, ее не нужно никуда копировать, она и так там - достаточно лишь знать ее адрес. Копирование нужно, когда ты хочешь выполнить свой код. И это не просто любой взятый с потолка код, он должен быть написан определенным образом, чтобы не иметь зависимостей от данных и функций, которые ты не копируешь. Использование абсолютной адресации в таком коде требует дополнительных телодвижений, поэтому ее тоже обычно избегают.
Константы в AT&T синтаксисе пишутся так же, как в Си, но с долларом: $12345 (десятичная), $0xdeadbeef (шестнадцатеричная), $0755 (восьмеричная).
#17 #449375
>>449370
Прости, я знаю, я тебя немного подзаебал, но мы близки к победе. На самом деле туториал говорил очень правдивые вещи. Я какбэ писал: мне нужно в игрульке запускать внутреигровые функции и прочее (БОТ). Для этого я должен в своей программе дать возможность вызывать функции клиента. НО! Некоторые функции требуют каких-либо дейстсвий от пользователя, там поожение мышки. Мы берем эту функцию, вычисляем параметр - меняем его на свой, делаем креатремоттХреад и опа - все работает. Я решил начать с функции без параметров - функция снятия таргета. Вот, с твоей помощью узнал много нового) Сейчас только научился перемещать персонажа, радости полные штаны. Алсо лови пастебин. При переводе всех чисел в $0x[0-F]{1,} ошибка. я залил в пастебин два варианта - мой запиленный по твоим не очень доходящим до меня инструкциям и взятый из олли. http://pastebin.com/8HhEWZBS
sage #18 #449383
>>449375
Что касается ошибок при компиляции:

> Error: bad memory operand `...'


Обращение по адресу (дереференс указателя), $ убираешь.

> Error: operand type mismatch for `call'


$ убираешь.

> operand type mismatch for `jz' (и прочие переходы)


См. >>449268 про метки, иначе управление уйдет в оригинальную функцию (если она будет по старым адресам) или вообще вникуда. Можешь $ убрать и попробовать.
2 Кб, 1042x61
#19 #450282
я решил попробовать другу, более простую функцию, но с параметром. Такая же ошибка была и при компиляции старйо функции, чяднт ?
http://pastebin.com/vb73aktN
#20 #450636
>>450282
Вообще, линкер падает, потому что он кривой: код нерабочий, но правильный с точки зрения процессора. Но даже если бы он не падал, код бы не заработал так, как ты хочешь.
Инструкция 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 говорил.
#21 #450647
>>450636
я понял, в ресурсе была описана такая функция - клик правой кнопки мышки по объекту(GUID) - переменная - адрес объекта. вот:
wow.Asm.AddLine("mov ecx, {0}", objGUID);
wow.Asm.AddLine("call {0}", fAddress);
wow.Asm.AddLine("retn");
учитывая то что я понял, она должна в инлайн асм выглядеть так, да ?
http://pastebin.com/4xxNjjqH
#22 #450648
>>450647
\n\t забыл поставить
#23 #450702
>>450647
Ну почти, но имей в виду, что по соглашению, функции должны сохранять значения регистров EBX ESI EDI, а ты как раз портишь EBX в RightClickF (можешь добавить pushl %ebx в начало и popl %ebx перед retn или использовать EAX для адреса).
Но в данном случае тебе не нужен асм вообще:

int __attribute__((fastcall)) (∗RightClickF)(DWORD guid) = (void ∗) 0x00711140;
RightClickF(12345);

И сгенерируется точно такой же код, только без асмоебли.
sage #24 #450704
>>450702
Вдогонку: конвенция __fastcall предполагает, что первый параметр передается в ECX, второй в EDX, остальные в стеке. Может быть, там какая-нибудь другая конвенция, смотри сам.
172 Кб, 1280x800
#25 #450715
>>450704
так, смотри, я не сильно понял что ты пытался сделать в фастклл, я о таком ни на одном сайте не слышал. Вобщем, я делаю по инжектам, я пытался запустить функцию клика правой кнопкой мышки по объекту РЕСУРС. Самое интересное, что функция ТАК ВЫЗВАЛАСЬ и произошел краш игры (в функцию были хуево переданы параметры). НО ОНА ЗАИНЪЕКТИЛАСЬ. вобщем пастрелейтед и пикрлтд.
http://pastebin.com/VdTizf9C
#26 #450737
Если ты уверен, что guid - это именно дворд (в чем я сомневаюсь), тогда тебе нужно передавать в CreateRemoteThread вместо pp прямо (LPVOID) guid. Но это частный случай. Ты можешь передать в стартовую функцию потока только один параметр, поэтому гораздо лучше, если ты передашь массив параметров, а уже в стартовой функции будешь их разгребать. Например, так:

Вызываем:
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);
}
#27 #450739
>>450737
это именно DWORD, функция с одним параметром. Пока я пытаюсь с ней разобраться, для той программы что я хочу сделать не нужно слишком много сложных функций, почему я не хочу использовать фасткалл - на ресурсе, откуда я беру всю информацию о памяти клиента все инжекты оформлены в виде сишарпных команд уровня AutoIt, которые реализует специальная библиотека blackmagic.
То есть как прямо передать guid ? Разве для вызова функции в памяти клиента достаточно записать только функцию, а параметры можно свои ?
321 Кб, 1021x727
sage #28 #450740
>>450739
вобщем, я не понимаю как записать в память эти параметры.
#29 #450744
>>450740
так, что то я вообще
вобщем, поставив перед guid & я пришел к тому же самому крашу - переменные не записались - чяднт ?
#30 #450746

>>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 должен попадать. Но проверить не могу, в вов не играю.
#30 #450746

>>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 должен попадать. Но проверить не могу, в вов не играю.
59 Кб, 1141x309
#31 #450755
>>450746
Вау,
пока я не настолько ахуенен чтобы понять и юзать всю ту инфу что ты мне даешь но я регулярно сохраняю ее в блокнотике)
Я владею только плюсами, как писать длл библиотеки я ни малейшего представления пока не имею. Если я правильно понял - фасткалл - вызывает функцию по адресу, но сама функция же нахоидтся в нашем процессе, вероятно ее тоже придется записать в процесс игры. Но ведь она не в ассеблере, как без компиляции можно запускать +совые функции можно ? Вобщем, если остановится на том что я пока пытаюсь понять, есть функция игры - нажатие левой кнопкой мыши по GUID , она принимает в себя собственно GUID объекта, пикрелейтед. О том, что параметр - гуид я узнал в одном треде, по той же версии игры, тем более это очевидно. Если посомтреть на отчет ошибки - можно понять что проблема все-таки в параметрах, все же я их как-то неправильно передаю. Еще раз пасту закину. http://pastebin.com/VrnvqGnG - код, вот еще тект воверрора, может он тебе о чем то скажет.. http://pastebin.com/iywSyzj3
sage #32 #450769
>>450755
update: вобщем, я потыкал по разным объектам и посмотрел свзяь с реестром в момент клика - eax - тут хранится одно число, оно постоянно для любого сервера\объекта\места, ebx - адрес объекта в памяти, ecx - адрес функции, что мы вызвали, ebx - GUID объекта (DWORD), esp - некоторое число, для локации \ одинаковыъ объектов - похожее, отличается не сильно, ebp - больше числа esp ровно на 16, esi - адрес объекта(еще раз) , edi - опять некоторое число, которое имеет некоторую зависимость.
Если я инъекутирую в вов асм функцию, которая забивает регистр так как мне надо, потом вызову функцию (которая в есх), все должно работать нормально ? Зачем тогда записывать в процесс параметры?
#33 #450774
>>450755
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, все будет ок.
#33 #450774
>>450755
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, все будет ок.
#34 #450784
GDB хорош но не оч удобен. Есть ли такая программа, которая визуализирует выполнение бинарника:
То есть, на каждый шаг в диссасемблерном коде можно нажать, и посмотреть состояние памяти, что там у нас в стеке, куче, етц.
В скриптовых языках такое видел.
#35 #450789
>>450784
А OllyDbg/x64dbg чем не угодили? Можно нажать, можно трейсить, можно смотреть состояние памяти, хэндлы, потоки, кучу, можно грузить символы, пользоваться кучей плагинов и т. д. Или под линукс надо? Для gdb GUI есть.
#36 #450832
>>450774
Я понял, я могу вычислить адрес объекта\гуид, у меня уже написан сканер ресурсов который их сохраняет в стек для дальнейшего собирания. То есть, если я запишу в регистр все что там было в момент когда я перехватил функцию, потом просто вызову ее коллом, все должно работать ? Зачем тогда передавать параметры в CreateRemoteThread, если все и так можно записать?
424 Кб, 1280x800
#37 #450850
>>450832
я начал было уже пилить в функцию заполнение регистра нужными данными, но тут отака хуйня. Что делать? Функции 0071140 нет, все начинается с 7С. Алсо адреса сохранились, т.к. бот функционирует
#38 #450869
>>450850
Что за гайд, по которому пилишь это?
Интересно почитать про перехват функций etc
#39 #450871
>>450869
конкретных гайдов нет, адреса функций нашел на форуме, далее в оллидбдж вбиваю адрес функции, нажимаю F2, захожу в игру - выполняю действие, если происходит остановка процесса - функция найдена правильно. Параметры функций никто не говорит, но есть несколько асм вставок на C# в библиотеке blackmagic, которые обычно пиндосы и используют. Я как бы пытаюсь реализовать то же самое на qt, в итоге задача сводится к тому, чтобы переписать почти все функции библиотеки с нуля, сложно но интересно)
p.s. http://zhyk.ru/forum/showthread.php?t=414162 - c этой статьи я начал.
#40 #450884
Зачем нужно изучение ассемблера в современном мире?
#41 #450887
>>450884
1. чтобы мозги работали
2. микроконтроллеры
3. работа с памятью процессов
#42 #450924
>>450887
содомит
#43 #451007
>>450884
А как же я буду вирусы писать?
Трояны штоле на дельфе конпелировать?
#44 #451068
>>450887
>>451007
В этом вашем асемблере нет ОПТИМИЗАЦИИ ХВОСТОВОЙ РЕКУРСИИ. Язык, в котором отсутствует даже ОПТИМИЗАЦИЯ ХВОСТОВОЙ РЕКУРСИИ, не стоит учить. Даже обращать внимание на него не стоит. Шах и мат, господа асемблерщики!
#45 #451097
>>450832

> Зачем тогда передавать параметры в CreateRemoteThread, если все и так можно записать?


Адрес, скорее всего, не фиксированный и меняется от запуска к запуску.

>>450850

> отака хуйня


Не понял, что ты хочешь сказать этим скриншотом. Адреса в окне кода принадлежат системной библиотеке ntdll. Нажми Ctrl+G, чтобы перейти к нужному адресу.

Статью твою посмотрю чуть позже.

>>450884
Обратная инженерия, отладка, низкоуровневые трюки, понимание сути происходящего при кодинге, ембеддед. Я вообще считаю, что кроме ассемблера программисту желательно еще и о каком-нибудь HDL представление иметь

>>451068
В ассемблере ничего нет. Ассемблер - это транслятор, а не компилятор. Как и многое другое, у кодящего на ассемблере это должно быть в голове. Иначе ниже какого-нибудь скриптоязыка не стоит и пытаться лезть.

>>451007
В ступи сначала.
#46 #451102
>>451068
Рекурсия нужна разве что для stack bomb. Всё остальное можно сделать циклами.
#47 #451103
>>451097
всмысле все в порядке, посмотри сюда - >>450755
видишь адреса ? они все были с 00 сначала, i.e. 00{0..9}(6), теперь появились >>450850 7С вначале, вообще все поменялось, адреса функций. естесственно, не показываются, это произошело и на ноуте и на пекарне, реинстал-ресет не помог. Как все могло так поменяться ?
#48 #451104
>>451103
всмысле адреса другие. стрл g ничего не показывает, я понятия не имею чтопроизошло, мб параметр отображения другой ? Один и тот же процесс всегда открывал
#49 #451105
>>451104
Ctrl+G, 0x00711141, Enter, блять. Если там не будет функции, значит у тебя игра по разным адресам грузится. В статье, ссылку на которую ты кидал, есть про базовые адреса.
#50 #451114
>>451105
то есть как, одна версия игры уже 7й год кажись, все это время адреса не менялись, на форуме потерты все оффсеты, и тут оппа - мы меняем базовый адрес ? 7С с начала и до конца, если прлистывать, раньше были 00, это может быть связяно ТОЛЬКО с заменой базового адреса, то есть я в оллидбг ничего лишнего не мог клацнуть ?
sage #51 #451121
>>451114
даже если так, базовый адрес поменялся, то почему продолжает правильно работать моя прога? Все характеристики верно отображатся, сканер объектов работает. Ведь весь этот ункционал основан н тех же самых адресах, а оллидбг выдает 7С, втф
#52 #451122
>>451114
Скриншот Alt+E и того, что тебе говорит олли при переходе на 0x00711140 по Ctrl+G.
#53 #451129
>>451122
прости аутиста,
в ктрл дж я пропускал 0 в названии, при этом мне почему то казалось, что олли показывает ВСЕ адреса, вобщем, надо поспать
#54 #451138
>>451129
Олли показывает непрерывные регионы памяти одного типа (их по Alt+M посмотреть можно, Enter выбрать).
#55 #451211
>>451102
Циклы не модны, в этом сезоне их никто не носит.
12 Кб, 502x426
#56 #451562
я попытался запилить инжект заменяя регистры EAX--EIP теми что были при перехвате функций, но опять был воверрор, подозреваю, что нужно менять еще и пикрелейтед + я не понимаю, где в оллидбдж показывается стек.
#57 #451594
>>451562
Стек ниже твоего пикрелейтед. А ты опять какую-то хуйню творишь.
96 Кб, 1280x800
100 Кб, 1280x800
#58 #451653
Так, я пытался разобраться сам,но у меня все шло не так как нужно, в память записывалось хуй знает что, функция почти всегда вызывала вылет. Вобщем, тот же самый RIghtClick - нажать правой кнопкой мыши по объекту, я заскринил оллидбдж в момент перехвата функции во время вызова из игры, то есть как все должно быть (1й пик). 2й пик - то что поисходит у меня при перехвате оллидбдж МОЕГО инжекта, и собсна пастебин. Я просто уже не могу. Как я поступал: запускал клиент, привязывал оллидбдж (каждый раз у объекта разный адрес, постарался все заскринить с 1го рана клиента). http://pastebin.com/LizUQ9Vq
#59 #451657
google calling conventions, ну?
Тебе не нужно устанавливать перед вызовом НИКАКИХ регистров, кроме ecx. В ecx передается указатель на объект.
#60 #451663
>>451657
ну а чем мне может ЭТО помешать ? у меня и так происходит вылет клиента, я понятия не имею с чем это связано, посмотри там на память\исходники, я просто не понимаю уже
#61 #451664
>>451663
Есть фэйкожаббер или почта?
#62 #451667
>>451664
asmdlammodaynov@gmail.com
#63 #452966
Помогите определить тип адресации. Простую я вроде как понял, а вот когда составная не получается.
Есть такая строка:
83 3D 34 F3 19 01 04 cmp dword pts ds:[119F334h],4
какой тут будет и как вы это поняли?
#64 #453091
>>452966
Это какие-то локальные мемы^W термины советские? И зачем они нужны? Для доступа к памяти используется такая штука, как effective address, состоящий из base_reg+index_reg*scale+displacement, где любой из компонентов может отсутствовать например, в твоей cmp будет только displacement.
#65 #453159
>>453091
Сегментный префикс используется всегда, просто сейчас ты сам его обычно не пишешь. У него же очевидный копипаст из окна дизасма оллидебага.
#66 #453375
>>453159
Каким образом это относится с моему посту или к посту спрашивающего? Алсо, если "сегментный префикс" - это segment override, то используется он редко, потому что у инструкций/регистров есть дефолтовые сегменты. Но иногда бывает нужно, например, для доступа к TEB в винде (fs/gs).
#67 #453599
>>447420

>MASM


Слышал он добавляет после линковки к файлу твой хард айди. Правда?
#68 #453603
>>453599
Возможно, ты имеешь в виду Rich-сигнатуру, добавляемую линкером от Microsoft (link.exe). В ней содержится статистика использованных для сборки утилит и некоторых библиотек - ничего уникального, никаких серийных номеров или чего-то подобного.
По первому результату в гугле достаточно информации, чтобы пропатчить слинкованный файл или даже сам линкер, если Rich чем-то мешает.
#69 #454456
Асм-кун еще здесь? который фейкомыльцо просил Мне еще ждать, или опять начинать вайпать годный тред ?
#70 #454720
>>454456
Начинай наверное, чего ждать.
195 Кб, 1280x800
200 Кб, 1280x800
#71 #454947
собственно, продолжаю
Пытаюсь вызвать с помощью внешней программы внутренню функцию вова (каст спелла). Для этого я запилил в qt (c++) инджект, который пушает нужные параметры, и собственно вызывает функцию каста спелла. Происходит воверрор, итд. Пикрелетед1 - перехват функции оллидбдж, когда я кастую спелл из клиента, пикрелейтед2 - перехват уже заинжекшеной функции, вроде, как мне кажется, проблема в последнем параметре стека, вероятно он там не нужен. Так же в НЕХ под названием ST0-7 есть какие-то значения, возможно, их тоже следует заполнить надлежащим образом. http://pastebin.com/BUfgzYff асм-кун, вернись (
#72 #455022
>>454947
[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.
#73 #455043
>>455022
функция инжектится, ничего не вылетает, но ничего не происходит, каст идет Frost Armor, id = 168 (A8), версия 3.3.5, все точно так должно быть ? http://pastebin.com/2RDsqHJP
193 Кб, 1280x800
#74 #455052
>>455043
отклеилось
#75 #455062
>>455052
Ну попробуй пушнуть guid игрока. 3.3.5а клиента у меня сейчас под рукой нет.
#76 #455065
>>455062
это селф-каст, ни одна из функций не запиливает в регистр то, что запиливает функция из клиента => пушается неверные данные, я хз, не на с# пишу, проблемы возникают на ровном месте, пока мне кажется, что то что добавляет в стек моя функция - портит весь инжект (05410018). Как забрать эту штуку не знаю.
Тред утонул или удален.
Это копия, сохраненная 21 апреля 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски