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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2009, 19:23   #1
un07
 
Регистрация: 26.02.2008
Сообщений: 8
По умолчанию Проблема с дельта смещением

Здравствуйте! Сразу прошу прощения если не туда пишу.

Вот пытаюсь сделать базонезависимую программу для внедрения (курсовой у меня такой), но чет невыходит . Может кто знает где ошибка?

Код HTML:
.386

.model	flat,stdcall
option	casemap : none

include	\TEST\MASM32\include\windows.inc

MIN_KERNEL_SEARCH_BASE	equ	070000000h
MAX_API_STRING_LENGTH		equ	150

.code
main:
	pushad
	call		Delta

Delta:
	pop 		ebp
	sub 		ebp, offset Delta 
	push	dword ptr [esp + 20h]
	call		GetKernelBase
	or		eax, eax
	mov		[ebp + dwKernelBase], eax

	lea		eax, [ebp + offset szLoadLibrary]
	push	eax
	push	[ebp + dwKernelBase]
	call		GetProcAddr
	mov		[ebp + _LoadLibrary], eax

	lea 		eax, [ebp + offset szGetProcAddress]
	push	eax
	push 	[ebp + dwKernelBase]
	call		GetProcAddr
	mov		[ebp + _GetProcAddress], eax

	lea 		eax, [ebp + offset szKernel32]
	push	eax
	call		[ebp + _LoadLibrary] 
	mov		[ebp + dwKernelBase], eax

	lea		eax, [ebp + offset szCF]			;CreateFileA
	push 	eax
	push 	[ebp + dwKernelBase]
	call		GetProcAddr
	mov		[ebp + _CF], eax

	lea		eax, [ebp + offset szEP]			;ExitProcess
	push 	eax
	push 	[ebp + dwKernelBase]
	call		GetProcAddr
	mov		[ebp + _EP], eax

	lea		eax, [ebp + offset szRF]			;ReadFile
	push 	eax
	push 	[ebp + dwKernelBase]
	call		GetProcAddr
	mov		[ebp + _RF], eax

	lea 		eax, [ebp + offset szUser32]
	push	eax
	call		[ebp + _LoadLibrary] 
	mov		[ebp + dwUserBase], eax

	lea		eax, [ebp + offset szMB]			;MessageBoxA
	push 	eax
	push 	[ebp + dwUserBase]
	call		GetProcAddr
	mov		[ebp + _MB], eax

	push	NULL
	push	FILE_ATTRIBUTE_NORMAL
	push    	OPEN_ALWAYS
	push    	NULL
	push    	FILE_SHARE_READ OR FILE_SHARE_WRITE
	push    	GENERIC_READ
	lea		eax, [ebp + offset FileN]
	push	eax
	mov		eax, [ebp + _CF]
	call		eax

	mov		dFile, edx  
	push	NULL
	lea		eax, [ebp + offset num]
	push	eax
	lea		eax, [ebp + 512]
	push	eax
	lea		eax, [ebp + offset buf]
	push	eax
   	lea		eax, [ebp + dFile]
	push	eax
	mov		eax, [ebp + _RF]
	call		eax
	mov		edx, dword ptr buf+43h

	.IF		edx == SN
	push 	MB_OK
	lea 		eax, [ebp + offset _ttl2]
	push 	eax
	lea 		eax, [ebp + offset _msg2]
	push 	eax
	push 	NULL
	mov		eax, [ebp + _MB]
	call		eax
	.ELSE
	push 	MB_OK
	lea 		eax, [ebp + offset _ttl2]
	push 	eax
	lea 		eax, [ebp + offset _msg2]
	push 	eax
	push 	NULL
	mov		eax, [ebp + _MB]
	call		eax
	.ENDIF

	push	NULL
	mov		eax, [ebp + _EP]
	call		eax

GetKernelBase	PROC USES edi esi, dwTopStack : dword
	mov		edi, dwTopStack
	and		edi, 0FFFF0000h

	.WHILE	TRUE

	.IF		word ptr [edi] == IMAGE_DOS_SIGNATURE
    	mov		esi, edi
     	add		esi, [esi + 03ch]

	.IF		dword ptr [esi] == IMAGE_NT_SIGNATURE
   	.BREAK
	.ENDIF

 	.ENDIF

ExceptCont:
 	sub		edi, 010000h

  	.IF		edi < MIN_KERNEL_SEARCH_BASE
	mov		edi, 0BFF70000h
     	.BREAK
   	.ENDIF

	.ENDW

	xchg		eax, edi	
	ret

GetKernelBase	ENDP

GetProcAddr	PROC USES esi edi ecx ebx edx, dwDllBase : dword, szApi : LPSTR
	mov		esi, dwDllBase
	cmp		word ptr [esi], IMAGE_DOS_SIGNATURE
	jnz		@@BadExit
	add		esi, [esi + 03ch]
	cmp		dword ptr [esi], IMAGE_NT_SIGNATURE
	jnz		@@BadExit
	mov		edi, szApi
	mov		ecx, MAX_API_STRING_LENGTH
	xor		al, al
	repnz	SCASB
	mov		ecx, edi
	sub  	ecx, szApi
	mov  	edx, [esi + 078h]
	add  	edx, dwDllBase
	assume 	edx : ptr IMAGE_EXPORT_DIRECTORY
	mov  	ebx, [edx].AddressOfNames
	add  	ebx, dwDllBase
	xor		eax, eax

	.REPEAT
  	mov  	edi, [ebx]
   	add  	edi, dwDllBase
  	mov  	esi, szApi
 	push 	ecx	
  	repz 	CMPSB

 	.IF		ZERO?
     	.BREAK
  	.ENDIF

  	pop		ecx
   	add		ebx, 4
  	inc		eax

	.UNTIL 	eax == [edx].NumberOfNames

	mov  	esi, [edx].AddressOfNameOrdinals
	add  	esi, dwDllBase
	push 	edx
	mov  	ebx, 2
	xor		edx, edx
	mul  	ebx
	add  	eax, esi
	xor		ecx, ecx
	mov  	word ptr cx, [eax]
	pop  	edx	
	mov  	edi, [edx].AddressOfFunctions
	xor		edx, edx
	mov  	ebx, 4
	mov  	eax, ecx
	mul  	ebx
	add  	eax, dwDllBase
	add  	eax, edi
	mov  	eax, [eax]
	add  	eax, dwDllBase
	jmp  	@@ExitProc
	assume 	edx : nothing

@@BadExit:
	xor	eax, eax

@@ExitProc:
	ret

GetProcAddr	ENDP

Constants:
dFile	dd	0
num		dd	0
FileN	db	'\\.\i:', 0
SN		dd	0F82FFCFCh
buf		db	1024 dup (0)
_ttl		db	"Ключ верный!", 0
_msg	db	"Для продолжения нажмите ''ОК''", 0
_ttl2		db	"Неверный ключ!", 0
_msg2	db	"Для завершения нажмите ''ОК''", 0

dwKernelBase		dd	0
dwUserBase		dd	0
szLoadLibrary		db 	"LoadLibraryA", 0
szGetProcAddress	db 	"GetProcAddress", 0
szUser32			db 	"user32", 0
szKernel32		db	"kernel32", 0
_LoadLibrary		dd 	0
_GetProcAddress	dd	0

szMB	db 	"MessageBoxA", 0
szCF	db 	"CreatFileA", 0
szRF	db 	"ReadFile", 0
szEP	db 	"ExitProcess", 0
_MB		dd 	0
_CF		dd 	0
_RF		dd 	0
_EP		dd 	0

end	main
un07 вне форума Ответить с цитированием
Старый 23.03.2009, 20:30   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

под отладчиком запускал? на каком месте ошибка?
rpy3uH вне форума Ответить с цитированием
Старый 24.03.2009, 08:02   #3
un07
 
Регистрация: 26.02.2008
Сообщений: 8
По умолчанию

Да запускал через OllyDbg.
Код:
...
             push	NULL
	push	FILE_ATTRIBUTE_NORMAL
	push    	OPEN_ALWAYS
	push    	NULL
	push    	FILE_SHARE_READ OR FILE_SHARE_WRITE
	push    	GENERIC_READ
	lea		eax, [ebp + offset FileN]
	push	eax
	mov		eax, [ebp + _CF]
	call		eax
И после етого улетает

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

А адрес функции правильный? переход на функцию производится? вообще адрес правильный?

Последний раз редактировалось rpy3uH; 24.03.2009 в 08:41.
rpy3uH вне форума Ответить с цитированием
Старый 24.03.2009, 09:07   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я конечно мож не в тему, но разве загрузчик винды не предоставляет программе "заглушки", в которых указывается по каким адресам находятся функции? Это помоему называется таблицей IT. Ты получается загрузчик пишешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.03.2009, 09:21   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

он пишет базонезависимый код, т.е. его можно будет загрузать по любому адресу и он будет работать.
P.S. но больше это смахивает на шаблон вируса заражающего exe файлы..
rpy3uH вне форума Ответить с цитированием
Старый 24.03.2009, 09:27   #7
un07
 
Регистрация: 26.02.2008
Сообщений: 8
По умолчанию

Ой ненаю, я сам то асмом не занимаюсь и не собирался. Просто так получилось что поступил в Унимвер (ну никак не ожидал что он там будет) и доучясь до 4 ого курса получил вот такой курсачь делать. Ну и начал изучать.
В написании пользовался статьями и примерами с сайта www.wasm.ru и vx.org.ua/tpoc/articles.htm

Но чет ваще не выходит


Ну скажем что ето не шаблон вируса, но использую их технологии. Для большего понятия опишу что мне надо сделать. Надо внедрить в ехе файл программу которая будет определять номер флешки и при получении положительного ответа передаст управление основной программе. Программу внедрения у меня есть, а вот с программой проверки косяк. Если хотите могу выложить код етой программы (которая проверяет) без дельты, чтобы небыло мнения что я тута вирус пытаюсь навоять.

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

А не проще ли так: Сделай стартер, который будет определять флешку, и запускать твою программу. Зачем внедрять свой код который аверами скорее всего запалится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.03.2009, 12:03   #9
un07
 
Регистрация: 26.02.2008
Сообщений: 8
По умолчанию

Проще но, дело в том что задание звучит так что прога проверки флехи должна быть встроена в ехе файл путем расширения последней секции и не иначе
un07 вне форума Ответить с цитированием
Старый 24.03.2009, 20:03   #10
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

un07, посмотри пост #4 в этой теме
rpy3uH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37