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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2009, 19:04   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
Печаль Проблема с выделенной памятью

Код:
.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   include masm32.inc
   includelib masm32.lib
   includelib user32.lib
   includelib kernel32.lib
   dwtoa proto :DWORD,:DWORD
.data
fAddr DD 0
fLen DD 0
.data?
hBuff0 HANDLE ?
hBuff1 HANDLE ?
pBuff0 DWORD ?
pBuff1 DWORD ?
hProcess HANDLE ?
mbi MEMORY_BASIC_INFORMATION <>
.code
start:
INVOKE GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT,512
MOV hBuff0,EAX
INVOKE GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT,1024
MOV hBuff1,EAX

INVOKE GlobalLock,hBuff0
MOV pBuff0,EAX
INVOKE GlobalLock,hBuff1
MOV pBuff1,EAX


MOV EAX,OFFSET Func
MOV fAddr,EAX
MOV EBX,OFFSET FuncEND
SUB EBX,EAX
MOV fLen,EBX
INVOKE GetCurrentProcess
MOV hProcess,EAX
INVOKE ReadProcessMemory,hProcess,fAddr,pBuff0,fLen,0


XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
.WHILE ECX<512
	PUSHAD
	XOR EAX,EAX
	
	MOV AH,BYTE PTR[pBuff0+ECX]
	SHR AH,4
	.IF AH<10
		ADD AH,30h
	.ELSEIF AH>9
		ADD AH,37h
	.ENDIF
	MOV BYTE PTR[pBuff1+EBX],AH
	
	MOV AH,BYTE PTR[pBuff0+ECX]
	AND AH,00001111b
	.IF AH<10
		ADD AH,30h
	.ELSEIF AH>9
		ADD AH,37h
	.ENDIF
	MOV BYTE PTR[pBuff1+EBX+1],AH
	
	POPAD
 	INC EBX
 	INC EBX
	INC ECX
.ENDW
INVOKE GlobalUnlock,addr hBuff1
INVOKE MessageBox,0,ADDR pBuff1,0,0
INVOKE ExitProcess,0

Func PROC 
	RET
	DB 511 DUP(0)
Func ENDP
FuncEND:
end start
А вот результат выполнения:



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

Дополнительно дам свою конфигурацию:
Intel Core 2 E8200 2.66 @ 3.6 Ghz
Corsair XMS2 800Mhz 5-5-5-18 @900 5-5-5-15
Gigabyte GA-P35 DS3
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 17.02.2009, 19:49   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

первое что хочется сказать функции GlobalAlloc и LocalAlloc остались в Win32 остались только из соображений совместимости. Поэтому лучше юзать VirtualAlloc (или HeapAlloc, если идёт работа с маленькими кусками памяти).

во-вторых, что вообще надо сделать?

в-третьих,
Код:
MOV EAX,OFFSET Func
MOV fAddr,EAX
MOV EBX,OFFSET FuncEND
SUB EBX,EAX
MOV fLen,EBX
INVOKE GetCurrentProcess
MOV hProcess,EAX
INVOKE ReadProcessMemory,hProcess,fAddr,pBuff0,fLen,0
что это ещё за изврат?

но лучше всего ответить на вопрос: что вообще нужно сделать?

Последний раз редактировалось rpy3uH; 17.02.2009 в 19:53.
rpy3uH вне форума Ответить с цитированием
Старый 17.02.2009, 20:49   #3
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Это самый простой пример СМК должен быть. Нужно считать во внутреннее хранилище функцию, потом ее перевести в 16 -ричный текст(как в hex-редакторах) и вывести в MessageBox-е. Проблема в том что хоть в память что то записывается, но там какая то гадость, посмотрите на то что выдает MSGBOX. Там ведь должен быть C3 и 511 00.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 17.02.2009, 21:13   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

тебе надо так
Код:
pbuff dd 0
faddr dd 0

invoke GetProcessHeap
invoke HeapAlloc, eax, 0, <размер> 
mov [pbuff], eax 
; непомешает обнулить буфер

mov eax, offset Func
mov [faddr], eax

;преобразование буфера в строку

invoke MessageBox,0,offset pbuff,offset caption,0

Func PROC 
	RET
	DB 511 DUP(0)
Func ENDP
rpy3uH вне форума Ответить с цитированием
Старый 18.02.2009, 08:18   #5
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

и просто как совет, если Вы и так находитесь в контексте нужного процесса то лучше не использовать ReadProcessMemory чисто исходя из производительности. Лучше сразу читать по адресу в нужных местах используя VirtualProtect
Д'якон вне форума Ответить с цитированием
Старый 21.02.2009, 04:58   #6
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Чудеса в решете... Просмотрел всю процедуру перевода из 16-ричных цифр в текст отладчиком и увидел такой ужас, оказывается в pBuff0 изначально лежат вместо нулей, 33 и 34, почему -непонятно. Дальше больше. Выделение памяти разными способами ни к чему не привело - все неизменно. Сначала подумал что функция ReadProcessMemory, во время выполнения меня для памяти права доступа, закомментировал ее - толку никакого, всё те же 33 и 34 остались. Теперь у меня вопрос. Можно ли как то в OllyDBG посмотреть содержимое сегментных регистров?(Вернее той памяти дескрипторы на которую в них лежат) Если я правильно понимаю - все сегментные регистры адресуют одно и тоже адресное пространство? Да кстати, если записать содержимое pBuff0 до процедуры перевода и до записи в нее, дампа функции(напомню я записываю именно функцию Func, то в файле окажутся нули. Но это полбеды -после процедуры в файл ничего не записывается, больше того при записи данных из pBuff0 до записи в него дампа функции, программа падает, но данные всё таки в файл записываются.
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 21.02.2009 в 05:01.
Ivan_32 вне форума Ответить с цитированием
Старый 21.02.2009, 08:22   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Сначала подумал что функция ReadProcessMemory, во время выполнения меня для памяти права доступа, закомментировал ее - толку никакого, всё те же 33 и 34 остались.
функцию ReadProcessMemory вообще не надо юзать

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Можно ли как то в OllyDBG посмотреть содержимое сегментных регистров?(Вернее той памяти дескрипторы на которую в них лежат) Если я правильно понимаю - все сегментные регистры адресуют одно и тоже адресное пространство?
кнопка "М" на панели инструментов
rpy3uH вне форума Ответить с цитированием
Старый 23.02.2009, 01:22   #8
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   include masm32.inc
   include gdi32.inc
   includelib gdi32.lib
   includelib masm32.lib
   includelib user32.lib
   includelib kernel32.lib
   dwtoa proto :DWORD,:DWORD
.data
fBuff db 1024 dup(0)
fAddr DD 0
fLen DD 0
fName0 db "D:\Fin0.bin",0
fName1 db "D:\Fin1.bin",0
.data?
ofs0 OFSTRUCT <>
ofs1 OFSTRUCT <>
hFile0 HFILE ?
hFile1 HFILE ?
hBuff0 HANDLE ?
hBuff1 HANDLE ?
pBuff0 DWORD ?
pBuff1 DWORD ?
hProcess HANDLE ?
mbi MEMORY_BASIC_INFORMATION <>
.code
start:
;INVOKE GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT,512
;MOV hBuff0,EAX
;INVOKE GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT,1024
;MOV hBuff1,EAX

;INVOKE GlobalLock,hBuff0
;MOV pBuff0,EAX
;INVOKE GlobalLock,hBuff1
;MOV pBuff1,EAX
mov eax,0
invoke VirtualAlloc,0,1024,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE
MOV pBuff1,EAX

MOV EAX,OFFSET Func
MOV fAddr,EAX
MOV EBX,OFFSET FuncEND
SUB EBX,EAX
MOV fLen,EBX
INVOKE GetCurrentProcess
MOV hProcess,EAX

invoke VirtualAlloc,0,512,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE
MOV pBuff0,EAX
INVOKE OpenFile,addr fName0,addr ofs0,OF_CREATE or OF_READWRITE
mov hFile0,eax
;invoke WriteFile,hFile0,pBuff0,511,0,0

INVOKE ReadProcessMemory,hProcess,fAddr,pBuff0,512,0
INVOKE VirtualProtect,pBuff0,512,PAGE_READONLY,PAGE_READWRITE
invoke WriteFile,hFile0,pBuff0,511,0,0
invoke CloseHandle,hFile0
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
.WHILE ECX<512
	PUSHAD
	XOR EAX,EAX
	
	MOV AH,BYTE PTR[pBuff0+ECX]
	SHR AH,4
	.IF AH<10
		ADD AH,30h
	.ELSEIF AH>9
		ADD AH,37h
	.ENDIF
	MOV BYTE PTR[pBuff1+EBX],AH
	
	MOV AH,BYTE PTR[pBuff0+ECX]
	AND AH,00001111b
	.IF AH<10
		ADD AH,30h
	.ELSEIF AH>9
		ADD AH,37h
	.ENDIF
	MOV BYTE PTR[pBuff1+EBX+1],AH
	MOV AH,BYTE PTR[pBuff0+ECX]
	.IF AH==0C3h
		invoke MessageBox,0,0,0,0
	.ENDIF
	POPAD
 	INC EBX
 	INC EBX
	INC ECX
	PUSH DWORD PTR[pBuff1+ebx]
.ENDW
xor ecx,ecx
mov ecx,1024
.WHILE ecx<1024
pop eax
mov dword ptr[fBuff+ecx],eax
sub ecx,4
.ENDW
invoke MessageBox,0,addr pBuff1,0,0
;INVOKE MessageBox,0,pBuff1,0,0
;INVOKE OpenFile,addr fName0,addr ofs0,OF_CREATE or OF_READWRITE
;mov hFile0,eax
INVOKE OpenFile,addr fName1,addr ofs1,OF_CREATE or OF_READWRITE
mov hFile1,eax
;invoke WriteFile,hFile0,pBuff0,511,0,0
invoke WriteFile,hFile1,pBuff1,1023,0,0
INVOKE ExitProcess,0

Func PROC 
	RET
	DB 511 DUP(0)
Func ENDP
FuncEND:
end start
Намеренно привожу полный код, что б ничего не упустить.
Получается так: в файле на который открыт хендл hFile0 ( в него записывается дамп функции) содержится именно то что надо. Следовательно получается что эти самые 33 и 34 записываются, прямо во время выполнения функции перевода, но это не так - я прогонял отладчиком версию без записи функции в файл и там ясно было видно что в pBuff0 лежат эти самые 33 и 34. Короче мистика. Но вот в чем проблема, после функции записи в файл тоесть буквально после этой строки:
invoke WriteFile,hFile0,pBuff0,511,0,0
программа падает. Вот мне бы хотелось выяснить что является причиной. Пожалуйста скомпилируйте это программу у себя, тут весь исходник есть и посмотрите как она будет вести себя у вас. Заранее благодарен. Вот еще на всякий случай данные о падении программы:
Код:
Сигнатура проблемы:
  Имя события проблемы:	APPCRASH
  Имя приложения:	FFF0.exe
  Версия приложения:	0.0.0.0
  Штамп времени приложения:	49a1cfdf
  Имя модуля с ошибкой:	kernel32.dll
  Версия модуля с ошибкой:	6.0.6001.18000
  Штамп времени модуля с ошибкой:	4791a76d
  Код исключения:	c0000005
  Смещение исключения:	0004bd93
  Версия ОС:	6.0.6001.2.1.0.768.3
  Код языка:	1049
  Дополнительные сведения 1:	cb05
  Дополнительные сведения 2:	b0a6de8cc3b9f447f8c447dda0c68d0e
  Дополнительные сведения 3:	1336
  Дополнительные сведения 4:	84f9c006c48bf8662e26265130e753b4
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 27.02.2009, 02:14   #9
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Заранее прошу прощения за дабл пост - последний мой пост можно удалить, он уже не нужен.

Сделал вот такую вот нехитрую программку. Все чудесно-расчудесно работает и память мою никто и в помине не трогает. НО, есть одна маленькая проблема. Последний оппкод (RET) C3 дополнен еще и 2 нулями - 00. Короче вместо скажем B8 0000 0000 C3 у меня получается B8 0000 0000 C3 00. Конечно это не критично но как минимум неприятно. Где у меня ошибка? Прикреплю весь проект с исходником. Да кстати этот 00 появляется в самом конце функции то есть идет код функции а после него нолик этот. И что самое странное он не во время перевода в 16-ричный текст появляется. То есть вариант что был прочитан лишний байт из vMemory можно исключить.
Вложения
Тип файла: rar HW.rar (14.8 Кб, 15 просмотров)
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ Builder, проблема с памятью Ламер_001 C++ Builder 9 22.11.2008 11:59
Проблема с памятью в С++ rJIaBkoM Помощь студентам 1 14.06.2008 14:25
Определение выделенной ячейки в таблице в Delphi Гео Помощь студентам 3 13.06.2008 14:51
Что будет с выделенной памятью? Sibedir Общие вопросы Delphi 9 18.01.2008 13:57
доступ к элементам выделенной строки в DBGrid yulia БД в Delphi 2 12.12.2007 12:51