Что происходит, когда Вы запускаете программу?

Это от metasploit, который означает, что использует один из кодов оболочки metasploit. Это - открытый исходный код, таким образом, можно пойти и захватить его: http://www.metasploit.com/

38
задан 6 revs, 2 users 69% 21 August 2014 в 03:57
поделиться

5 ответов

Как только изображение загружается в память, магия берет верх.

1
ответ дан 27 November 2019 в 03:40
поделиться

Хорошо, отвечу на свой вопрос. Это будет происходить постепенно и только для Linux (и, возможно, Mach-O). Не стесняйтесь добавлять больше вещей к своим личным ответам, чтобы они получили одобрение (и вы можете получить значки, так как теперь это CW).

Я начну на полпути и построю остальное, когда узнаю. Этот документ был создан с помощью x86_64, gcc (GCC) 4.1.2.

Открытие файла, инициализация

В этом разделе мы описываем, что происходит при вызове программы, с точки зрения ядра, пока программа не будет готова к выполнению.

  1. ELF открывается.
  2. ядро ​​ищет раздел .text и загружает его в память. Помечает его как только для чтения
  3. ядро ​​загружает раздел .data
  4. ядро ​​загружает раздел .bss и инициализирует все содержимое нулем.
  5. ядро ​​передает управление динамическому компоновщику (имя которого находится внутри файл ELF в разделе .interp). Динамический компоновщик разрешает все вызовы совместно используемых библиотек.
  6. управление передается приложению

Выполнение программы

  1. вызывается функция _start, поскольку заголовок ELF определяет его как точку входа для исполняемого файла
  2. _start вызывает __libc_start_main в glibc (через PLT), передавая ему следующую информацию

    1. адрес фактической основной функции
    2. адрес argc
    3. адрес argv
    4. адрес подпрограммы _init
    5. адрес подпрограммы _fini
    6. указатель функции для регистрации atexit ()
    7. наивысший доступный адрес стека
  3. _init вызывается

    1. вызывает call_gmon_start для инициализации профилирования gmon. на самом деле не связано с выполнением.
    2. вызывает frame_dummy, который обертывает __register_frame_info (адрес раздела eh_frame, адрес раздела bss) (FIXME: что делает эта функция? очевидно, инициализирует глобальные переменные из раздела BSS)
    3. вызывает __do_global_ctors_aux, роль вызывает все глобальные конструкторы, перечисленные в. секция ctors.
  4. вызывается main
  5. main end
  6. вызывается _fini, который по очереди вызывает __do_global_dtors_aux для запуска всех деструкторов, как указано в разделе .dtors.
  7. программа завершается.
25
ответ дан 27 November 2019 в 03:40
поделиться

Конечно, это просто на очень высоком и абстрактном уровне!

Executable - No Shared Libary: 

Client request to run application
  ->Shell informs kernel to run binary
  ->Kernel allocates memory from the pool to fit the binary image into
  ->Kernel loads binary into memory
  ->Kernel jumps to specific memory address
  ->Kernel starts processing the machine code located at this location
  ->If machine code has stop
  ->Kernel releases memory back to pool

Executable - Shared Library

Client request to run application
  ->Shell informs kernel to run binary
  ->Kernel allocates memory from the pool to fit the binary image into
  ->Kernel loads binary into memory
  ->Kernel jumps to specific memory address
  ->Kernel starts processing the machine code located at this location
  ->Kernel pushes current location into an execution stack
  ->Kernel jumps out of current memory to a shared memory location
  ->Kernel executes code from this shared memory location
  ->Kernel pops back the last memory location and jumps to that address
  ->If machine code has stop
  ->Kernel releases memory back to pool

JavaScript/.NET/Perl/Python/PHP/Ruby (Interpretted Languages)

Client request to run application
  ->Shell informs kernel to run binary
  ->Kernel has a hook that recognises binary images needs a JIT
  ->Kernel calls JIT
  ->JIT loads the code and jumps to a specific address
  ->JIT reads the code and compiles the instruction into the 
    machine code that the interpretter is running on
  ->Interpretture passes machine code to the kernel
  ->kernel executes the required instruction
  ->JIT then increments the program counter
  ->If code has a stop
  ->Jit releases application from its memory pool

Как говорит routeNpingme, регистры устанавливаются внутри ЦП, и происходит волшебство!

Обновление: Да, я не могу говорите правильно сегодня!

34
ответ дан 27 November 2019 в 03:40
поделиться

Ну, в зависимости от вашего точного определение вы должны учитывать JIT-компиляторы для таких языков, как .Net и Java. Когда вы запускаете .Net "exe", который технически не является "исполняемым", JIT-компилятор вмешивается и компилирует его.

0
ответ дан 27 November 2019 в 03:40
поделиться

В Windows сначала изображение загружается в память. Ядро анализирует, какие библиотеки (читай «DLL») ему потребуются, и загружает их тоже.

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

Каждая процедура DllMain () каждой DLL затем выполняется одна за другой, от самой необходимой DLL до последней, как если бы зависимостей.

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

3
ответ дан 27 November 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: