Показать сообщение отдельно

  #9  
Старый 25.03.2008, 10:37
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

Цитата:
Сообщение от ProTeuS  
только вот парева небыло бы совершенно, если добавить в секцию заранее написаный базонезависимый код. и никакого импорта, никакого-инлайн асма и гемороя...
Тогда это получится что-то типа обычной склейки (которая, кстати, может и антивирем спалиться), а тут я описал внесение изменений, которые на самом деле вполне могут обмениваться информацией с "хостовой" программой...

Конечно, можно было бы заметить, что функции можно искать и без внесения импорта, как подробно описано тут(Greetz to TermoSINteZ).

Вот небольшой экстракт кода оттуда:
Цитата:
Код:
_ReadSEH:
xor  edx, edx			
mov  eax, dword ptr fs:[edx]	;читаем элемент SEH 
dec  edx				;edx = -1
_SearchK32:
cmp  dword ptr [eax], edx	;встретили нужный ?
je _CheckK32
mov  eax, dword ptr [eax]	;получаем следующее значение 
jmp _SearchK32
        _CheckK32:
mov  eax,[eax+4]		;получаем адрес ГДЕ-ТО в kernel32.dll
xor ax,ax			;выравниваем полученный адрес
Код:
_SearchMZ:
cmp word ptr [eax],5A4Dh	;сверяем сигнатуру
je _CheckMZ
sub eax,10000h			;если неравно то ищем дальше 
jmp _SearchMZ

_CheckMZ:
mov edx, dword ptr [eax+3ch]	;переходим на PE заголовок
cmp word ptr [eax+edx],4550h	;сверяем сигнатуру
jne _Exit
Код:
_SearchAPI: 
mov esi, dword ptr [eax+edx+78h]	;RVA таблицы экспорта            
add esi,eax                   			;нормализуем адрес
add esi,18h		;получаем нужный указатель на число ;указателей на имена
xchg eax,ebx
lodsd                        			;получаем число указателей на имена
push eax
lodsd                        			;получаем адрес таблицы экспорта.
push eax
lodsd                          		;получаем указатель на та таблицу ;указателей на имена 
push eax 
add eax,ebx
push eax                     		 	;Index элемента таблицы имен
lodsd                          			;получим  указатель на таблицу ординалов
push eax
mov edi, dword ptr [esp+4*5]		;указываем на стек 
lea edi, dword ptr [edi+HeshTable] 	;получаем смещение таблицы HeshTable
mov ebp,esp				;настраиваем стек
Код:
_BeginSearch:
mov ecx, dword ptr [ebp+4*4]		;число имен функций              
xor edx,edx

_SearchAPIName:          
mov esi, dword ptr [ebp+4*1]              ;Index элемента таблицы имен                                             
mov esi, dword ptr [esi]		;таблица экспорта
add esi,ebx				;адрес  ASСII имени первой API-функции
Код:
_GetHash:
xor  eax,eax			 
push eax


_CalcHash:
ror  eax,7			;сдвигаем 
xor dword ptr [esp],eax		;ксорим
lodsb				;загружаем следующую букву
test al,al				;сверяем, конец ли имени ?
jnz _CalcHash
pop eax

_OkHash:
cmp eax, dword ptr [edi]		;сверяем полученный hash с тем что в ;таблице HeshTable
je _OkAPI
add dword ptr [ebp+4*1],4    		;сдвигаемся к другому элементу таблицы ;экспорта
inc edx
loop _SearchAPIName 
jmp _Exit                            

_OkAPI:
shl edx,1				;номер функции
mov ecx, dword ptr [ebp]               	;берем указатель на таблицу ординалов
add ecx,ebx				
add ecx,edx
mov ecx, dword ptr [ecx]
and ecx,0FFFFh
mov edx, dword ptr [ebp+4*3]             ;извлекаем Address Table RVA
add edx,ebx
shl ecx,2
add edx,ecx
mov edx, dword ptr [edx]
add edx,ebx
push edx					;сохраняем адрес найденной функции
cmp word ptr [edi+4],0FFFFh   	;последняя ?
je _Call_API
add edi,4				;следующее hash-значение функции

_NextName:          
mov ecx, dword ptr [ebp+4*2]          ;восстанавливаем начало таблицы  экспорта  
add ecx,ebx						
mov dword ptr [ebp+4*1], ecx          ;Index  в таблице имен 
jmp short _BeginSearch      

_Call_API:
Код:
….
ExitProcess    		equ [ebp-4*12]
GetProcAddress 	equ [ebp-4*13]
LoadLibrary    	equ [ebp-4*14]
SetCurrentDirectory 	equ [ebp-4*15]
EIP			equ [ebp-4*16]
Find_H		equ [ebp-4*17]
FileHandle	   	equ [ebp-4*18]
FileSize	   	equ [ebp-4*19]
….
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ