вот такой сабж, нужно получение адреса функции GetProcAddress для последующего скрытия некоторых импортируемых функций в проге , попадались в инете варианты но так у меня и не заработали, мож у кого есть примерчик для с++ ?
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;
}
Скачать|Downloadvoid 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
}
}
; (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
GetModuleHandleA не имеет смысла использовать, функция не увеличивает счетчик хэндлов. Если библиотека не подключена к АП, а нам нужна функция из нее, нужно делать LoadLibraryA ( либо аналоги ).Получаеш базу kernel32.dll,затем GetModuleHandleA и GetProcAddress.
Можно и средствами С/С++, инлайн асмом проще( по моему скромному мнению ).В си,насколько я видела,для этого асм встаки юзаются.
Хардкорно забивать адреса функций не очень хорошая идея, в разных сервис паках адреса разные, и еще помимо free, существует checked версии.кстати вроде как в xp и server 2003 адрес функции GetProcAddres и LoadLibrary всегда один и тот же на разных компах
Собственно splicing и есть один из методов перехвата API.например в проге функция RegSetValue в ветку Run ? как я понимаю кроме перехвата api на свои обработчики он еще и сплайсит код...
Нет, это не crc32, но подобная функция, результатом которой является по сути контрольная сумма от переданных данных.да и еще в коде есть CalcHash фунция это случайно не 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;
}