首页
社区
课程
招聘
[旧帖] [求助]今天的经典之作手写DLL有感 0.00雪花
发表于: 2009-3-8 23:52 3171

[旧帖] [求助]今天的经典之作手写DLL有感 0.00雪花

2009-3-8 23:52
3171
紧接着编写弹出对话框的函数,但在编写代码前先要弄清楚对话框的标题“hello”和内容“hello,pediy!!!”的内存地址。由于对话框的标题和内容数据都处于.data区块中,由表5可知,该区块在内存中与基址的偏移为2000h,与磁盘文件头的偏移为800h,两者的差值为2000-800=1800h。
   现在计算对话框的标题“hello”的内存地址。“hello”在磁盘文件的800h处,加上1800为800+1800=2000h,再加上ImageBase的值400000h,则标题“hello”的内存地址为400000+2000=402000h。内容“hello,pediy!!!”的内存地址如上,最后得到内存地址为401010h。
   另外还需要MessageBoxA的函数地址,由输入表部分可知,文件偏移A60处存放的是MessageBoxA的函数地址,转化成内存地址为400000+((3000-A00)+A60)=403060h。
    编写完成的代码如下:

55                 push   ebp                  
8BEC              mov    ebp, esp
6A 00              push    0
68 00204000        push    00402000             ;title “hello”
68 10204000        push    00402010             ;  text “hello,pediy!!!”
6A 00              push    0
FF15 60304000      call     dword ptr [403060]      ;调用MessageBoxA函数
8BE5              mov     esp, ebp
5D                pop      ebp
C3                retn

所以,代码区块(.text)的16源码如下:

00000600   B8 01 00 00 00 C2 0C 00  55 8B EC 6A 00 68 00 20   ?...?.U嬱j.h.
00000610   40 00 68 10 20 40 00 6A  00 FF 15 60 30 40 00 8B   @.h. @.j..`0@.?
00000620   E5 5D C3 00 00 00 00 00  00 00 00 00 00 00 00 00   錧?............

     由代码区块可知,代码中存在3个重定位数据,分别是title “hello”( 00402000h ), text “hello,pediy!!!”( 00402010 ), MessageBoxA函数地址( 00403060h )。这就需要重定为表的帮忙。重定位表是为与.reloc区块上,数据的组织方式是由许多重定位块串接而成。每个块是必须以4字节对齐,重定位块的结构如下:

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;

(1)  VirtualAddress:这组重定位数据的RVA地址。每个重定位数据加上这个值才是重定位项的RVA。
(2)  SizeOfBlack:四个字节,当前重定位结构的大小。用这个项减去8,就是TypeOffset的大小。
(3)  TypeOffset:是一个数组。数组每项大小是两个字节,其中高4位是重定位的类型,低12位是重定位地址,它与VirtualAddress相加就是PE映像需要修改的地址数据的指针。

常见的重定位类型如下表6:

表6
title “hello”( 00402000h )在文件中的偏移为60Eh,转化成RVA为60E+(1000-600)=100Eh,减去这组重定位数据开始的RVA地址为100E-1000=00Eh,于是得到TypeOffset低12位地址00Eh,TypeOffset的高4位类型为3,所以TypeOffset的值为300Eh,在16进制编辑器里输入“0E 30”。
text “hello,pediy!!!”( 00402010 )按title “hello”的方法计算,得到TypeOffset的值为3013h,在16进制编辑器里输入“13 30”。
MessageBoxA函数地址( 00403060h )按title “hello”的方法计算,得到TypeOffset的值为301Bh,在16进制编辑器里输入“1B 30”。
最后,我们得到VirtualAddress为00001000h,在16进制编辑器里输入“00 10 00 00”。
SizeOfBlock为00000010h(有四个重定位项,其中一个是为了数据对齐,(10-8)/2=4h),在16进制编辑器里输入“10 0 00 00”。
构造完成的重定位表区块16进制源码如下:

00000E00   00 10 00 00 10 00 00 00  0E 30 13 30 1B 30 00 00   .........0.
这里有点看不懂了    最后得到内存地址为401010h     00402010  为什么啊
请高手指点这里
typedef struct _IMAGE_BASE_RELOCATION /定位结构什么在PE总结构里看不到
他们的关系是什么连的啊

还有输入输出表在PE总的结构里看不到什么关系/IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] 这些什么都在这个结构表里找不到输出输入定位结构体的名子啊不懂了

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
还有上一篇?
2009-3-9 10:42
0
游客
登录 | 注册 方可回帖
返回
//