Операционные коды сборки одинаковы, поэтому обычные приемы для создания нулевых шелл-кодов по-прежнему применяются, но способ выполнения системных вызовов отличается.
В Linux вы выполняете системные вызовы с помощью «int 0x80»инструкции, в то время как в Windows вы должны использовать библиотеки DLL и выполнять обычные пользовательские вызовы их экспортируемых функций.
По этой причине в Windows ваш шелл-код должен:
- Жесткий код Win32 APIадреса функций (скорее всего, будут работать только на вашем компьютере)
- Использовать шелл-код распознавателя Win32 API (работает на всех версиях Windows)
Если вы только учитесь, сейчас этовероятно, проще просто жестко закодировать адреса, которые вы видите в отладчике.Чтобы сделать положение вызовов независимым, вы можете загрузить адреса в регистры.Например, вызов функции с 4 аргументами:
PUSH 4 ; argument #4 to the function
PUSH 3 ; argument #3 to the function
PUSH 2 ; argument #2 to the function
PUSH 1 ; argument #1 to the function
MOV EAX, 0xDEADBEEF ; put the address of the function to call
CALL EAX
Обратите внимание, что аргумент передается в обратном порядке.После инструкции CALL EAX содержит возвращаемое значение, и стек будет таким же, каким он был раньше (то есть функция выдает свои собственные аргументы).Регистры ECX и EDX могут содержать мусор, поэтому не полагайтесь на то, что они сохраняют свои значения после вызова.
Прямая инструкция CALL не будет работать, поскольку они зависят от позиции.
Чтобы избежать нулей в самом адресе, попробуйте любой из пустых трюков для шеллкода x86, их много, но мой любимый (пусть и длинный) кодирование значений с помощью инструкций XOR:
MOV EAX, 0xDEADBEEF ^ 0xFFFFFFFF ; your value xor'ed against an arbitrary mask
XOR EAX, 0xFFFFFFFF ; the arbitrary mask
Вы можететакже попробуйте NEG EAX или NOT EAX (инверсия знаков и переворачивание битов), чтобы увидеть, работают ли они, это намного дешевле (два байта каждый).
Вы можете получить помощь по различным функциям API, которые вы можете вызвать здесь: http://msdn.microsoft.com
Вероятно, вам понадобятся самые важные из них:
Первый запускает команду, следующие два предназначены для загрузки файлов DLL и получения адресов ее функций.
Вот полный учебник по написанию Winшелл-коды dows: http://www.codeproject.com/Articles/325776/The-Art-of-Win32-Shellcoding