Как вставить кусок бинарных данных (из файла/вручную) в код программы.
Например:
void foo()
{
for( int n = 0; n < m; n++ )
{
int k = n*m;
goto skip_bin;
begin_bin_data:
мои бинарные данные
skip_bin:
}
}
И получить в компайл тайме в какую то константу адрес начала этих данных т.е. с метки begin_bin_data:
Только не советуйте завести массив char-ов это не то что мне нужно.
Мне нужно вставить бинарные данные именно в тело функции.
Есть идея на препроцессоре забить между _asm { кучу nop-ов } потом написать утилиту обрабатывающую экзешник.
Но хотелось бы добиться это средствами языка, без хаков тем более этот код должен компилится под разными компиляторами.
Здравствуйте, nen777w, Вы писали:
N>Есть идея на препроцессоре забить между _asm { кучу nop-ов } потом написать утилиту обрабатывающую экзешник. N>Но хотелось бы добиться это средствами языка, без хаков тем более этот код должен компилится под разными компиляторами.
Чистый C? Можно попробовать так (если данные на стеке):
void foo()
{
for( int n = 0; n < m; n++ )
{
int k = n*m;
void *start, *end;
goto skip_bin;
begin_bin_data:
{
int marker=1;
start=▮
}
мои бинарные данные
{
int marker=1;
end=▮
}
skip_bin:
}
}
спасибо, но на стеке не подходит.
По сути хочется спрятать исполняемый код виртуальной машины внутри реального кода.
Что бы при дизассемблировании это выглядело как нормальный asm код, который по сути белеберда
И в то же время надо где то хранить адрес начала этого бинарного кода что бы виртуальная машинка могла его выполнить.
Ну и опять повторюсь не хотелось бы делать внешние утилиты а добиться этого сразу при компиляции.
Здравствуйте, nen777w, Вы писали:
N>По сути хочется спрятать исполняемый код виртуальной машины внутри реального кода. N>Что бы при дизассемблировании это выглядело как нормальный asm код, который по сути белеберда
Если у тебя в основном коде нет jmp в этот кусок то нормальные дизассемблеры его выделят как кусок данных и дизасмить не станут.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Заменить "мои бинарные данные" на #include "my_binary_data.h", и внешней утилитой создавать из бинарных данных этот "my_binary_data.h", содержащий байты сконверченные в текст. Например в такой:
#define DB(x) __asm _emit x;
DB(0x12);
DB(0x34);
DB(0x56);
#undef DB
Это для VC. Для GCC нужно поменять определение DB(x). Ну или лучше сделать без макроса, а чтобы утилита сразу фигачила правильные команды для нужного компилятора.
CC>Если у тебя в основном коде нет jmp в этот кусок то нормальные дизассемблеры его выделят как кусок данных и дизасмить не станут.
Угу, поэтому jmp нужно сделать условным, и подобрать неочевидное условие, которое будет всегда вызывать переход. А вычисление адреса перехода опять же сделать на основе математики. Хотя тут конечно лучше шифровать байт-код, чтобы его границы сложно было выделить в исполняемом коде на глаз.
Кстати, можно было бы сделать виртуальную машину, которая выполняет подмножество команд x86, но делает это неожиданным способом. Простейший пример: сложение вместо умножения, умножение вместо деления и т.п. Или такое уже есть?
sch>Пишешь небольшой скрипт, который берёт данные и дампит в виде sch>db байт1 байт2 байт3 ... байт N
угу, осталось объяснить компилятору, что же такое "db"
З.Ы.
Кстати говоря о дизассемблерах.
Пробовал дизасемблировать код под IDA как и ожидалось бинарный код выглядит как нормальный asm код.
А вот OllyDbg меня честно говоря удивил, он тупо начинат сбоить
output.obj :
The name of the object file to be created
label :
A label name presenting the embedded binary data to the linker
Notice that the label should be prefixed with an underscore depending
on the external label naming convention of your development tools.
В итоге имеем obj — файл с публичным символом label. Остается в С написать нечто вроде
extern void* pBitmap
и получить доступ к этим данным. Есть пример, но на асме.
Аналогичная программа bin2obj
N>Но хотелось бы добиться это средствами языка, без хаков тем более этот код должен компилится под разными компиляторами.
Спасибо интересно, но я уже утилиту написал которая файл в хидер преобразовывает
(имеется ввиду хидер с макросами как std.denis советовал)
Кстати возник вопрос номер два Пока до документации сам не добрался, только вечером смогу.
Во общем есть чудесная функция для Win32, VirtualProtect() позволяющая установить атрибуты чтения/записи и т.п. для блока памяти.
Нужна такая же только для MacOSX. Опять же повторюсь к доке X-Code пока не добрался, только вечером смогу.