首页
社区
课程
招聘
[原创]昨天写的一个GetProcAddress
发表于: 2006-9-29 10:40 8463

[原创]昨天写的一个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;
}

这个被加精,出乎意料哈...多谢老大...以后我会更努力的!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU
2
测试了一下,用它找LoadLibraryA的地址出错,找到的是LocalCompact

找其他的倒还没发现问题
2006-10-9 13:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个里面用了一个hash压缩算法,把函数名转换为唯一32位整数,这个算法只用在写溢出攻击代码等一些特殊环境里
个人感觉速度不一定会比串扫描快,另外既然是写程序么,最好还是走常规的路,我觉得微软的程序员再厉害也不会这样去写这个函数,
-------------
pExploit 是我自己定义的一种数据类型...
-------------
这个大可不必吧,不就是个dword么?各人觉得还是搞简明点的好
比较佩服楼主“吹”的功夫,网上几乎每个shellcode都用到的技术,居然好意思用原创两个字
2006-10-9 19:12
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
ls 的,我确实是自己写的一段代码.而且就是我的一段shellcode相关的一段代码.呵呵...
不过今天我改进了一下...原来的有点问题...
2006-10-10 22:59
0
雪    币: 227
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
再写一个LoadLibrary的代码就好了
2006-10-10 23:54
0
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
最初由 NIU 发布
测试了一下,用它找LoadLibraryA的地址出错,找到的是LocalCompact

找其他的倒还没发现问题

我测试可以找到LoadLibraryA 啊...

LS:有时间我试下.最近忙...
2006-10-11 08:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你们都是怎么学习的,,汇编也这么厉害,,请牛人指点下撒!
2006-10-17 10:00
0
游客
登录 | 注册 方可回帖
返回
//