首页
社区
课程
招聘
[讨论]ollydbg 是如何通过函数名找到函数地址的?
发表于: 2017-4-29 18:46 8845

[讨论]ollydbg 是如何通过函数名找到函数地址的?

2017-4-29 18:46
8845

例如我们输入bp send, 就可以在send函数的头部下一个断点, ollydbg是如何找到send函数的地址的呢? 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 152
活跃值: (29)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2

要知道这个,首先需要了解PE中导出表结构

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;  // 标志, 未用
    DWORD   TimeDateStamp;    // 时间戳
    WORD    MajorVersion;     // 未用
    WORD    MinorVersion;     // 未用
    DWORD   Name;             // 指向该导出表的文件名字符串 
    DWORD   Base;             // 导出函数的起始值
    DWORD   NumberOfFunctions;       // 所有的导出函数个数
    DWORD   NumberOfNames;           // 以函数名导出的函数的个数
    DWORD   AddressOfFunctions;      // 导出函数地址表RVA(RVA from base of image)
    DWORD   AddressOfNames;          // 函数名称地址表RVA(RVA from base of image)
    DWORD   AddressOfNameOrdinals;   // 函数序号地址表   (RVA from base of image)
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

通过函数名查找函数地址:
1、先确定send在哪个动态链接库中
2、加载动态链接库并确定导出表地址
3、AddressOfNames字段里边存放着函数名地址,用函数名send与里边的函数名去匹配,找到后会确定一个该函数名地址的索引index1
4、再查看AddressOfNameOrdinals字段中index1处存放的值假设为index2
5、AddressOfFunctions字段中index2处存放的地址就是send的地址。

前几天刚学了导出表,不知道这样回答对不对?

2017-4-29 19:40
0
雪    币: 180
活跃值: (609)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
RichardE 要知道这个,首先需要了解PE中导出表结构typedef struct _IMAGE_EXPORT_DIRECTORY {  & ...
不应该是导入表么?
2017-4-30 06:14
1
雪    币: 620
活跃值: (1407)
能力值: ( LV9,RANK:175 )
在线值:
发帖
回帖
粉丝
4
好像是加载程序的时候,OD会解析PE导入表相关数据保存在内存的表中,加载模块的时候也是。BP时就直接在自己的内存里面查就行了。用到了reftable,或者是调用Expression(sod),查找到对应label地址。
bp不仅可以下函数名也可以下标签名,不需要加载dll,不需要读对方内存。
如果是要知道PE的找function知识那百度查一下就有了。
2017-4-30 10:55
0
游客
登录 | 注册 方可回帖
返回