首页
社区
课程
招聘
[原创]比赛第一阶段第一题DIY"pediy.dll"
发表于: 2008-10-7 00:07 6637

[原创]比赛第一阶段第一题DIY"pediy.dll"

2008-10-7 00:07
6637

我这里有两种方法,主要是因为题目要求不太清楚,我怕理解有误,故全面考虑之。
第一种理解是:只能打开网址“f4bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4@1f1J5i4K6R3H3i4K6W2p5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1^5i4K6R3H3i4K6S2o6i4@1f1@1i4@1t1^5i4K6V1@1e0%4m8W2L8W2g2J5L8p5q4Q4c8e0g2Q4b7V1q4Q4z5e0c8Q4c8e0S2Q4b7f1k6Q4b7e0g2Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0k6Q4z5e0N6Q4b7e0m8Q4c8e0g2Q4z5p5k6Q4z5o6u0Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0g2Q4z5o6N6Q4b7V1c8Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
也就是说无论使用何种“Test”主程序测试这个“pediy.dll”都应该运行成功而且只打开“841K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1&6i4@1p5I4i4@1t1#2i4@1f1&6i4K6W2p5i4@1p5J5i4@1f1K6i4K6R3H3i4K6R3J5
第二种理解是:只要能打开页面“120K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1#2i4K6S2p5i4@1t1K6i4@1f1#2i4K6S2r3i4@1q4r3i4@1f1K6i4K6R3H3i4K6R3J5

第一种方法
   按要求增加输出表和输出函数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为串“c30K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1#2i4K6W2o6i4@1t1H3i4@1f1#2i4K6W2p5i4K6R3H3i4@1f1#2i4K6S2p5i4@1t1K6i4@1f1#2i4K6S2r3i4@1q4r3i4@1f1K6i4K6R3H3i4K6R3J5

        如下,把这些信息放在“.data”节表中:


        最后要解决重定位信息,这在dll文件里是必须的。
原本的重定位信息为:

在OpenUrlA函数体内有2处需要重定位:10CF和10D5处。另外令人恼火的就是SHELLEXECUTEINFO结构了,因为结构体中还需要地址,而且也要进行重定位。我不得不将串“e7cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1$3i4K6R3&6i4K6R3H3i4@1f1#2i4K6W2o6i4@1p5^5i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1^5i4K6S2m8i4K6R3J5i4@1f1^5i4@1p5I4i4@1p5^5i4@1f1J5i4K6R3H3i4K6W2o6i4K6u0W2k6r3q4@1j5g2!0q4x3W2)9^5x3q4)9&6c8q4!0q4y4g2!0n7c8q4)9&6x3#2!0q4y4g2)9^5x3g2)9&6b7g2!0q4x3W2)9^5x3q4)9&6b7#2!0q4y4q4!0n7b7W2!0m8x3#2!0q4y4#2!0m8x3q4)9^5x3g2!0q4x3W2)9^5x3q4)9&6c8q4!0q4y4W2)9&6c8q4!0m8y4g2!0q4y4g2!0m8y4q4)9^5y4q4!0q4y4#2)9&6x3q4)9^5y4W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0m8c8g2!0m8z5g2N6A6L8X3c8G2N6%4y4Q4c8e0g2Q4b7f1g2Q4z5p5y4Q4c8e0k6Q4z5o6S2Q4z5e0m8Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0W2Q4z5o6N6Q4z5p5c8Q4c8e0g2Q4b7f1g2Q4z5f1q4Q4c8e0c8Q4b7V1c8Q4z5p5c8Q4c8e0S2Q4b7V1k6Q4z5o6N6Q4c8e0N6Q4b7e0S2Q4z5p5u0Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0g2Q4z5p5k6Q4b7f1q4Q4c8e0S2Q4b7e0k6Q4z5o6q4Q4c8e0g2Q4b7U0m8Q4z5o6k6Q4c8e0k6Q4z5o6W2Q4z5o6m8Q4c8e0g2Q4z5f1y4Q4b7e0S2Q4c8e0S2Q4z5p5q4Q4z5o6u0Q4c8e0S2Q4b7e0q4Q4b7e0S2Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0N6Q4z5o6W2Q4b7U0W2Q4c8e0g2Q4b7V1g2Q4z5o6q4Q4c8e0g2Q4z5o6m8Q4b7V1y4Q4c8e0g2Q4b7e0u0Q4z5f1g2Q4c8e0g2Q4z5p5q4Q4b7e0m8Q4c8e0c8Q4b7U0S2Q4z5p5q4Q4c8e0u0Q4z5o6m8Q4z5f1y4Q4c8e0g2Q4z5p5k6Q4b7f1k6Q4c8e0k6Q4z5o6W2Q4b7e0N6Q4c8e0S2Q4b7e0q4Q4z5p5y4Q4c8e0c8Q4b7V1u0Q4b7e0y4Q4c8e0N6Q4b7e0m8Q4z5o6q4Q4c8e0g2Q4b7U0q4Q4z5f1g2Q4c8e0k6Q4z5o6m8Q4b7e0N6Q4c8e0u0Q4z5o6m8Q4z5f1c8Q4c8e0g2Q4z5p5c8Q4b7U0y4Q4c8e0g2Q4z5p5k6Q4b7f1k6Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
最终的重定位信息修改为:

具体改写内容:

测试代码:
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('a82K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6t1%4i4K6t1&6i4K6t1&6i4K6u0o6x3q4)9J5b7K6m8Q4x3V1x3H3i4K6t1&6i4K6y4n7
end;

不足之处:两种方法都使用工具为“pediy.dll”新增导入函数,使得文件大小稍有增大。


[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
顶一个,纯支持
2008-10-7 08:44
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
手动修改输入表,用工具肯定使文件变大的,很多人都这么做,文件大小就不会变了
2008-10-7 12:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在OpenUrlA函数体内有2处需要重定位:10CF和10D5处。这个是怎么得来的|????
2008-10-11 18:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
加得代码为什么不是调用OPENURLA》???
2008-10-11 18:40
0
游客
登录 | 注册 方可回帖
返回