Срочно нужна помощь в испоьзуемой процедуре используется регистр ebp а мне нужно его использовать для других целей как можно преобразовать код что бы ebp не был занят Код (Text): push 8 ; set number of functions to find... pop ebp ; ...in ebp mov edi,KernelTable ; address of kernel32 function's hash table mov ebx,dword [ebx+0Ch] ; EBX = PEB_LDR_DATA mov ebx,dword [ebx+1Ch]; InitOrderModuleList 1st entry mov ebx,dword [ebx] ; next entry mov eax,dword [ebx+8] ; K32 imagebase in EAX ; ***************** search addresses of api functions ***************** ; * Be careful with it's params coz there are no any checks ; * so if hash is wrong there'll be a crash! ; * Look at params of function: they must be in registers not in stack! SearchApi: ; eax = module, edi = hashtable, ebp = size ; K32 imagebase in EAX ; ESI = oaeie oeacaoaeu mov edx,dword [eax+3Ch] ; get fileaflign mov esi,dword [eax+edx+78h] ; get exporttable RVA lea esi,dword [esi+eax+18h] ; set ESI to .ex_numofnamepointers in export table xchg eax,ebx ; save in EBX module image base lodsd ; get number of Name Pointers push eax ; save it in stack lodsd ; get address table RVA push eax ; save it in stack lodsd ; get name pointers RVA push eax ; save it in stack add eax,ebx ; add module image base to index (for what?) push eax ; index lodsd ; get ordinal table RVA push eax ; save it in stack .begin_search: ; search API function mov ecx,dword [esp+4*4] ; get number of Name Pointers xor edx,edx ; clear edx .search_API_name: ; search for neccessary function mov esi,dword [esp+4*1] ; get index mov esi,dword [esi] ; get RVA of first element add esi,ebx ; get VA of first element ; --- Getting hash-value for API function name --- xor eax,eax ; clear eax push eax ; hash value will be generated in stack ror eax,7 ; ror :) xor [esp],eax ; xor :) lodsb ; get next symbol test al,al ; while not end of string jnz $-9 ; repeat pop eax ; get hash value in EAX ; ------------------------------------------------ cmp eax,dword [edi] ; if hash of function equal with value from table je .ok_api ; we've got'em add dword [esp+4*1],4 ; else increase index inc edx ; increase counter - function number loop .search_API_name ; repeat search ret ; exit if no function found .ok_api: shl edx,1 ; double function number mov ecx,dword [esp] ; get ordinal table RVA add ecx,ebx ; get ordinal table VA add ecx,edx ; get function ordinal address mov ecx,[ecx] ; get function ordinal movzx ecx,cx ; clear higher word (ordinal size is word) mov edx,[esp+4*3] ; get address table RVA add edx,ebx ; get address table VA lea edx,[edx+ecx*4] ; get address of api RVA mov edx,[edx] ; get api RVA add edx,ebx ; get api VA mov dword [edi],edx ; save api address add edi,4 ; get next hash-value dec ebp ; decrease counter of neccessary functions jz .all_apis_founded ; go to exit from function ; --- search next api function mov ecx,dword [esp+4*2] ; get name pointers RVA add ecx,ebx ; get name pointers VA mov dword [esp+4*1],ecx ; set new index jmp .begin_search ; search again .all_apis_founded: ; exit from function add esp,5*4 ; recover stack mov eax,$ ; get current address mov byte [eax],0C3h ; change instruction to RETN ; ==========================================================
Море вариантов, самый простой убрать первые две строки и вместо dec ebp поставить cmp dword[edi],0 или любой признак окончания таблицы, х.з. как там она у тебя заканчивается
вОТ ПРИМЕР ТАБЛИЦЫ ХЕШЕЙ Код (Text): kernelFuncs: LL dd 71E40722h ; LoadLibraryA us32 db 'USER32.DLL',0 u32func: msbx dd 0BE7B3098h ;MessageBoxA bogrus НАСЧЁТ MASM->FASM НУ ПЕРЕДАЧА ПАРАМЕТРОВ В ПРОЦЕДУРУ ДЕЛО В ТОМ ЧТО Я ПИШУ ВНЕДРЯЕМЫЙ КОД ВЫСЧИТЫВАЮ СМЕЩЕНИЕ И МНЕ НАДО НЕ В САМОЙ ПРОЦЕДУРЕ ОПРЕДЕЛЯТЬ АРГУМЕНТЫ А ПЕРЕДАВАТЬ ИХ ПРОЦЕДУРЕ А В ФАСМЕ У МЕНЯ НЕТ ХЕЛПА ЗНАЮ ЧТО ДОЛЖЕН БЫТЬ НО НЕТ СПАСИБО ПОМОГИ ПОЖ ТА С ПОИСКОМ АДРЕСОВ ДЕЛО В ТОМ ЧТО В ESP У МЕНЯ ДЕЛЬТА СМЕЩЕНИЕ
И ЕЩЁ ВОПРОСИК МАЛЕНЬКИЙ ДОПУСТИМ Я ПОПАДАЮ В RING 0 ПОД XP ЧТО РЕАЛЬНОГО МОЖНО СДЕЛАТЬ В НУЛЕВОМ КОЛЬЦЕ