-
-
[原创]昨天写的一个GetProcAddress
-
发表于:
2006-9-29 10:40
8463
-
昨天心血来潮就自己写了个.并复习下pe哈哈...
写作原因:
因为要在一个文件中读入一行函数名然后将其找到(我的一个dll库)所以刚开始
我用的是ms自己的GetProcAddress发现怎样都成功不了.实在找不到原因.所以就
自己写了个并温习了下pe.(感谢看学上的pe方面的文章!)
刚开始写出来后发现还是成功不了.经过跟踪终于发现原因,并且这个也是GetProcAddress不可以成功的原因.就是,在一个文件中读入一行字符后在结尾处
是"\x0A\x00"本来应该是没有\x0a的.比如文件中一行
buguty
被读入后就是
"buguty''\x0a'\x0'"本来没有那个换行符的.所以我在第一次计算hash的时候加了个cmp al,0xa
后来我改进了下.就是在之前将我的所有读入的字符串(读入的字符串还有参数等信息)进行了一下转换去掉结尾的\x0a:
_asm
{
push esi
mov esi,pBuff
FindA:
lodsb
cmp al,0x0a
jnz FindA
xor al,al
mov byte ptr [esi-1],al
pop esi
}
然后一下是改进后的代码:
pExploit GetProcAddr(char* pFuncName,HMODULE hDll)
{
unsigned long hash;
pExploit RetVanlue;
_asm
{
mov esi,pFuncName
call GetHash
mov hash,eax
;找到数据目录表 ebx,edi
mov ebx,hDll ;base to eax
mov edi,[ebx+0x3c]
mov edi,[edi+ebx+0x78]
add edi,ebx ;edi==Addr of IMAGE_EXPORT_DIRECTORY
mov edx,[edi+0x20]
mov esi,dword ptr [edx+ebx]
add esi,ebx ;esi-->names
xor edx,edx ;counter...
dec edx
mov ecx,[edi+0x18] ;Number of Names of Funcs
push ebx
GetByNameLoop:
dec ecx
inc edx
call GetHash
mov eax,hash
cmp eax,ebx
jz HashFind
cmp ecx,0
jnz GetByNameLoop
jmp UnFindAndEnd
HashFind:
mov eax,[edi+0x24] ;Get AddressOfNameOrdinals's Address
pop ebx
add eax,ebx
movzx ax,word ptr [eax+edx*2]
mov edx,[edi+0x1c]
add edx,ebx
and eax,0x0ffff
mov eax,[edx+eax*4]
add eax,ebx
jmp FindAndEnd
/* GetHashFunc */
GetHash:
xor ebx,ebx
xor eax,eax
HashLoop:
lodsb
cmp ah,al
jz GetHashRet
ror ebx,7
add ebx,eax
jmp HashLoop
GetHashRet:
mov eax,ebx
ret
/* GetHashFuncEnd */
UnFindAndEnd:
pop esi
xor eax,eax
FindAndEnd:
mov RetVanlue,eax
}
return RetVanlue;
}
这个被加精,出乎意料哈...多谢老大...以后我会更努力的!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!