• XSS.stack #1 – первый литературный журнал от юзеров форума

поиск адреса функции GetProcAddress

karabas-barabas

(L1) cache
Пользователь
Регистрация
18.07.2006
Сообщения
650
Реакции
5
вот такой сабж, нужно получение адреса функции GetProcAddress для последующего скрытия некоторых импортируемых функций в проге , попадались в инете варианты но так у меня и не заработали, мож у кого есть примерчик для с++ ?
 
Получаеш базу kernel32.dll,затем GetModuleHandleA и GetProcAddress.
В си,насколько я видела,для этого асм встаки юзаются.
Вот в качестве примера кусок кода от Cr4sh,нахождение по хешу:
Код:
inline HMODULE GetKernel32(void)
{
	__asm 
	{
  mov  eax,dword ptr fs:[30h]
        mov  eax,dword ptr [eax+0ch]
        mov  esi,dword ptr [eax+1ch]
        lodsd
  	mov  eax,dword ptr [eax+08h]
	}
}
//----------------------------------------------------------------------------------------------
inline DWORD CalcHash(char *str)
{
	DWORD hash = 0;
	char* copystr = str;
	while(*copystr) 
	{
  hash = ((hash << 7) & (DWORD)(-1))|(hash >> (32-7));
  hash = hash^(*copystr);
  copystr++;
	}
	return hash;
}
//----------------------------------------------------------------------------------------------
#define RVATOVA( base, offset ) ( (DWORD)base + (DWORD)offset )
// return addr of API function by hash of it's name
LPVOID GetProcAddressEx(DWORD dwModule, DWORD dwProcNameHash)
{
	HMODULE hModule;

	switch (dwModule) 
	{
  case 1: 
  hModule = GetKernel32();
  break;

  case 2:
  hModule = (HMODULE)GLoadLibraryA("бла бла.dll"); 
  break;

  case 3:
  hModule = (HMODULE)GLoadLibraryA("бла бла.dll");
  break;

  default:
  return 0;
	}

	PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)
  ((char*)hModule + ((PIMAGE_DOS_HEADER)hModule)->e_lfanew + 
  	sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));

	PIMAGE_EXPORT_DIRECTORY ped = (IMAGE_EXPORT_DIRECTORY*)RVATOVA(hModule, 
  poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);	
	
	int nOrdinal;
	if (HIWORD((DWORD)dwProcNameHash) == 0) 
	{
  nOrdinal = (LOWORD((DWORD)dwProcNameHash)) - ped->Base;
	} else {
  DWORD *pdwNamePtr = (DWORD*)RVATOVA(hModule, ped->AddressOfNames);
  WORD *pwOrdinalPtr = (WORD*)RVATOVA(hModule, ped->AddressOfNameOrdinals);

  for (unsigned int i = 0; i < ped->NumberOfNames; i++, pdwNamePtr++, pwOrdinalPtr++)
  {
  	if (CalcHash((char*)RVATOVA(hModule, *pdwNamePtr)) == dwProcNameHash)
  	{
    nOrdinal = *pwOrdinalPtr;
    break;
  	}
  }

  if (i == ped->NumberOfNames) 
  	return 0;
	}

	PDWORD pAddrTable = (PDWORD)RVATOVA(hModule, ped->AddressOfFunctions);
	DWORD dwRVA = pAddrTable[nOrdinal];
	DWORD ret = (DWORD)RVATOVA(hModule, dwRVA);

	return (LPVOID)ret;
}

Вот либа от el
:zns5: Скачать|Download
 
спс за кусок кода , но он мне не помог, GLoadLibrary нет здесь где-то оно в остальных кусках :)
проблема решена - нашел кусок кода в инете, который немного пришлось доработать благо мои скудные знания асма позволили это сделать :)
Код:
void GetAddresses(DWORD GetProcAddressAdr,DWORD LoadLibraryAAdr)
{


	__asm 
	{
	;
       ; FIND kernel32 base
  ;
  
//         mov eax, [fs:0x30]
//    mov eax, [eax + 0x0c]
//    mov esi, [eax + 0x1c]
//    lodsd
//    mov eax, [eax + 0x8]
	//	pushad	
  mov eax, dword ptr fs:[30h]	
  	mov eax, dword ptr [eax+0ch]
  	mov esi, dword ptr [eax+1ch]
  	lodsd
  	mov eax, dword ptr [eax+08h]
  	
  ;
       ; FIND GetProcAddress
  ; FIND LoadLibraryA
  ;
  
        push 0         ;  Terminating symbol
  	push 0x7C0DFCAA;  GetProcAddress Hash  [ebp - 08h]
  	push 0xEC0E4E8E;  LoadLibraryA Hash    [ebp - 0Ch]
  	
  	
  	mov  ecx, esp
  	
get_function:
        pushad
  	mov ebp, eax
  	mov eax, [ebp + 0x3c]
  	mov edx, [ebp + eax + 0x78]
  	add edx, ebp
  	mov ecx, [edx + 0x18]
  	mov ebx, [edx + 0x20]
  	add ebx, ebp
find_function_loop:
        jecxz find_function_finished
  	dec ecx
  	mov esi, [ebx + ecx * 4]
  	add esi, ebp
compute_hash:
        xor edi, edi
  	xor eax, eax
  	cld
compute_hash_again:
        lodsb
  	test al, al
  	jz compute_hash_finished
  	ror edi, 0x0D
  	add edi, eax
  	jmp compute_hash_again
compute_hash_finished:
find_function_compare:
        mov eax, [esp + 0x18]  ; eax = ecx   before pushad
  	cmp edi, [eax]         ; [eax] = hash value
  	jnz find_function_loop
  	mov ebx, [edx + 0x24]
  	add ebx, ebp
  	mov cx,  [ebx + 2 * ecx]
  	mov ebx, [edx + 0x1C]
  	add ebx, ebp
  	mov eax, [ebx + 4 * ecx]
  	add eax, ebp
  	
  	mov edx, [esp + 0x18]
  	mov [edx], eax
find_function_finished:
        popad
  	add ecx, 4
  	cmp dword ptr [ecx], 0
  	jnz get_function
  	pop LoadLibraryAAdr
  	pop GetProcAddressAdr
  	pop eax
  ; [esp]         - LoadLibraryA
       ; [esp + 4]     - GetProcAddress
	}
}

кстати вроде как в xp и server 2003 адрес функции GetProcAddres и LoadLibrary всегда один и тот же на разных компах
 
karabas-barabas
Если пишется базонезависимый код или не используется стандартная таблица импорта, то поиск настоящей GetProcAddress не имеет смысла.
По сути нужно лишь знать, что требуемая библиотека загружена в наше АП либо подгрузить ее( перед этим нужно найти адрес например LoadLibraryA ). Сами же функции ищутся разбором PE заголвка и таблицы экспорта библиотеки. Этот код все равно писать, поэтому не имеет смысла в дальнейшем искать оригинальную GetProcAddress, так как у нас свой аналог( также преимущество в том, что на GetProcAddress можно бряк поставить или апи шпионом отследить, а наша версия GetProcAddress хз где может быть :) ).
Cr4sh в блоге хеллкнайтс как-то делал заметку о базонезависимом коде на С, там как раз вышеописанные приемы использовались.

Я, когда изучал PE COFF формат, набросал кодес, правдо малость криво и неоптимизировано:
Код:
; (Z)SilverT 2008
; example of getting address of function by crc32 hash
format PE GUI 4.0
entry zMain


include '%FASMINC%\win32a.inc'
include 'C:\fasmw16726\st_lib\pe_coff.inc'


section '.text' code readable executable
proc    zMain
       ;
        locals
                hLibrary                dd      ?
                pRegOpenKeyA            dd      ?
                pmyRegOpenKeyA          dd      ?
                dwRegOpenKeyCrc32       dd      ?
        endl
        stdcall z_crc32, __szRegOpenKeyA
        test    eax, eax
        jz      __exit
        mov     [ dwRegOpenKeyCrc32 ], eax

        invoke  LoadLibraryA, __szLibrary
        test    eax, eax
        jz      __exit
        mov     [ hLibrary ], eax
       ;
        invoke  GetProcAddress, [ hLibrary ], __szRegOpenKeyA
        test    eax, eax
        jz      __exit
        mov     [ pRegOpenKeyA ], eax
       ;
        stdcall st_GetProcAddr, [ hLibrary ], [ dwRegOpenKeyCrc32 ]
        test    eax, eax
        jz      __exit
        mov     [ pmyRegOpenKeyA ], eax
       ;
        cmp     eax, [ pRegOpenKeyA ]
        jne     __exit
        invoke  MessageBoxA, 0, __szText, __szCaption, 0
       ;
        invoke  FreeLibrary, [ hLibrary ]

__exit:
        invoke  ExitProcess, 0
        ret
endp

proc    st_GetProcAddr  hLibrary, dwCRC32
        mov     edx, [ hLibrary ]
        mov     ecx, [ edx + IMAGE_DOS_HEADER.e_lfanew ]
        add     ecx, edx
        mov     ebx, [ ecx + IMAGE_NT_HEADERS.OptionalHeader.DataDirectory0.VirtualAddress ]
        test    ebx, ebx
        jz      __get_addr_error
        add     ebx, edx; in ebx VA of export table
        mov     ecx, [ ecx + IMAGE_NT_HEADERS.OptionalHeader.DataDirectory0.Size ]; in ecx size of export table
        test    ecx, ecx
        jz      __get_addr_error
        mov     esi, [ ebx + IMAGE_EXPORT_DIRECTORY.AddressOfNames ]
        add     esi, edx
        mov     edi, [ ebx + IMAGE_EXPORT_DIRECTORY.NumberOfNames ]
        mov     ecx, [ ebx + IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals ]
        add     ecx, edx

__get_addr_find_name:
        lodsd
        add     eax, edx
        stdcall z_crc32, eax
        test    eax, eax
        jz      __get_addr_error
        cmp     eax, [ dwCRC32 ]
        je      __get_addr_find_addr
        add     ecx, 02h
        dec     edi
        test    edi, edi
        jnz     __get_addr_find_name
        jmp     __get_addr_error

__get_addr_find_addr:
        mov     ecx, [ ecx ]
        shl     ecx, 10h
        shr     ecx, 10h
        mov     eax, [ ebx + IMAGE_EXPORT_DIRECTORY.AddressOfFunctions ]
        add     eax, [ hLibrary ]
        mov     eax, [ eax + ecx * 4 ]
        add     eax, [ hLibrary ]
        jmp     __get_addr_success

__get_addr_error:
        xor     eax, eax

__get_addr_success:
        ret
endp
include 'C:\fasmw16726\st_lib\z_crc32.asm'
section '.data' data readable writable
__szLibrary     db      'advapi32.dll', 0
__szRegOpenKeyA db      'RegOpenKeyA', 0

__szText        db      'OK!', 0
__szCaption     db      'Yes!', 0

section '.idata' data import readable writable

library kernel32, 'kernel32.dll', \
        user32, 'user32.dll'

include '%FASMINC%\api\kernel32.inc'
include '%FASMINC%\api\user32.inc'
Код:
; ripped from Z0mbie sources
z_crc32:
     push       ebp
     mov        ebp, esp
     push       edx
     push       ebx
     push       esi
     push       edi
     xor        eax, eax
     dec        eax
     mov        edx, [ ebp + 08h ]
@@1:
     cmp        byte [ edx ], 0
     je         @@4
     xor        al, [ edx ]
     mov        bl, 8
@@2:
     shr        eax, 1
     jnc        @@3
     xor        eax, 0EDB88320h
@@3:
     dec        bl
     jnz        @@2
     inc        edx
     jmp        @@1
@@4:
     not        eax
     pop        edi
     pop        esi
     pop        ebx
     pop        edx
     leave
     retn       04h

Код:
;include '%FASMINC%\win32a.inc'

IMAGE_DOS_SIGNATURE     equ     0x4D5A
IMAGE_NT_SIGNATURE      equ     0x50450000

struct  IMAGE_DOS_HEADER
        e_magic         dw      ?
        e_cblp          dw      ?
        e_cp            dw      ?
        e_crlc          dw      ?
        e_cparhdr       dw      ?
        e_minalloc      dw      ?
        e_maxalloc      dw      ?
        e_ss            dw      ?
        e_sp            dw      ?
        e_csum          dw      ?
        e_ip            dw      ?
        e_cs            dw      ?
        e_lfarlc        dw      ?
        e_ovno          dw      ?
        e_res           dw      4 dup( ? )
        e_oemid         dw      ?
        e_oeminfo       dw      ?
        e_res2          dw      10 dup( ? )
        e_lfanew        dd      ?
ends

struct  IMAGE_FILE_HEADER
        Machine                 dw      ?      ; 000h  0
        NumberOfSections        dw      ?      ; 002h  2
        TimeDateStamp           dd      ?      ; 004h  4
        PointerToSymbolTable    dd      ?      ; 008h  8
        NumberOfSymbols         dd      ?      ; 00Ch 12
        SizeOfOptionalHeader    dw      ?      ; 010h 16
        Characteristics         dw      ?      ; 012h 18
ends

IMAGE_SIZEOF_FILE_HEADER        equ     20d

struct  IMAGE_DATA_DIRECTORY
        VirtualAddress          dd      ?
        Size                    dd      ?
ends

IMAGE_NUMBEROF_DIRECTORY_ENTRIES        =       16

IMAGE_SIZEOF_NT_OPTIONAL32_HEADER       equ     224
IMAGE_NT_OPTIONAL_HDR32_MAGIC           equ     0x10b

struct  IMAGE_OPTIONAL_HEADER
        Magic                           dw                      ?      ; 000h   0
        MajorLinkerVersion              db                      ?      ; 002h   2
        MinorLinkerVersion              db                      ?      ; 003h   3
        SizeOfCode                      dd                      ?
        SizeOfInitializedData           dd                      ?
        SizeOfUninitializedData         dd                      ?
        AddressOfEntryPoint             dd                      ?
        BaseOfCode                      dd                      ?
        BaseOfData                      dd                      ?
        ImageBase                       dd                      ?
        SectionAlignment                dd                      ?
        FileAlignment                   dd                      ?
        MajorOperatingSystemVersion     dw                      ?
        MinorOperatingSystemVersion     dw                      ?
        MajorImageVersion               dw                      ?
        MinorImageVersion               dw                      ?
        MajorSubsystemVersion           dw                      ?
        MinorSubsystemVersion           dw                      ?
        Win32VersionValue               dd                      ?
        SizeOfImage                     dd                      ?
        SizeOfHeaders                   dd                      ?
        CheckSum                        dd                      ?
        Subsystem                       dw                      ?
        DllCharacteristics              dw                      ?
        SizeOfStackReserve              dd                      ?
        SizeOfStackCommit               dd                      ?
        SizeOfHeapReserve               dd                      ?
        SizeOfHeapCommit                dd                      ?
        LoaderFlags                     dd                      ?
        NumberOfRvaAndSizes             dd                      ?
        DataDirectory0                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory1                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory2                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory3                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory4                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory5                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory6                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory7                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory8                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory9                  IMAGE_DATA_DIRECTORY   <?>
        DataDirectory10                 IMAGE_DATA_DIRECTORY   <?>
        DataDirectory11                 IMAGE_DATA_DIRECTORY   <?>
        DataDirectory12                 IMAGE_DATA_DIRECTORY   <?>
        DataDirectory13                 IMAGE_DATA_DIRECTORY   <?>
        DataDirectory14                 IMAGE_DATA_DIRECTORY   <?>
        DataDirectory15                 IMAGE_DATA_DIRECTORY   <?>
ends

struct  IMAGE_NT_HEADERS
        Signature       dd                      ?      ; 000h  0
        FileHeader      IMAGE_FILE_HEADER       ?      ; 004h  4
        OptionalHeader  IMAGE_OPTIONAL_HEADER   ?      ; 014h 20
ends

IMAGE_SIZEOF_NT_HEADERS = 4h + IMAGE_SIZEOF_FILE_HEADER + IMAGE_SIZEOF_NT_OPTIONAL32_HEADER

IMAGE_SUBSYSTEM_UNKNOWN                 =       0
IMAGE_SUBSYSTEM_NATIVE                  =       1
IMAGE_SUBSYSTEM_WINDOWS_GUI             =       2
IMAGE_SUBSYSTEM_WINDOWS_CUI             =       3
IMAGE_SUBSYSTEM_OS2_CUI                 =       5
IMAGE_SUBSYSTEM_POSIX_CUI               =       7
IMAGE_SUBSYSTEM_NATIVE_WINDOWS          =       8
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI          =       9

struct  IMAGE_SECTION_HEADER
        Name                    db      8 dup( ? ); 00h
        union
                PhysicalAddress dd      ?
                VirtualSize     dd      ?         ; 08h 8
        ends
        VirtualAddress          dd      ?         ; 0Ch 12
        SizeOfRawData           dd      ?         ; 10h 16
        PointerToRawData        dd      ?         ; 14h 20
        PointerToRelocations    dd      ?         ; 18h
        PointerToLinenumbers    dd      ?         ; 1Ch
        NumberOfRelocations     dw      ?         ; 20h
        NumberOfLinenumbers     dw      ?         ; 22h
        Characteristics         dd      ?         ; 24h
ends                                              ; size = 28h

IMAGE_SIZEOF_SECTION_HEADER     =       40d

struct  IMAGE_IMPORT_BY_NAME
        Hint            dw      ?
        Name            db      ?
ends

;typedef struct _IMAGE_IMPORT_BY_NAME {
;    WORD    Hint;
;    BYTE    Name[1];
;} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

struct  IMAGE_THUNK_DATA32
        union
                ForwarderString         dd      ?
                Function                dd      ?
                Ordinal                 dd      ?
                AddressOfData           dd      ?
        ends
ends

;typedef struct _IMAGE_THUNK_DATA32 {
;    union {
;        PBYTE  ForwarderString;
;        PDWORD Function;
;        DWORD Ordinal;
;        PIMAGE_IMPORT_BY_NAME  AddressOfData;
;    } u1;
;} IMAGE_THUNK_DATA32;

struct  IMAGE_IMPORT_DESCRIPTOR
        union
                Characteristics                 dd      ?
                OriginalFirstThunk              dd      ?
        ends
        TimeDateStamp                           dd      ?
        ForwarderChain                          dd      ?
        Name                                    dd      ?
        FirstThunk                              dd      ?
ends

IMAGE_IMPORT_DESCRIPTOR_SIZE = 20d

;typedef struct _IMAGE_IMPORT_DESCRIPTOR {
;    union {
;        DWORD   Characteristics;            // 0 for terminating null import descriptor
;        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
;    };
;    DWORD   TimeDateStamp;                  // 0 if not bound,
;                                            // -1 if bound, and real date\time stamp
;                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
;                                            // O.W. date/time stamp of DLL bound to (Old BIND)
;
;    DWORD   ForwarderChain;                 // -1 if no forwarders
;    DWORD   Name;
;    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
;} IMAGE_IMPORT_DESCRIPTOR;
;typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;


;typedef struct _IMAGE_BASE_RELOCATION {
;    DWORD   VirtualAddress;
;    DWORD   SizeOfBlock;
;//  WORD    TypeOffset[1];
;} IMAGE_BASE_RELOCATION;
;typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
;
;#define IMAGE_SIZEOF_BASE_RELOCATION         8



IMAGE_SIZEOF_BASE_RELOCATION    =       8h

struct  IMAGE_BASE_RELOCATION
        VirtualAddress                          dd      ?
        SizeOfBlock                             dd      ?
       ;TypeOffset                              dw      ?
ends



;typedef struct _IMAGE_EXPORT_DIRECTORY {
;    DWORD   Characteristics;
;    DWORD   TimeDateStamp;
;    WORD    MajorVersion;
;    WORD    MinorVersion;
;    DWORD   Name;
;    DWORD   Base;
;    DWORD   NumberOfFunctions;
;    DWORD   NumberOfNames;
;    DWORD   AddressOfFunctions;     // RVA from base of image
;    DWORD   AddressOfNames;         // RVA from base of image
;    DWORD   AddressOfNameOrdinals;  // RVA from base of image
;} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

struct  IMAGE_EXPORT_DIRECTORY
        Characteristics                         dd      ?      ; 000h  0
        TimeDateStamp                           dd      ?      ; 004h  4
        MajorVersion                            dw      ?      ; 008h  8
        MinorVersion                            dw      ?      ; 00Ah 10
        Name                                    dd      ?      ; 00Ch 12
        Base                                    dd      ?      ; 010h 16
        NumberOfFunctions                       dd      ?      ; 014h 20
        NumberOfNames                           dd      ?      ; 018h 24
        AddressOfFunctions                      dd      ?      ; 01Ch 28
        AddressOfNames                          dd      ?      ; 020h 32
        AddressOfNameOrdinals                   dd      ?      ; 024h 36
ends

salamandra
Получаеш базу kernel32.dll,затем GetModuleHandleA и GetProcAddress.
GetModuleHandleA не имеет смысла использовать, функция не увеличивает счетчик хэндлов. Если библиотека не подключена к АП, а нам нужна функция из нее, нужно делать LoadLibraryA ( либо аналоги ).
В си,насколько я видела,для этого асм встаки юзаются.
Можно и средствами С/С++, инлайн асмом проще( по моему скромному мнению ).

karabas-barabas
кстати вроде как в xp и server 2003 адрес функции GetProcAddres и LoadLibrary всегда один и тот же на разных компах
Хардкорно забивать адреса функций не очень хорошая идея, в разных сервис паках адреса разные, и еще помимо free, существует checked версии.
 
познавательно, как я понимаю базонезависимая getprocaddress это хорошо...интересует такой вопрос, отойду немного от темы, возможно ли обойти kis 2009 - например в проге функция RegSetValue в ветку Run ? как я понимаю кроме перехвата api на свои обработчики он еще и сплайсит код...
да и еще в коде есть CalcHash фунция это случайно не crc32 ?
 
Ну насчет обхода проактивки...тема далекая от текущей, но давайте разберемся =)

например в проге функция RegSetValue в ветку Run ? как я понимаю кроме перехвата api на свои обработчики он еще и сплайсит код...
Собственно splicing и есть один из методов перехвата API.

НО! KIS не перехватывает RegSetValueEx. Все дело в том, что перехватчики стоят на более низком уровне :) А именно, в ядре есть функции для работы с реестром, работающие в нулевом кольце защиты. Из пользовательского режима их напрямую не вызовешь. Для этого используется вызов системного сервиса. Аналогично вызову юзермодных апи, для вызова системного сервиса параметры пихаются в стек, в один из регистров пишется номер системного сервиса и далее исполняется команда sysenter( на win2k была int 2Eh, на XP тоже работает ), посое чего все действия выполняются в режиме ядра, когда сервис отработал управление возвращается режиму пользователя и исполнение ппрограммы продолжвется. Так вот, Reg* функции из advapi32.dll как раз оболочки для вызова системных сервисов. Их смысла нет перехватывать в юзермоде - перехват легко снять. Поэтому kis и подобные ему продукты ставят перехват в таблице системных сервисов или непосредственно сплайсят код самого сервиса(наверняка есть еще куча способов). Итог таков, если нужно обойти проактивку, нужно выйти в режим ядра, чтобы поснимать хуки, а для того чтобы поснимать хуки из режима ядра, надо сначала туда вылезти, чему препятствует проактивка :D

да и еще в коде есть CalcHash фунция это случайно не crc32 ?
Нет, это не crc32, но подобная функция, результатом которой является по сути контрольная сумма от переданных данных.
 
Код:
__declspec(naked) unsigned int __find_kernel32()
{
	__asm{
  /* -1- */       pushad
  /* -1- */       push  0x30
  /* -1- */       pop   ecx
  /* -1- */       mov   eax, fs:[ecx]
  /* -1- */       mov   eax, [eax + 0x0c]
  /* -1- */       mov   esi, [eax + 0x1c]
  /* -1- */       lodsd
  /* -1- */       mov   eax, [eax + 0x8]
  /* -1- */  mov   [esp + 0x1c], eax
  /* -1- */       popad
  /* -1- */       ret
	}
}

__declspec(naked) int __find_address(DWORD hash, DWORD base)
{
	__asm{
  /*****************************************/
  /* -2- FIND FUNCTION BY HASH    */
  /* -2- */       pushad
  /* -2- */  mov   ebp,  esp
  /* -2- */  mov   eax, [ebp + 0x28]
  /* -2- */       mov   ebp, eax
  /* -2- */       mov   eax, [ebp + 0x3c]
  /* -2- */       mov   edx, [ebp + eax + 0x78]
  /* -2- */       add   edx, ebp
  /* -2- */       mov   ecx, [edx + 0x18]
  /* -2- */       mov   ebx, [edx + 0x20]
  /* -2- */       add   ebx, ebp
__find_function_loop:
	/* -2- */       jecxz __find_function_finished
	/* -2- */       dec   ecx
	/* -2- */       mov   esi, [ebx + ecx * 4]
	/* -2- */       add   esi, ebp
	/* -2- */       xor   edi, edi
	/* -2- */       xor   eax, eax
	/* -2- */       cld
__compute_hash_again:
	/* -2- */       lodsb
	/* -2- */       test  al, al
	/* -2- */       jz    __compute_hash_finished
	/* -2- */       ror   edi, 0xd
	/* -2- */       add   edi, eax
	/* -2- */       jmp   __compute_hash_again
__compute_hash_finished:         
	/* -2- */       cmp   edi, [esp + 0x24]
	/* -2- */       jnz   __find_function_loop
	/* -2- */       mov   ebx, [edx + 0x24]
	/* -2- */       add   ebx, ebp
	/* -2- */       mov   cx,  [ebx + 2 * ecx]
	/* -2- */       mov   ebx, [edx + 0x1c]
	/* -2- */       add   ebx, ebp
	/* -2- */       mov   eax, [ebx + 4 * ecx]
	/* -2- */       add   eax, ebp
	/* -2- */       mov   [esp + 0x1c], eax
__find_function_finished:
	/* -2- */       popad
	/* -2- */      // ret 0x0C
                 ret 0x0
	/*****************************************/
	}
}

int calc_hash(char *HASH)
{
	int i = 1;
	unsigned long h = 0, len = 0, next = 0;
	if ((len = strlen(HASH)) == 0) return 0;
	char ch = 0;
	do{
  ch = HASH[next];
  h = (h << 0x13) + (h >> 0xd) + ch;
  next++;
  len--;
	}while(len > 0);
	return h;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх