本文整理自网络,侵删。
上联合翻宝贝,一个不小心,翻到一个给力的函数 = =
虽然不知道作者是谁,深深膜拜作者一下先
const
MAX_API_STRING_LENGTH = 150;
type
PSEHStruct = ^TSEHStruct;
TSEHStruct = record
saveEsp: Cardinal;
saveEbp: Cardinal;
gotoEip: Cardinal;
end;
function MyGetProcAddress(DllBase: LongWord; ApiName: PChar): Pointer; pascal;
asm
PUSH ESI
PUSH EDI
PUSH ECX
PUSH EBX
PUSH EDX
XOR EDX, EDX
PUSH OFFSET SEHHandler
PUSH DWORD PTR FS:[EDX]
MOV SEH.saveEsp, ESP
MOV SEH.saveEbp, EBP
MOV SEH.gotoEip, OFFSET @@NotFound
MOV FS:[EDX], ESP
MOV EDI, ApiName
MOV ECX, MAX_API_STRING_LENGTH
REPNZ SCASB
MOV ECX, EDI
SUB ECX, ApiName
MOV EDX, DllBase
CMP [EDX].TImageDosHeader.e_magic, IMAGE_DOS_SIGNATURE
JNZ @@NotFound
ADD EDX, [EDX].TImageDosHeader._lfanew
CMP [EDX].TImageNtHeaders.Signature, IMAGE_NT_SIGNATURE
JNZ @@NotFound
MOV EDX, [EDX].TImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].TImageDataDirectory.VirtualAddress
OR EDX, EDX
JZ @@NotFound
ADD EDX, DllBase
MOV EBX, [EDX].TImageExportDirectory.AddressOfNames
ADD EBX, DllBase
XOR EAX, EAX
@@Loop:
MOV EDI, [EBX]
ADD EDI, DllBase
MOV ESI, ApiName
PUSH ECX
REPZ CMPSB
POP ECX
JE @@Found
ADD EBX, 4
INC EAX
CMP EAX, [EDX].TImageExportDirectory.NumberOfNames
JB @@Loop
JMP @@NotFound
@@Found:
SHL EAX, 1
ADD EAX, [EDX].TImageExportDirectory.AddressOfNameOrdinals
ADD EAX, DllBase
MOV AX, [EAX]
AND EAX, $0000FFFF
{ ordinal -> function }
SHL EAX, 2
ADD EAX, [EDX].TImageExportDirectory.AddressOfFunctions
ADD EAX, DllBase
MOV EAX, [EAX]
ADD EAX, DllBase
JMP @@Exit
@@NotFound:
{ return 0 on error }
XOR EAX, EAX
@@Exit:
XOR EDX, EDX
POP DWORD PTR FS:[EDX]
ADD ESP, 4
POP EDX
POP EBX
POP ECX
POP EDI
POP ESI
end;
使用的时候
zhu:Pointer;
zhu:=MyGetProcAddress(LoadLibrary('Kernel32.dll'),'OpenProcess');
相关阅读 >>
Delphi winapi: getactivewindow - 获取当前活动窗口的句柄
更多相关阅读请进入《Delphi》频道 >>