PEB获取GetProcAddrees函数地址
2010-06-25 09:18
239 查看
1.fs寄存器指向TEB结构
2.在TEB+0x30地方指向PEB结构
3.在PEB+0x0C地方指向PEB_LDR_DATA结构
4.在PEB_LDR_DATA+0x1C地方就是一些动态连接库地址了,如第一个指向ntdll.dll,第二个就是kernel32.dll的地址。
其结构示意图如图
利用PEB查找kernerl32地址的汇编实现
mov eax, fs:0x30 ;PEB的地址
mov eax, [eax + 0x0c] ;Ldr的地址
mov esi, [eax + 0x1c] ;Flink地址
lodsd
mov eax, [eax + 0x08] ;eax就是kernel32.dll的地址
这样就获得了kernel32.dll的基址了,其实就相当于调用LoadLibrary的返回值,可以在GetProcAddress里面直接使用
然后我们要做的事就是查找导出表,找到GetprocAddress的地址
mov ebp, 0x77E40000 ;kernel32.dll 基址
mov eax, [ebp+3Ch] ;eax = PE首部
mov edx,[ebp+eax+78h]
add edx,ebp ;edx = 引出表地址
mov ecx , [edx+18h] ;ecx = 输出函数的个数
mov ebx,[edx+20h]
add ebx, ebp ;ebx =函数名地址,AddressOfName
search:
dec ecx
mov esi,[ebx+ecx*4]
add esi,ebp ;依次找每个函数名称
;GetProcAddress
mov eax,0x50746547
cmp [esi], eax; 'PteG'
jne search
mov eax,0x41636f72
cmp [esi+4],eax; 'Acor'
jne search
;如果是GetProcA,表示找到了
mov ebx,[edx+24h]
add ebx,ebp ;ebx = 序号数组地址,AddressOf
mov cx,[ebx+ecx*2] ;ecx = 计算出的序号值
mov ebx,[edx+1Ch]
add ebx,ebp ;ebx=函数地址的起始位置,AddressOfFunction
mov eax,[ebx+ecx*4]
add eax,ebp ;利用序号值,得到出GetProcAddress的地址
好了,要做的事已经做了。总结一下
a. 通过TEB/PEB获取kernel32.dll基址
b. 在(基址+0x3c)处获取e_lfanewc就是PE标志。
c. 在(基址+e_lfanew+0x78)处获取引出表地址(后面为描述方便简称export)
d. 在(基址+export+0x1c)处获取AddressOfFunctions、AddressOfNames、AddressOfNameOrdinalse。
e. 搜索AddressOfNames,确定“GetProcAddress”所对应的index
f. index = AddressOfNameOrdinalse [ index ];
g. 函数地址 = AddressOfFunctions [ index ];
时间不早了,我要睡觉去咯
2.在TEB+0x30地方指向PEB结构
3.在PEB+0x0C地方指向PEB_LDR_DATA结构
4.在PEB_LDR_DATA+0x1C地方就是一些动态连接库地址了,如第一个指向ntdll.dll,第二个就是kernel32.dll的地址。
其结构示意图如图
利用PEB查找kernerl32地址的汇编实现
mov eax, fs:0x30 ;PEB的地址
mov eax, [eax + 0x0c] ;Ldr的地址
mov esi, [eax + 0x1c] ;Flink地址
lodsd
mov eax, [eax + 0x08] ;eax就是kernel32.dll的地址
这样就获得了kernel32.dll的基址了,其实就相当于调用LoadLibrary的返回值,可以在GetProcAddress里面直接使用
然后我们要做的事就是查找导出表,找到GetprocAddress的地址
mov ebp, 0x77E40000 ;kernel32.dll 基址
mov eax, [ebp+3Ch] ;eax = PE首部
mov edx,[ebp+eax+78h]
add edx,ebp ;edx = 引出表地址
mov ecx , [edx+18h] ;ecx = 输出函数的个数
mov ebx,[edx+20h]
add ebx, ebp ;ebx =函数名地址,AddressOfName
search:
dec ecx
mov esi,[ebx+ecx*4]
add esi,ebp ;依次找每个函数名称
;GetProcAddress
mov eax,0x50746547
cmp [esi], eax; 'PteG'
jne search
mov eax,0x41636f72
cmp [esi+4],eax; 'Acor'
jne search
;如果是GetProcA,表示找到了
mov ebx,[edx+24h]
add ebx,ebp ;ebx = 序号数组地址,AddressOf
mov cx,[ebx+ecx*2] ;ecx = 计算出的序号值
mov ebx,[edx+1Ch]
add ebx,ebp ;ebx=函数地址的起始位置,AddressOfFunction
mov eax,[ebx+ecx*4]
add eax,ebp ;利用序号值,得到出GetProcAddress的地址
好了,要做的事已经做了。总结一下
a. 通过TEB/PEB获取kernel32.dll基址
b. 在(基址+0x3c)处获取e_lfanewc就是PE标志。
c. 在(基址+e_lfanew+0x78)处获取引出表地址(后面为描述方便简称export)
d. 在(基址+export+0x1c)处获取AddressOfFunctions、AddressOfNames、AddressOfNameOrdinalse。
e. 搜索AddressOfNames,确定“GetProcAddress”所对应的index
f. index = AddressOfNameOrdinalse [ index ];
g. 函数地址 = AddressOfFunctions [ index ];
时间不早了,我要睡觉去咯
相关文章推荐
- c# 、 Asp.net 获取本地IP和MAC地址
- Java中获取windows、Linux和windows7的MAC地址
- ASP.NET获取客户端IP及MAC地址
- 从PEB获取内存中模块列表
- windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址 分类: windows驱动程序WDM 2015-01-04 16:19 353人阅读 评论(0) 收藏
- Android机用移动数据流量获取也能获取mac地址的终极方法。(第二种方法)
- ASP.NET 如何获取地址栏URL地址
- js获取地址栏某个参数
- 获取客户端的外网ip地址
- Windows下Java如何调用本地获取mac地址
- qt获取内网IP、外网IP和Mac地址
- 用javascript获取地址栏参数
- PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
- js获取地址参数值
- 50天iOS挑战(Swift) - 第3天:简单利用CoreLocation获取当前地址
- IOS 获取Mac地址
- Python获取Mac地址
- android 中获取网络状态、判断3G、2G、wifi网络、判断wifi是否打开、获取本机地址、获取本机串号IMEI整理
- wordpress获取某个栏目链接地址的方法
- C语言数组地址【元素地址及数组地址获取方法区别】