Русское сообщество по скриптингу

Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение ADDAM » 18 окт 2009, 17:43

У меня что то amxxdump.exe не запустился :shout:
Аватара пользователя
ADDAM
 
Сообщения: 12
Зарегистрирован: 18 окт 2009, 17:06
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение Ser_UFL » 18 окт 2009, 18:07

rangel, так держать! :thumbs_up
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 975
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 380 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение Endi » 19 окт 2009, 11:19

Да, неплохая штука. Есть конечно недочеты, закрывающих скобок иногда слишком много... но вполне наглядный исходник получается. Молодец.
ADDAM, кинь утилиту в ту же директорию что и amxxdump.exe и с верху убери полный путь до amxxdump.exe
Код: Выделить всё
/c amxxdump.exe -g -m -d -l -j -e -E deass.amxx
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение DJ_WEST » 19 окт 2009, 15:16

Только нет универсальности, там шаблоны, а нужно некое подобие AI в зависимости от того или иного опкода. Тогда в 99% из любого плагина будет получение подобие исходника.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение rangel » 20 окт 2009, 07:21

Endi писал(а):Да, неплохая штука. Есть конечно недочеты, закрывающих скобок иногда слишком много... но вполне наглядный исходник получается. Молодец.
ADDAM, кинь утилиту в ту же директорию что и amxxdump.exe и с верху убери полный путь до amxxdump.exe
Код: Выделить всё
/c amxxdump.exe -g -m -d -l -j -e -E deass.amxx

закрывающих скобок много потому что конец цикла или if конец комманд одинаковый а так как у меня нету условий на все комманды то получается что закрывающих скобок оч много...
Аватара пользователя
rangel
 
Сообщения: 140
Зарегистрирован: 28 сен 2009, 18:52
Благодарил (а): 40 раз.
Поблагодарили: 26 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение Lt.RAT » 06 дек 2009, 03:05

До этого статью просто листал (поскольку до этого приходилось исправлять плагины, без исходников, прямо в коде), а щас что-то решил прочитать да покритиковать...

Введение тут конечно весьма краткое, возможно стоит убрать его путем вынесения в отдельную статью с полной переработкой...
Вот например:
>>"amxx файл - это простой метод" - как файл может быть методом;
>>"amx файл разбит на три части: заголовок, раздел кода и раздел данных." - А где секция с public функциями, секция с native - функциями, с таблицами "public variables" и "public tagnames" итп ?
>>"Раздел данных содержит стек, динамическую память и другие данные, такие как массивы и строки." - Раздел данных содержит и другие данные - гы. Да и опять терминологически - как файл может содержать динамическую память... Вот понимаю что файл содержит раздел, который в последующем копируется в память, причем информация содержащаяся в этой "динамической памяти" совершенно не из раздела данных (все переменные и константы разных мерностей). Опять же как файл может содержать стек, когда он всегда пустой, там от стэка только начальный адрес так-то и все...
>>"Стек используется для локальных переменных." - лучше бы уточнил сразуже какие переменные являются локальными или упомянул, что описанное через static и new это глобальные переменные и их начальные значения хранятся в секции данных.
>>"Виртуальная машина довольно проста. Она основана на двух регистрах (PRI и ALT), стеке и динамической памяти." и ниже в описании мы узнаем что там есть еще и скрытые регистры... причем сначала появляется FRM и ниже в догонку нам шлют DAT... А как насчет COD, HEA, STP, STK, FRM и CIP? (в описаниях всетаки чаще употребляют "специальные", а не "скрытые", хотя "скрытые" всетаки лучше суть отражают)

>>"Регистры - простые ячейки, используемые для хранения временной информации и их возвращения" и "Динамическая память - это простой участок памяти, используемый для хранения временных переменных."
И в регистрах хранится временная информация и в динамической памяти хранится она же (более того она записанна еще и в файле, временная и в файле :) )... Так все же что там хранится ?) Если честно я не помню, чтоб встречал HEAP итп на практике...
>>"Инструкции, относящиеся к FRM, заканчиваются на '.S'. Инструкции, относящиеся к константам, заканчиваются на '.C'"
А что же заканчивается на '.I' (в примерах оно встречается) ?)

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

Раздел описания программы пропущу и перейду сразу к примерам... Если честно - и тут мне нехочется анализировать всю информацию, поэтому остановлюсь только на том что бросилось в глаза...
>>"Так как используется функция register_clcmd, то мы знаем ее синтаксис: register_clcmd ( const client_cmd[],const function[],flags=-1, info[]="" ) "
В данном описании 4 аргумента, а выше по анализируемому коду получается 5, вот незадача :)
Но оно спокойно разрешается нормальным описанием функции:
register_clcmd(const client_cmd[],const function[],flags=-1, const info[]="", FlagManager=-1);

В свое время еще так и не понял сокральный смысл "BREAK", описание типа "означает прерывание, можно понимать это, как конец строки" почему-то восприниматься не хочет, помню когда плагины редактировал без декомпиляции - брейки подпортили мне жизнь, где-то все без них работало, где-то из-за их нехватки вылетало... Вообщем в каких-то случаях не может он выполнять просто цепочку команд, без "концов строки", хотя чисто теоретически он должен выполнять коды совершенно не обращая внимания на такие "концы"... Но для дизассемблирования большего понимания конечно и не требуется :)

ЗЫ есть ли какиенить новости по декомпилятору, или и вправду забросил :(

[ADD:]
А вообще щас что-то решил почитать как у BAILOPAN`а это написанно... Оказывается точно так же только по английски... Написал бы сразу же что введение это перевод...

Еще меня посетила идея преобразовывать код не в Сишный синтаксис, а в язык ассемблера (под scasm), поидее такое преобразование сделать проще... Но заглянув в исходники scasm понял что это нереализуемо, либо надо дописывать его... BAILOPAN начал видать scasm писать, но так и бросил недоделав :(
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 151 раз.
Языки программирования: Counter-Strike 1.6

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение DJ_WEST » 07 дек 2009, 10:55

вообще щас что-то решил почитать как у BAILOPAN`а это написанно... Оказывается точно так же только по английски... Написал бы сразу же что введение это перевод...

Так и есть, вступление - это вольный перевод его части.
Остальное прочитал, если есть желание подправить, можешь прислать готовый текст, я посмотрю и обновлю.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение Lt.RAT » 07 дек 2009, 14:06

DJ_WEST писал(а):Остальное прочитал, если есть желание подправить, можешь прислать готовый текст, я посмотрю и обновлю.


Тогда поправь хотя бы от это:
>>"Так как используется функция register_clcmd, то мы знаем ее синтаксис: register_clcmd ( const client_cmd[],const function[],flags=-1, info[]="" ) "
В данном описании 4 аргумента, а выше по анализируемому коду получается 5, вот незадача
Но оно спокойно разрешается нормальным описанием функции:
register_clcmd(const client_cmd[],const function[],flags=-1, const info[]="", FlagManager=-1);


Остальное править смысла не вижу :) Там уж проще и лучше переписать оформив отдельной статьей :) Может после НГ будет время обмозговать да написать подобное введение, а лучше всетаки декомпилятор доработать, тогда и отпадет надобность в изучении всего этого :)
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 151 раз.
Языки программирования: Counter-Strike 1.6

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение Lt.RAT » 17 дек 2009, 03:27

Не пишет тут никто кроме меня :(
Нашел два способа как можно скрыть код от amxxdump:
1. При компиляции использовать ключ -d0 (этим способом пользуется DJ_WEST), но у такого способа явный минус - отсутствует возможность генерирования отладочных сообщений...
Мне этот способ не понравился и я продолжил поиски :-D

2. Способ заключается и в баге компилятора и в текущих версиях amxxdump:
Создаем массив на 0 элементов "new arr[0];" - так-то полнейший бред
Но при его использовании (arr[smth] = 0;) компилятор скажет, что массив определен неверно
Есть способ добавить инфу в раздел data неиспользовав ее в плагине. Это делается с помощью
#pragma unused <имя> //резервирует в разделе data место под нашу "переменную". Символ ";" - ставить после имени - нельзя
Итого пишем:
Код: Выделить всё

new arr[0];
#pragma unused arr

Вообще-то работоспособность такого плагина в самом AMXX я не проверял (и не хочется), поэтому способ пока теоретический... Естесственно от дизассемблера от Wraith оно не спасет
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 151 раз.
Языки программирования: Counter-Strike 1.6

Re: Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

Сообщение DJ_WEST » 17 дек 2009, 13:29

Lt.RAT, у меня не только один ключ, вторая моя защита скрывает и от amxxdump, и от Wraith :)
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Пред.След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8