-
-
[原创]比赛第一阶段第一题DIY"pediy.dll"
-
发表于: 2008-10-7 00:07 6452
-
我这里有两种方法,主要是因为题目要求不太清楚,我怕理解有误,故全面考虑之。
第一种理解是:只能打开网址“http://bbs.pediy.com”,而且OpenUrlA应该是无参数的函数。
也就是说无论使用何种“Test”主程序测试这个“pediy.dll”都应该运行成功而且只打开“http://bbs.pediy.com”页面。
第二种理解是:只要能打开页面“http://bbs.pediy.com”即可。
第一种方法
按要求增加输出表和输出函数OpenUrlA,我选择在导入表的后面一片空白处,文件偏移6B0开始:
前四个字段不重要,都默认置为0,nName字段是指向文件名的RVA,我把“pediy.dll”存储在了文件偏移6E0处(RVA=2000-600+6E0=000020E0),因此这个字段值就是:000020E0;nBase可以默认置为0,NumberOfFunctioins和NumberOfNames都设置为1;后面是三个表的RVA,我把函数地址表选在偏移6F0处,把函数名表放在700处,把函数序号表放在710处。函数地址表的内容先不填写,因为还没有打造好OpenUrlA函数;由于导出的只有一个函数,我把名字填充在偏移720处,直接把RVA 00002120填写到函数名地址表中。还有一个序号表,就预留着空间就行了。
现在打造OpenUrlA函数,我把函数代码放在RVA:10CE处,代码如下(大小为12字节):
(此时可以将输出表结构中偏移为6F0处的函数地址表的内容填写为000010CE)
现在再看看代码,因为“pediy.dll”中没有ShellExecuteExA函数,所以还需要为其增加这个函数,直接使用PeEditor即可快速完成。
因为“pediy.dll”的ImageBase为400000,所以打造代码时首先应考虑“以400000为基址”,最后再进行重定位操作。要求是打开一个网页,最容易想到API ShellExecuteA,但是由于这个函数参数太多,打造代码时势必占用太多空间。跟踪下发现ShellExecuteA最终是要调用函数ShellExecuteExA的。而ShellExecuteExA只需要一个参数lpExecInfo,指向SHELLEXECUTEINFO结构,如果把这个结构填写完毕,直接把地址压栈调用ShellExecuteExA即可。而SHELLEXECUTEINFO结构的打造也相当简单,只要第一个字段为0000003C(cbSize),第二个字段为00001500(fMask),第五个字段lpFile为串“http://bbs.pediy.com”的地址即可。
如下,把这些信息放在“.data”节表中:
最后要解决重定位信息,这在dll文件里是必须的。
原本的重定位信息为:
在OpenUrlA函数体内有2处需要重定位:10CF和10D5处。另外令人恼火的就是SHELLEXECUTEINFO结构了,因为结构体中还需要地址,而且也要进行重定位。我不得不将串“http://bbs.pediy.com”所在的节表“.data”当做“代码”来处理,让Windows完成这个重定位过程。只要将所在节表的特征值增加上“可执行代码属性”即可。
最终的重定位信息修改为:
具体改写内容:
测试代码:
procedure OpenUrlA;stdcall;external 'pediy.dll';
//……
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenUrlA;
end;
第二种方法
输出表结构的构造同上,这次为“pediy.dll”新增导入函数ShellExecuteA ,OpenUrlA代码打造为(大小为7字节):
重定位信息修改为(大小仍未20,因为这次只新添一个重定位信息,刚好填补原来对齐用的空间):
参数让测试程序填写,测试代码:
procedure OpenUrlA(p1,p2,p3,p4,p5,p6:DWORD);stdcall;external 'pediy.dll';
//……
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenUrlA(0,0,DWORD(PCHAR('http://bbs.pediy.com')),0,0,0);
end;
不足之处:两种方法都使用工具为“pediy.dll”新增导入函数,使得文件大小稍有增大。
赞赏
- [原创]第二阶段第一题 2155
- [原创]第四题 2269
- [原创]抛砖引玉:望评委给个第三题的标准答案 6582
- [原创]第一阶段第三题答案提交 2789
- [原创]第一阶段第二题:找规律玩填字游戏 7603