Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2011, 18:12   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию ошибка с адресом возврата

Добрый день. Пишу программу, вызывающуюся пользователем из контекстного меню. То есть, пользователь щёлкает по экзешнику правой кнопкой мыши и вызывает специальную утилиту, которая смотрит, РЕ это или нет. Вопрос собственно в чём. программа постоянно выдаёт ошибку.
То вот в этом месте:

push DD_hFile_Mapping
call CloseHandle
как-то криво выполняется.
А если эти строчки убрать, то ret криво работает. Точнее его работа приводит к ошибке.
Так как файл достаточно большой, кинул на залил.ру
http://zalil.ru/31714961
подскажите, пожалуйста, что здесь не так, потому что в отладчике я так и не разобрался в чём косяк. Заранее спасибо.
Dimarik вне форума Ответить с цитированием
Старый 17.09.2011, 18:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
CloseHandle
А она после себя стек чистит? Посмотри в отладчике каково состояние стека после этого вызова.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.09.2011, 18:36   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Да с этим CloseHandle вообще как-то непонятно. Вызываю CloseHandle,а затем куда-то перепрыгивает выполнение программы. Хотя написано ERROR_SUCCESS. (там же первоначально писал 2 раза CloseHandle)

Что самое интересное, это то, что вершина стека 0012FF32.
А указатель на то куда выходить из функции находится в 0012FF34.
я несколько раз проверял, что тут не так. Всё сдвинулось после того как я написал
PUSH AX
Но я ведь потом написал POP AX!!!!
Dimarik вне форума Ответить с цитированием
Старый 17.09.2011, 18:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Но я ведь потом написал POP AX!!!!
Ану покаж.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.09.2011, 20:16   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
push AX;
	invoke wsprintf, offset TEMPORARY________, offset strForFormat, AX;переводим в строку
	invoke lstrcat, offset str__________NomberOfSections, offset TEMPORARY________;

		add EDI, sizeOf IMAGE_NT_HEADERS
	assume EDI:ptr IMAGE_SECTION_HEADER
	pop AX
весь код полностью тут
http://zalil.ru/31714961
Но мне кажется что имеется 2 ошибки: что-то не так со стеком и что-то с CloseHandle. Только ни по поводу одной ни по поводу другой понять до конца не могу.

Код:
push map_____File
	call UnmapViewOfFile 
	
	push map_____File
	call CloseHandle
вот этот CloseHandle в отладчике криво выполняется.

Последний раз редактировалось Stilet; 18.09.2011 в 12:26.
Dimarik вне форума Ответить с цитированием
Старый 17.09.2011, 20:50   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

wsprintf dword принимает в качестве параметра, ax - word.
После pop в старшей части eax что будет?

Последний раз редактировалось vadimych; 17.09.2011 в 20:54.
vadimych вне форума Ответить с цитированием
Старый 17.09.2011, 20:56   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

СПАСИБО ОГРОМНОЕ!А я то думаю, что за косяк тут!
Таак. Вот это где ошибка! А почему тогда компилятор не ругнулся?
И ещё вопрос. когда подобные действия проходили в С++, всё ништяк было. Как тогда С++ пообную ситуацию обрабатывал?
Теперь понятно, почему сместился указатель стека.
А что вы думаете по поводу Этого CloseHandle, находящегося на 309 строке файла который я выслал.
Код:
push map_____File
	call UnmapViewOfFile 
	
	push map_____File
	call CloseHandle
Со стеком понятно, из-за кривого вызова wsprintf всё нарушилось,, а с этим как?

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
что-то я не нашёл чтобы тут написано что WORD нельзя пихать, а только DWORd O_o


Цитата:
... [in]
One or more optional arguments. The number and type of argument parameters depend on the corresponding format-control specifications in the lpFmt parameter.

Последний раз редактировалось Stilet; 18.09.2011 в 12:27.
Dimarik вне форума Ответить с цитированием
Старый 18.09.2011, 12:30   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
А почему тогда компилятор не ругнулся?
Да потому что он не думал что ты именно так будешь использовать. Это же ассемблер - тут многое позволено, чего нельзя в ЯВУ делать.
Цитата:
Как тогда С++ пообную ситуацию обрабатывал?
Опиши прогу в Си, и посмотри в отладчике. Компилятор Си поумнее, он знает после какой функции какой мусор остается и как его убирать - все это описано в его многочисленных библиотеках и хеадерах. Для ЯВУ это нормально, для ассемблера по боку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
адрес возврата n3sh Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.04.2011 21:19
Проблема с адресом сайта Приклад PHP 5 11.09.2010 18:06
помогите с адресом пожалуйста rudolfe Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 07.03.2009 13:19
Проблема с адресом файла Геля Общие вопросы Delphi 8 20.04.2007 20:48
Помогите с IP-адресом! gluk666 Работа с сетью в Delphi 1 25.02.2007 09:28