· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› Hostent структура. Получение элементов списков.

Посл.отвђт Сообщенiе


Дата: Окт 6, 2004 17:29:40

Вариант 1. Если указан "domain name".
mov eax,offset ServerName
push eax
call gethostbyname
cmp eax,0
je NotFoundInDNS
mov eax,(_hostent ptr [eax]).h_addr_list
mov eax,[eax]
push dword ptr [eax]
call inet_ntoa

После этого в eax регистре имеем стандартный десятично-точечный вид IP адреса.


Вариант 2. Указан IP.
push offset ServerIP
call inet_addr ;try to convert IPv4 -> NetByteType
cmp eax,-1
je NOTIP       ;domain name -> IP
mov iad.S_un.S_addr,eax 
invoke gethostbyaddr,offset iad, sizeof iad, AF_INET
cmp eax,0
je NotFoundInDNS_G
invoke wsprintf,addr SD,addr StrFormat,(_hostent ptr [eax]).h_name
push offset dword ptr [SD]
"call something"

Получили соответственно домен интересующего нас сервера.

Я хотел бы получить:
1. "альтернативные имена узла (массив строк)" (Касперский (С)). Поле h_aliases.
2. список альтернативных IP. Поле h_addr_list.

Пытаюсь по всякому писать [...+sizeof(DWORD)]
Но фигушки! Неполучается.


Дата: Окт 9, 2004 21:41:12

Может быть кто-нибудь все-таки ответит на мой вопрос.
Кто умнее здесь из всех в сетях?


Дата: Окт 10, 2004 05:00:13 · Поправил: q_q

NoName
Примерно так
...
; получить указатель на hostent
	invoke	gethostbyaddr, ...
; или
	invoke	gethostbyname, ....
	test	eax,eax
	jz	short gethostby_error

	push	eax

	mov	eax,(_hostent ptr [eax]).h_aliases
	test	eax,eax
	jz	short h_aliases_done
h_aliases_get:
	mov	ecx,[eax]
	test	ecx,ecx
	jz	short h_aliases_done
	push	eax
;
; здесь ECX содержит адрес очередного псевдонима
; например, его можно вывести на консоль при помощи
;
	push	eax		; буфер для NumberOfCharsWritten
	push	0		; lpReserved
	lea	eax,[esp+4]
	push	eax		; lpNumberOfCharsWritten
	push	ecx		; сохранить адрес строки с псевдонимом
	push	ecx
	call	lstrlenA	; определить длину строки с псевдонимом
	pop	ecx		; восстановить адрес строки с псевдонимом
	push	eax		; nNumberOfCharsToWrite
	push	ecx		; pBuffer
	push	STD_OUTPUT_HANDLE
	call	GetStdHandle
	push	eax		; hConsoleOutput
	call	WriteConsoleA
	pop	eax		; восстановить стек от NumberOfCharsWritten

	pop	eax
	add	eax,sizeof dword
	jmp	short h_aliases_get
h_aliases_done:

	pop	eax

	mov	eax,(_hostent ptr [eax]).h_addr_list
	test	eax,eax
	jz	short h_addr_list_done
h_addr_list_get:
	mov	ecx,[eax]
	test	ecx,ecx
	jz	short h_addr_list_done
	push	eax
;
; здесь ECX содержит адрес очередного ip-адреса
; например, его можно перевести в строку при помощи
;
	push	dword ptr [ecx]
	call	inet_ntoa

	pop	eax
	add	eax,sizeof dword
	jmp	short h_addr_list_get
h_addr_list_done:
...
PS imho знания в сетях здесь ни при чем.


Дата: Окт 10, 2004 16:29:53

2 q_q
Спасибо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066