能力值:
(RANK:10 )
|
-
-
2 楼
经典呀!好好的学习!感谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不太懂
但也要顶了
谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
顶一下!!努力学习!!
|
能力值:
( LV13,RANK:1250 )
|
-
-
5 楼
呵呵,添加导入函数我一般喜欢用自己写的代码完成
_MyGetProcAddressByName proc uses ebx esi edi _hModule, _lpszProcName
local loc_iLenOfName, loc_lpExportDir, loc_lpItemAddrName
;在_hModule指定的模块中查找名为_lpszProcName的导出函数
;入口参数:_hModule——模块的句柄,数值上等于其基地址
; _lpszProcName——指向要查找函数的名称字符串的指针
;返回值:成功则返回所需函数的地址,失败时返回NULL(在eax中)
xor eax, eax
mov edi, _lpszProcName
or ecx, -1
repnz scas byte ptr es:[edi]
not ecx
mov loc_iLenOfName, ecx ;以上取_lpszProcName的长度
mov edx, _hModule ;以下edx中皆为此模块基地址不再声明
cmp word ptr [edx], 5A4Dh ;5A4Dh == IMAGE_DOS_SIGNATURE
jne short locret_1
mov eax, edx
add eax, [eax+3Ch] ;3Ch == IMAGE_DOS_HEADER.e_lfanew
cmp word ptr [eax], 4550h ;4550h == IMAGE_NT_SIGNATURE
jne short locret_1
mov ebx, [eax+78h] ;78h == sizeof IMAGE_FILE_HEADER
; +
IMAGE_OPTIONAL_HEADER32.DataDirectory
add ebx, edx
mov loc_lpExportDir, ebx
mov eax, [ebx+20h] ;20h ==
IMAGE_EXPORT_DIRECTORY.AddressOfNames
add eax, edx
mov loc_lpItemAddrName, eax
;遍历函数名数组以匹配要查找的函数名
mov ebx, [ebx+18h] ;18h ==
IMAGE_EXPORT_DIRECTORY.NumberOfNames
@@:
mov esi, [eax]
add esi, edx
mov edi, _lpszProcName
mov ecx, loc_iLenOfName
repe cmps byte ptr es:[edi], byte ptr [esi]
jnz _continue1
;找到了的情况
sub eax, loc_lpItemAddrName ;获得该名称在函数名数组中的偏移
mov ebx, loc_lpExportDir
mov ebx, [ebx+1Ch] ;1Ch ==
IMAGE_EXPORT_DIRECTORY.AddressOfFunctions
add ebx, edx
mov ebx, [ebx+eax] ;以同一偏移在函数地址数组中搜索,
;即得所求函数的地址
lea eax, [edx+ebx]
jmp @F
_continue1: ;没有找到,继续
add eax, 4
dec ebx
jnz @B
locret_1:
xor eax, eax
@@:
ret
_MyGetProcAddressByName endp
通过GetModuleHandle("User32.dll")得到hUser32,同时在程序里随便什么地方写进"MessageBoxA"这个字符串,就可以调用上面这个函数来得到它的地址
|
能力值:
( LV9,RANK:290 )
|
-
-
6 楼
|