Передо мной стоит задача, нужно склеить два файла в один не прибегая к использованию стороннего ПО по типу архиваторов, упаковщиков, инсталлеров и прочего. В руках может быть только HeX Editor и, судя по всему, святая вода.
Давайте с самого начала. В первую очередь создадим два разных файла
1)
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main()
{
cout << "Hello, World!" << endl;
int i;
cin >> i;
return 0;
}
2)
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main()
{
cout << "Evil Hello World" << endl;
int i;
cin >> i;
return 0;
}
После компиляции мы сразу же забываем о существовании сорс кода и работаем только со скомпилированными версиями файлов. Возвращаясь к сути вопроса, как склеить два файла в один? Из идей были следующие варианты:
1)
Просто скопировать байты второй программы и записать их в первую программу перезаписывая при этом нулевые байты которое находятся в самом конце (идея плохая ведь программа не найдет инструкций на дальнейшее выполнение и просто завершиться)
2)
Сделать тоже самое что в первом пункте НО при этом прочитать AddressOfEntryPoint второй программы и добавить инструкцию на ее выполнение
B8 00 10 40 00 00 00 00 00 ; mov rax, ImageBase + AddressOfEntryPoint (0000000140001550)
FF D0 ; call rax
Но появляется несколько вопросов
I
Где конкретно должна располагаться такая инструкция
II
Что если две программы имею одинаковый AddressOfEntryPoint
Если кто-то сталкивался с подобной задачей или просто имеет большой опыт, то буду рад любой помощи и критике (даже камнями кидаться можете, ведь я не позиционирую себя как гуру программист, а лишь любитель)