А можете пожалуйста рассказать характеристики цифровых элементов, какой экран, какой проц, я нашел только attiny10-tshr, чтобы я мог сделать эмулятор и попробовать сделать тетрис с палкой? Там же наверняка микроконтроллер простой? Я тоже хочу сделать тетрис, но пока слаб в электронике, но очень это интересует. Хотя, нужно ещё знать байткод языка, не знаю даже, есть ли такая информация.
Я можно сказать, что не разбираюсь в электронике, но меня она интересует. Может быть когда-нибудь плотно займусь её изучением. В описании было написано, что материал сложный, но интерес возобладал надо мной. Мне всё понятно в вашей статье, кроме тех моментов, что подразумевают входы и выходы LCD экрана, но это надо даташиты смотреть. Интересная статья, очень понравилась.
Отлично, может перейду для создания 3d игр, а то мне иногда кажется, что я не потяну такой обильный объем знаний, которые требуется для разработки 3d игр. Хотя, если взять готовый физический движок, и glm, и opengl, то думаю можно будет управиться, плюс вопросы на тематических форумах.
Так как я больше по времени делаю игры, то сделал для себя инструменты. Например Я могу перегнать obj 3d модельки или png картинку в raw формат, который грузиться прямо в opengl. На android есть библиотека zlib и поэтому я с помощью упаковщика ресурсов (своего) сжимаю снова эти файлы и получается маленький размер. У меня есть несколько типов ресурсов, и у каждого свой адрес, например, чтобы загрузить ресурс png текстуры, я пишу.
Да, в android возможно пользоваться готовыми библиотеками для создания игры на opengl es, и в Android Studio это делается удобней. Я тоже на сях писал игру для android, но только вместе с SDL2 для упрощения и скорости разработки.
А так, вы молодцы. Если будете работать в этом направление, то впереди создание потрясающих инструментов и написания интересных статей.
Если брать готовый, то я ничему не научусь, а хотелось бы научиться делать компиляторы и эмуляторы. Да и в моём случае всё сделано под игровой движок. Например, я каждому эмулятору могу дать сколько команд ему разрешено за раз обработать, и если приходит прерывание, то его обработать в движке игры, так как мы имеем полный доступ ко регистрам вымышленного процессора. Также я выбираю какие будут операторы процессора и какие прерывания процессор будет обрабатывать. Мне нравиться самому делать это если честно.
Я решил сделать публичными репы с эмулятором и компилятором. Это мои первое творение, так что на крутое качество кода не претендую. В Компиляторе пока только в ветке radio_attack поддерживается разработка, потом перенесу в master. https://gitverse.ru/archinaragu/DOXY_EMU https://gitverse.ru/archinaragu/DOXY_ASM
Я накопал один пробел в игре. А именно, игра подходит только как сетевая игра против других игроков. Я просто не смогу создать бота, который бы не уступал человеку, а всё из-за совершенных механик, которые прежде не применялись ни в одной игре. Я о перехвате данных сканером. Реальный человек может проанализировать данные и понять что делать, а бот такого не может. Он либо может интерпретировать данные как есть и сделать ошибку, либо застрять в постоянных вычислениях об истинности данных и как их интерпретировать. Даже если играть против такого бота, который интерпретирует данные как есть, то его можно будет легко обмануть и будет несовсем интересно играть. А игроков, желающих поиграть в эту игру всего 8 человек. Ещё проблема в том, как быть с игровым сервером, играть по локальной сети или через интернет. У меня бюджет небольшой и не знаю что делать насчет сетевой игры. Если сделать по локальной сети, то можно играть через vpn, но тогда проблема будет, если кто-то будет arp mitm атаку делать. Пока эти проблемы не понял как решить. А разработкой продолжаю заниматься.
Перед реальной битвой можно будет потренироваться в режиме симуляции. В этом режиме мы как раз пишем код. Можно расставить врага в нужные клетки и отладить как наш код будет реагировать на обстановку. Всё делается в неспешном темпе. Да, можно добавить что-то вроде заготовок кода. В реальном бою мы уже следим за войной и обрабатываем перехваченные данные. В реальной битве можем поменять прошивку, либо сделать так, что последнее решение будет за нами, например командный центр может что-то обработать и послать оператору, то-есть нам, какой-то результат, а мы сможем выбрать что делать. Разумеется это будет всё кодироваться нами. Получается, что работа по кодированию всех юнитов не заканчивается. У врага могут быть зашифрованные передачи, нужно будет анализировать данные, эти данные будут храниться до поры до времени, пока следующий буфер не поступит в обработку. Но некоторые можно будет сохранить для анализа. Желание сделать интересный тактический бой выше, чем набрать 25000 вишлистов. Я понимаю, что в эту игру по началу, а может и вообще, будет играть человек 10. Но если она понравиться, и она будет гармонична для программиста, то это будет просто вау для меня. Я таких сложных проектов ещё не делал. Работать я не собираюсь, но игру как портфолию хочу иметь.
Документация точно будет. Также будут мои рекомендации по тому, что можно будет делать в играх.
Я даже понимаю, что обзор на такую игру будет трудно заиметь, так как игра не простая.
У меня очень много игр, и эта игра есть в том числе. Я играл в неё какое-то время. Из механик нравиться писать команды и пост эфект, делающий красивую картинку.
Ох ох ох. Теперь всё работает и конструктор и методы класса. Это просто замечательно. Не зря я статью выложил сюда. А то у меня остались знания об этом из давнешних времен, когда мне на форуме сказали, что через dlopen невозможно загружать классы, или я не понял просто чего-то тогда, но запомнилось. Я сейчас создал класс без знаний внутренностей. Только не понятно как размер класса получить настоящий, наверное только если реверсить.
#include <dlfcn.h>
#include <cstdint>
#include <iostream>
class FM {
uint8_t data[16];
};
int main (int argc, char **argv)
{
void *handle = dlopen ("libfm.so", RTLD_NOW);
void *constructor_fm = (void*) dlsym (handle, "_ZN2FMC2Ev");
FM *t = new FM();
FM *s = ((FM *(*)(FM *)) constructor_fm) (t); // constructor
void (*print)(FM *) = (void (*)(FM *)) dlsym (handle, "_ZN2FM5printEv");
print (t);
}
А и вправду. Я сейчас для класса использовал внутренние названия функций для создания конструктора и смог создать класс. Тогда можно класс объявить вот так и всё будет норм. Только такой вариант сложен и кажется, что нам нужно для десятой функции в классе сильно заморочиться. Да это удобно, когда есть заголовок класса, но в ситуациях, когда нет заголовка, методы неудобно восстанавливать, то-есть чтобы сослаться на нужный метод в классе, надо считать какое смещение в библиотеке класса.
class FM {
uint8_t data[128];
}
Вот вариант как работает с dlopen
int main (int argc, char **argv)
{
void *handle = dlopen ("libfm.so", RTLD_NOW);
FM *fm = (FM *) dlsym (handle, "_ZN2FMC2Ev");
fm->print ();
}
Капец, я так поразмыслил. Я же знаю ассемблер и реверс знаю и знаю как передаются параметры и знаю, что первый параметр для функции класса передается сам класс. Если print у нас без параметров, то мы можем точно такую же функцию создать, только первый параметр будет класс. И это работает. В данном случае print это метод класса FM.
Да, можете делать так. Я показываю свой метод, который отличается от вашего и дает больше свободы во времени, так как нам не нужно заполнять поля класса, а просто нужно выделить для него место.
Я привёл пример как можно проводить фаззинг библиотек, у которых нет заголовков, то-есть никаких определений. Вам стоит только написать уже логику построения неправильных данных. Мой пример показывает, что можно с помощью ассемблера соединить две библиотеки и использовать для фаззинга.
Как определили сигнатуру вызываемых ф-й тоже пол слова.
Тут объяснений много и не надо. С помощью radare2 открываем библиотеку и смотрим с помощью команды is. Не подумал, что на таком уровне сложности материала нужно было это прописать. Извиняюсь. Думаю, что можно дополнить эту команду. Так будет ясней.
Как определили (видимо никак) с какой версией std::string линковаться тоже ни намека.
Да, тут проблема думаю. Но вроде как можно попробовать несколько вариантов и дойти испытательным путем.
Ну а то что ассемблером можно подгружать код из динамической библиотеки - не ясна цель использования ассемблера. Намного логичнее и проще это сделать из плюсов тех же.
Ну вот есть в чужой библиотеке класс, который используется в библиотеке. Для пользователя не доступны эти заголовки, только программа и библиотека. Вот есть у класса много полей и методов. Как вы к примеру вызовете метод класса void operator++(int n)? Для C++ тут много трудностей возникает. Вам нужно правильно назвать все поля и их типы, указать все функции. А в ассемблере вам не нужно ничего этого делать. Вы просто выделяете память и всё. Ну или покажите пример, вопрос про operator++, как бы вы на C++ слинковали бы библиотеку DLL к примеру, если нет ни исходников, ни заголовков. Я такого способа не знаю, поэтому написал свой вариант.
Инстанцируем нашу либу через dlopen/LoadLibrary, берём у ней оффсет на функцию (можно хоть ручкам оффсет захардкодить),
Хм, интересно. А я думал, что такое можно делать только с сишными функциями. Спасибо за разьяснения. Но мне кажется, что это меня путает. Как я правильно помню, что c++ класс невозможно было через dlopen, dlsym создать. Если я правильно помню, то можно только char,int,void данные передавать через dlsym. Я же привёл специально пример, где невозможно отделить c++ класс от dlopen. В моем примере вы можете создать класс через библиотечную функцию или использовать функции класса библиотеки.
Или всё-таки можно через dlsym вызывать метод класса? Я специально такой пример привел, где есть такая сложность. Поправьте меня если я не прав в данном случае.
А можете пожалуйста рассказать характеристики цифровых элементов, какой экран, какой проц, я нашел только attiny10-tshr, чтобы я мог сделать эмулятор и попробовать сделать тетрис с палкой? Там же наверняка микроконтроллер простой? Я тоже хочу сделать тетрис, но пока слаб в электронике, но очень это интересует. Хотя, нужно ещё знать байткод языка, не знаю даже, есть ли такая информация.
У вас фото в статье не грузятся.
Я можно сказать, что не разбираюсь в электронике, но меня она интересует. Может быть когда-нибудь плотно займусь её изучением. В описании было написано, что материал сложный, но интерес возобладал надо мной. Мне всё понятно в вашей статье, кроме тех моментов, что подразумевают входы и выходы LCD экрана, но это надо даташиты смотреть. Интересная статья, очень понравилась.
Отлично, может перейду для создания 3d игр, а то мне иногда кажется, что я не потяну такой обильный объем знаний, которые требуется для разработки 3d игр. Хотя, если взять готовый физический движок, и glm, и opengl, то думаю можно будет управиться, плюс вопросы на тематических форумах.
Так как я больше по времени делаю игры, то сделал для себя инструменты. Например Я могу перегнать obj 3d модельки или png картинку в raw формат, который грузиться прямо в opengl. На android есть библиотека zlib и поэтому я с помощью упаковщика ресурсов (своего) сжимаю снова эти файлы и получается маленький размер. У меня есть несколько типов ресурсов, и у каждого свой адрес, например, чтобы загрузить ресурс png текстуры, я пишу.
Да, в android возможно пользоваться готовыми библиотеками для создания игры на opengl es, и в Android Studio это делается удобней. Я тоже на сях писал игру для android, но только вместе с SDL2 для упрощения и скорости разработки.
А так, вы молодцы. Если будете работать в этом направление, то впереди создание потрясающих инструментов и написания интересных статей.
Если брать готовый, то я ничему не научусь, а хотелось бы научиться делать компиляторы и эмуляторы. Да и в моём случае всё сделано под игровой движок. Например, я каждому эмулятору могу дать сколько команд ему разрешено за раз обработать, и если приходит прерывание, то его обработать в движке игры, так как мы имеем полный доступ ко регистрам вымышленного процессора. Также я выбираю какие будут операторы процессора и какие прерывания процессор будет обрабатывать. Мне нравиться самому делать это если честно.
Блин, точно, можно же играть, подключаясь друг к другу. Вот это идея, я почему-то вообще о ней не думал. Спасибо. А api vkplay нет.
Я решил сделать публичными репы с эмулятором и компилятором. Это мои первое творение, так что на крутое качество кода не претендую. В Компиляторе пока только в ветке radio_attack поддерживается разработка, потом перенесу в master.
https://gitverse.ru/archinaragu/DOXY_EMU
https://gitverse.ru/archinaragu/DOXY_ASM
Я накопал один пробел в игре. А именно, игра подходит только как сетевая игра против других игроков. Я просто не смогу создать бота, который бы не уступал человеку, а всё из-за совершенных механик, которые прежде не применялись ни в одной игре. Я о перехвате данных сканером. Реальный человек может проанализировать данные и понять что делать, а бот такого не может. Он либо может интерпретировать данные как есть и сделать ошибку, либо застрять в постоянных вычислениях об истинности данных и как их интерпретировать. Даже если играть против такого бота, который интерпретирует данные как есть, то его можно будет легко обмануть и будет несовсем интересно играть. А игроков, желающих поиграть в эту игру всего 8 человек. Ещё проблема в том, как быть с игровым сервером, играть по локальной сети или через интернет. У меня бюджет небольшой и не знаю что делать насчет сетевой игры. Если сделать по локальной сети, то можно играть через vpn, но тогда проблема будет, если кто-то будет arp mitm атаку делать. Пока эти проблемы не понял как решить. А разработкой продолжаю заниматься.
Спасибо!
Спасибо за такой ценный совет. Да, игра будет поддерживать английский.
Перед реальной битвой можно будет потренироваться в режиме симуляции. В этом режиме мы как раз пишем код. Можно расставить врага в нужные клетки и отладить как наш код будет реагировать на обстановку. Всё делается в неспешном темпе. Да, можно добавить что-то вроде заготовок кода. В реальном бою мы уже следим за войной и обрабатываем перехваченные данные. В реальной битве можем поменять прошивку, либо сделать так, что последнее решение будет за нами, например командный центр может что-то обработать и послать оператору, то-есть нам, какой-то результат, а мы сможем выбрать что делать. Разумеется это будет всё кодироваться нами. Получается, что работа по кодированию всех юнитов не заканчивается. У врага могут быть зашифрованные передачи, нужно будет анализировать данные, эти данные будут храниться до поры до времени, пока следующий буфер не поступит в обработку. Но некоторые можно будет сохранить для анализа. Желание сделать интересный тактический бой выше, чем набрать 25000 вишлистов. Я понимаю, что в эту игру по началу, а может и вообще, будет играть человек 10. Но если она понравиться, и она будет гармонична для программиста, то это будет просто вау для меня. Я таких сложных проектов ещё не делал. Работать я не собираюсь, но игру как портфолию хочу иметь.
Документация точно будет. Также будут мои рекомендации по тому, что можно будет делать в играх.
Я даже понимаю, что обзор на такую игру будет трудно заиметь, так как игра не простая.
У меня очень много игр, и эта игра есть в том числе. Я играл в неё какое-то время. Из механик нравиться писать команды и пост эфект, делающий красивую картинку.
Спасибо на добром слове.
Всё, дополнил статью. Спасибо.
Ох ох ох. Теперь всё работает и конструктор и методы класса. Это просто замечательно. Не зря я статью выложил сюда. А то у меня остались знания об этом из давнешних времен, когда мне на форуме сказали, что через dlopen невозможно загружать классы, или я не понял просто чего-то тогда, но запомнилось. Я сейчас создал класс без знаний внутренностей. Только не понятно как размер класса получить настоящий, наверное только если реверсить.
А и вправду. Я сейчас для класса использовал внутренние названия функций для создания конструктора и смог создать класс. Тогда можно класс объявить вот так и всё будет норм. Только такой вариант сложен и кажется, что нам нужно для десятой функции в классе сильно заморочиться. Да это удобно, когда есть заголовок класса, но в ситуациях, когда нет заголовка, методы неудобно восстанавливать, то-есть чтобы сослаться на нужный метод в классе, надо считать какое смещение в библиотеке класса.
Вот вариант как работает с dlopen
Капец, я так поразмыслил. Я же знаю ассемблер и реверс знаю и знаю как передаются параметры и знаю, что первый параметр для функции класса передается сам класс. Если print у нас без параметров, то мы можем точно такую же функцию создать, только первый параметр будет класс. И это работает. В данном случае print это метод класса FM.
Ох, спасибо, что натолкнули меня на эти мысли. Это очень здорово.
Да, можете делать так. Я показываю свой метод, который отличается от вашего и дает больше свободы во времени, так как нам не нужно заполнять поля класса, а просто нужно выделить для него место.
Я привёл пример как можно проводить фаззинг библиотек, у которых нет заголовков, то-есть никаких определений. Вам стоит только написать уже логику построения неправильных данных. Мой пример показывает, что можно с помощью ассемблера соединить две библиотеки и использовать для фаззинга.
Тут объяснений много и не надо. С помощью radare2 открываем библиотеку и смотрим с помощью команды is. Не подумал, что на таком уровне сложности материала нужно было это прописать. Извиняюсь. Думаю, что можно дополнить эту команду. Так будет ясней.
Да, тут проблема думаю. Но вроде как можно попробовать несколько вариантов и дойти испытательным путем.
Ну вот есть в чужой библиотеке класс, который используется в библиотеке. Для пользователя не доступны эти заголовки, только программа и библиотека. Вот есть у класса много полей и методов. Как вы к примеру вызовете метод класса void operator++(int n)? Для C++ тут много трудностей возникает. Вам нужно правильно назвать все поля и их типы, указать все функции. А в ассемблере вам не нужно ничего этого делать. Вы просто выделяете память и всё. Ну или покажите пример, вопрос про operator++, как бы вы на C++ слинковали бы библиотеку DLL к примеру, если нет ни исходников, ни заголовков. Я такого способа не знаю, поэтому написал свой вариант.
Хм, интересно. А я думал, что такое можно делать только с сишными функциями. Спасибо за разьяснения. Но мне кажется, что это меня путает. Как я правильно помню, что c++ класс невозможно было через dlopen, dlsym создать. Если я правильно помню, то можно только char,int,void данные передавать через dlsym. Я же привёл специально пример, где невозможно отделить c++ класс от dlopen. В моем примере вы можете создать класс через библиотечную функцию или использовать функции класса библиотеки.
Или всё-таки можно через dlsym вызывать метод класса? Я специально такой пример привел, где есть такая сложность. Поправьте меня если я не прав в данном случае.