Двач.hk прислал битые данные.
Вы видите копию треда, сохраненную 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). Как забрать эту штуку не знаю.
Обновить тред
Двач.hk прислал битые данные.
Вы видите копию треда, сохраненную 21 апреля 2015 года.
Можете попробовать обновить страницу, чтобы увидеть актуальную версию.

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

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