Pull to refresh
14
7.5
Дмитрий @xverizex

Разработчик

Send message

А можете пожалуйста рассказать характеристики цифровых элементов, какой экран, какой проц, я нашел только attiny10-tshr, чтобы я мог сделать эмулятор и попробовать сделать тетрис с палкой? Там же наверняка микроконтроллер простой? Я тоже хочу сделать тетрис, но пока слаб в электронике, но очень это интересует. Хотя, нужно ещё знать байткод языка, не знаю даже, есть ли такая информация.

У вас фото в статье не грузятся.

Я можно сказать, что не разбираюсь в электронике, но меня она интересует. Может быть когда-нибудь плотно займусь её изучением. В описании было написано, что материал сложный, но интерес возобладал надо мной. Мне всё понятно в вашей статье, кроме тех моментов, что подразумевают входы и выходы LCD экрана, но это надо даташиты смотреть. Интересная статья, очень понравилась.

Отлично, может перейду для создания 3d игр, а то мне иногда кажется, что я не потяну такой обильный объем знаний, которые требуется для разработки 3d игр. Хотя, если взять готовый физический движок, и glm, и opengl, то думаю можно будет управиться, плюс вопросы на тематических форумах.

Так как я больше по времени делаю игры, то сделал для себя инструменты. Например Я могу перегнать obj 3d модельки или png картинку в raw формат, который грузиться прямо в opengl. На android есть библиотека zlib и поэтому я с помощью упаковщика ресурсов (своего) сжимаю снова эти файлы и получается маленький размер. У меня есть несколько типов ресурсов, и у каждого свой адрес, например, чтобы загрузить ресурс png текстуры, я пишу.

Resource *res = resource_manager_get (RES_SPRITES, SCANNER_TEXTURE);

Да, в 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 невозможно загружать классы, или я не понял просто чего-то тогда, но запомнилось. Я сейчас создал класс без знаний внутренностей. Только не понятно как размер класса получить настоящий, наверное только если реверсить.

#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.

#include "libfm.h"
#include <dlfcn.h>

int main (int argc, char **argv)
{
        void *handle = dlopen ("libfm.so", RTLD_NOW);

        FM *fm = (FM *) dlsym (handle, "_ZN2FMC2Ev");

        void (*print)(FM *) = (void (*)(FM *)) dlsym (handle, "_ZN2FM5printEv");

        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 вызывать метод класса? Я специально такой пример привел, где есть такая сложность. Поправьте меня если я не прав в данном случае.

1
23 ...

Information

Rating
732-nd
Location
Россия
Date of birth
Registered
Activity