Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Чужой код.


Автор: try_to_get 15.8.2007, 16:39
Код

.386
.model flat, stdcall
option casemap:none

pushz macro szText:VARARG
    **********
    ********
    ********
nexti:
endm

includelib C:\masm32\lib\kernel32.lib

ExitProcess PROTO :DWORD

.data
    db 0
.code
    invoke ExitProcess, 0
start:

include inc\****_****.inc

include inc\****_****.inc

include inc\****.inc

end start



После директивы .code вызывается процедура ExitProcess, по идеи программа должна завершиться, и прекратить работу, но после, подключаются части кода программы и программа продолжает работать. 
Почему автор решил в начале завершить программу, какой смысл в этом? 
Или я не так понял?! 

Автор: Severyanin 16.8.2007, 08:26
Скорее всего, разгадка кроется в тех модулях, которые подключаются потом. Не могли бы вы их код тоже выложить. А то интересно smile 

Автор: ksili 16.8.2007, 08:42
А то, что ExitProcess расположен до метки start, ничего? На него точно управление приходит? (я вообще-то в этом не рублю)

Автор: try_to_get 16.8.2007, 09:01
Severyanin  А тему не закроют?

Добавлено через 11 минут и 39 секунд
Вот, вот нашел

Цитата

Что же касается вызова функции ExitProcess, то здесь проблема кроется в системах старше Windows XP (Win9x\Me\NT\2000). При попытке запустить код без такого вызова программа попросту не запускалась в перечисленных системах. Причем молча. Скорее всего, это связано с тем, что в данных системах загрузчик не хочет загружать программы без секций импорта.


Но все равно не понятно?!  smile

Добавлено через 13 минут и 50 секунд
Кто поможет, получит плюсики.  smile 

Автор: MAKCim 16.8.2007, 10:17
Цитата(try_to_get @  16.8.2007,  09:01 Найти цитируемый пост)
Но все равно не понятно?!

ну судя по цитате
где-то в коде должен быть вызов ExitProcess()
а т. к он (вызов) по сути нужен только фиктивно, поэтому мы помещаем его в такое место, откуда он не может быть сделан, т. е до start

Автор: Severyanin 16.8.2007, 10:19
А я думаю, что этот вызов был нужен для корректного завершения потока, вызвавшего даную программу. Сначала закрываем его, а потом - переходим на основной цикл. Я так думаю smile (Мимино smile )

Автор: ksili 16.8.2007, 10:29
По-моему, MAKCim, прав. ExitProcess'у же вроде должен быть передан хэндл процесса. А там ноль. Так что она я думаю не вызывается, а находится там фиктивно.

Автор: Severyanin 16.8.2007, 10:33
Нет, это не хэндл, а признак успешного завершения. Первым аргументом ему передается код ошибки

Автор: try_to_get 16.8.2007, 11:01
Цитата

где-то в коде должен быть вызов ExitProcess()

Да, есть.

Все я понял, загрузчик не мог найти правильного выхода в программе ret или тот же ExitProcess, и ExitProcess был помещен в .code, но только не понятно почему процессор не завершает программу или код работает только в метке start: .... end start

А сам выход осуществляется очень интересным способом:

значит в данных есть 

dd 0D66358ECh ; ExitProcess Таблица хешей пока точно не разбирался в этом.

дальше 

есть переменная  _ExitProcess        equ dword ptr [ebp-4*12]

автор не хотел давать знать что он использует kernel32? тому кто будет дизасемб. его прогу

Поправите меня если я ошибся...  smile




Автор: Severyanin 16.8.2007, 11:20
Цитата

код работает только в метке start: .... end start

Да. Это то же самое. что main{}.
Цитата

значит в данных есть 

dd 0D66358ECh ; ExitProcess

Это дамп вызова этой самой ExitProcess без ошибки.

Автор: try_to_get 16.8.2007, 15:42
Как и обещал

MAKCim      +1
Severyanin +1
ksili             +1

Автор: Severyanin 17.8.2007, 13:02
Спасибо smile 

Автор: ksili 17.8.2007, 13:04
Ух-ты! и мне чо ли?
Вот Severyanin реально заслужил

Автор: try_to_get 17.8.2007, 18:10
Цитата

Ух-ты! и мне чо ли?
 могу отнять 1.
Отнять?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)