перекомпоновка шестнадцатеричного кода и запуск на другом компьютере - PullRequest
0 голосов
/ 04 сентября 2011

если бы я мог получить шестнадцатеричный код функции на одной машине, как бы я связал ее и выполнил на другой машине, т. Е. Если бы я получил шестнадцатеричный код функции от дизассемблера и функцию под названием Windows API

void newfunc()
{
   call some_API;
}

для работы на другой машине, я должен был бы повторно связать его, чтобы вызвать адрес API этой машины.учитывая, что машина запускает окна с той же аппаратной архитектурой.

ps: в отношении программирования распределенных систем

более подробное объяснение: таким образом, у меня есть шестнадцатеричный код newfunc (), который включает сборку вызоваsome_API на машине A ... я хочу запустить этот гекс в аналогичной архитектуре и ОС, но на другой машине B, поэтому мне пришлось бы перекомпоновать его так, чтобы вызов some_API перешел на some_API конечной машины B ... как бы я это сделалтот?спасибо заранее

1 Ответ

1 голос
/ 04 сентября 2011

Чтобы сделать то, что вы описали в Windows, потребуется дублирование функциональности PE Loader.

В Windows обычно происходит следующее:

call [some_API_addr]    ; uses in-program data

в разделе RDATA PE:

 some_API_addr:   dd  0     ; filled in by the Loader with the address in the DLL 

Вы не можете просто скопировать текст и RDATA, потому чтоБиблиотеки DLL могут быть загружены в разных местах благодаря ASLR (рандомизации разметки адресного пространства), который призван предотвратить то, что вы пытаетесь сделать:

Предполагая, что у вас был хороший способ идентифицировать все данные, которые нужны вашей функции (что может быть непросто), вы можете избежать этой проблемы с DLL, перейдя непосредственно к интерфейсу «syscall» Windows.
Например, см .: http://www.nynaeve.net/?p=48 и http://www.symantec.com/connect/articles/windows-syscall-shellcode будут служить отправными точками,Обратите внимание на предостережения во второй статье, что интерфейс системных вызовов изменяется между версиями ОС!Предполагая, что ваша распределенная система похожа, у вас все будет в порядке.

Типичное решение проблемы упаковки кода для удаленного выполнения - поместить код в DLL.
Затем, когда DLL загруженана каждой машине (например, LoadLibrary) загрузчик PE установит правильные адреса.

...