Войти
ФлеймФорумПрограммирование

safe_program_api (2 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2
#15
2:32, 6 янв. 2016

т.к мне влом ждать несколько лет выпуска WebAssembly, то решил ...

сделал минимальную экспериментальную версию i_safe_api

typedef char*ptr_t;
struct t_mem{ptr_t ptr;size_t size;};
struct t_buff{t_mem mem; ptrdiff_t offset; size_t size;};

struct i_safe_api{
  virtual void init(t_mem&)=0;
  virtual void free(t_mem&)=0;
  virtual size_t recv_buff(t_buff&to)=0;
  virtual size_t send_buff(t_buff&from)=0;
};


как это API использует hello_world-прога:

extern "C" __declspec(dllexport) void our_proc(i_safe_api&env){
  const char msg[]="Hello, world!";
  size_t len=strlen(msg);
  t_buff buff={{nullptr,len},0,len};
  env.init(buff.mem);
  strcpy(buff.mem,msg);
  env.send_buff(buff);
  env.free(buff.mem);
}

скетч реализации API:

struct t_safe_api:public i_safe_api{...};

int main(){
  auto str=file_get_contents("proga.dll");
  t_bytecode code;
  code.load(str);
  t_safe_api env;
  t_virtual_machine vm;
  vm.interpretate(env,code,"our_proc");
  printf("%s\n",env.recv_buff_as_str().c_str());
  return 0;
}
сделать нормальный пример, где скетч реализации API будет прикручена к простому граф.движку?

наверно такой проект можно только сообща делать, т.к если кто-то всё сделает в одиночку, то тогда никакого доверия к системе и её безопасности не будет.
поэтому го вместе: кодить/проверять/доказывать_надёжность/продвигать/обсуждать. короче нужна поддержка.
я первый шаг сделал, вот.

спасибо за внимание.


#16
14:38, 6 янв. 2016
Изображение
#17
20:30, 7 янв. 2016

идея плана как делать реализацию api:
1) берем либу читалку/писалку PE файлов: pe_bliss
2) в проекте реализущем api пишем код используя pe_bliss: проверить чтобы у загружаемой проги небыло зависимостей, а в exports был адрес функции "our_func".
3) выдрать весь машинный код проги из образа и сохранить его в std::string.
4) выдрать все константы и сохранить их в ещё один std::string.
5) передать управление коду из пункта (3) и убедиться что он не будет работать.
6) ???
7) передать управление коду из пункта (3) модифицировоному алгоритмом из пункта (6) и убедиться что он будет работать.
8) найти или написать урезанный интерпретатор x86 кода.
9) ...

#18
21:05, 7 янв. 2016

Все очень плохо, но удачи, да

#19
21:55, 7 янв. 2016

Adler
По теореме об останове, для произвольного кода невозможно определить, остановится он когда-нибудь или нет. Соответственно узнать будет ли он когда-нибудь делать что-то некорректное или не будет - тоже невозможно. Поэтому план один раз "интерпретировать" и убедиться что код в порядке а потом запускать без ограничений не сработает. А если интерпретировать непрерывно то не будет никакого выигрыша в производительности.

Ну т.е. допустим в safe_api пришел код: "искать контрпример к теореме Ферма, если найдем - обратиться к массиву по индексу первого числа контрпримера (точнее младшим 32 битам этого числа, например)". Это считанные несколько байт, ну ок, килобайт кода, а проверить мы их не можем (считая что мы не знаем что теорему Ферма уже доказали), что будет делать в этом случае safe_api?

Страницы: 1 2
ФлеймФорумПрограммирование

Тема в архиве.