首页
论坛
专栏
课程

[论坛活动] [原创]我也帖一下我第一题的做法

2008-10-5 14:57 9530

[论坛活动] [原创]我也帖一下我第一题的做法

2008-10-5 14:57
9530
/***************************************************
/*
/*交了题目以后就几天没有过来,今天看到好多人都把自己的做法帖出来了!
/*真的让人佩服,也亲眼看了传说中7个字节搞定的方法!
/*无奈,在下不才,做这个题目以前从来没有手工添加过导出表,也从来没有修正过什么重定位表
/*整个过程基本上都是翻书翻出来的,帖出来不为别的,一个是留个纪念(毕竟它包含了我很多的第一次)
/*再就是,我发现其它很多人帖出来的都不是很详细,所以我就冒充一次“高手”,把过程写的详细一点,方便像我一样笨的朋友!
/*第一次参加这样的活动,外加上对自己的水平实在实在是让人不感恭维!但是活动重在参与嘛~
/*文章中肯定存在很多的错误!希望各位大大批评指正,在此谢谢各位了!
/*****************************************************


下面进入正题!
要我们先为DLL增加一个输出表!
这个还比较容易,
用LordPE的PE编辑器打开这个DLL,点目录出现如下图:

好了,现在要添加输出表,就应该到程序里找一块空地:用地址转换器(FLC)把0x2014转换成文件偏移地址:0x614


我们用WINHEX打开pediy.dll,直接的到输入表的地方:0x614,向前找一下空余的地方:我找的是0x500,转换一下是0x1100,大小:0x11
接下来就是编辑输出表,添加输出函数OpenUrlA函数了!

我们先来看一下关于输出表结构的定义:

IMAGE_EXPORT_DIRECTORY STRUCT
Characteristics DWORD ? ;总是0
TimeDateStamp DWORD ? ;0
MajorVersion WORD ? ;0
MinorVersion WORD ? ;0
nName DWORD ? ;DLL名字字符串的地址
nBase DWORD ? ;1
NumberOfFunctions DWORD ? ;1
NumberOfNames DWORD ? ;1
AddressOfFunctions DWORD ? ;函数的地址了
AddressOfNames DWORD ? ;名称的地址
AddressOfNameOrdinals DWORD ? ;序号的地址了!
IMAGE_EXPORT_DIRECTORY ENDS


OK,根据上面的结构的定义,我们在0x500处开始编辑输出表:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 
00000500 00 00 00 00 00 00 00 00 00 00 00 00 32 11 00 00 ............2...
00000510 01 00 00 00 01 00 00 00 01 00 00 00 28 11 00 00 ............(...
00000520 2C 11 00 00 30 11 00 00 08 10 00 00 3C 11 00 00 ,...0.......<...
00000530 00 00 70 65 64 69 79 2E 64 6C 6C 00 4F 70 65 6E ..pediy.dll.Open
00000540 55 72 6C 41 00 00 00 00 00 00 00 00 00 00 00 00 UrlA............

OK,写完了,我们用PE编辑器看一下效果:
[
效果还满意吧,哈哈,那个RVA等下写函数的时候,等顶下具体写到哪里在改一下就OK了!到现在还比较顺利,下面开始写正式写我们的OpenUrlA函数了:
说要打开网页:http://bbs.pediy.com
用到的API是:ShellExecuteA
,它的用法如下:
HINSTANCE ShellExecute(
HWND hwnd, 
LPCTSTR lpOperation,
LPCTSTR lpFile, 
LPCTSTR lpParameters, 
LPCTSTR lpDirectory,
INT nShowCmd
);

OK,下面就把这个API添加到程序中去!

添加完成以后,我们需要看一下它的映射地址是多少:
查看输入表,选中总是察看FirstThunk这个复选框,点一下Shell32.dll,看到我们导入的函数的RVA是:0x501c,
也就是说我们要调用这个函数的话,只需要[I]CALL dowrd ptr[基址+501c][/I]就OK了!
如下图:


,启动OD,用OD添加函数OpenUrlA!
步骤如下:
****************在数据区添加如下内容****************

008D3050 68 74 74 70 3A 2F 2F 62 62 73 2E 70 65 64 69 79 [URL="http://bbs.pediy/"]http://bbs.pediy[/URL]
008D3060 2E 63 6F 6D 2F 00 00 00 00 00 00 00 00 00 00 00 .com/...........

把程序另存一份,再在代码区写上如下代码!

008D10D0 /. 55 push ebp
008D10D1 |. 8BEC mov ebp, esp
008D10D3 |. 6A 00 push 0 ; /IsShown = 0
008D10D5 |. 6A 00 push 0 ; |DefDir = NULL
008D10D7 |. 6A 00 push 0 ; |Parameters = NULL
008D10D9 |. 68 50308D00 push 008D3050 ; |FileName = "[URL]http://bbs.pediy.com/[/URL]" [COLOR="red"]注意:这里需要修复重定位表[/COLOR]008D10DE |. 6A 00 push 0 ; |Operation = NULL
008D10E0 |. 6A 00 push 0 ; |hWnd = NULL
008D10E2 |. FF15 1C508D00 call dword ptr [<&Shell32.ShellExecut>; \ShellExecuteA[COLOR="red"]注意:这里需要修复重定位表[/COLOR]008D10E8 |. C9 leave
008D10E9 \. C3 retn

OK,到这里,理论上讲,应该是没有问题的了,可是这个文件是DLL程序,基址不固定,所以需要修复重定位表,让我们开始吧!!
我们需要重定位的地址(RVA)有两处:0x10DA0x10E4
将它们转换一下得到:0x30DA0x30E4用WINHEX打开pediy.dll,来到重定位表区域:
***************原来的重定位表*****************
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 
00000A00 00 10 00 00 20 00 00 00 03 30 08 30 10 30 2F 30 .... ....0.0.0/0 
00000A10 34 30 83 30 8E 30 96 30 9F 30 BE 30 C5 30 00 00 40??????.. 


**************修改以后的重定位表******************
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 
00000A00 00 10 00 00 22 00 00 00 03 30 08 30 10 30 2F 30 ...."....0.0.0/0 
00000A10 34 30 83 30 8E 30 96 30 9F 30 BE 30 C5 30 E4 30 40??????? 
00000A20 DA 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ?.............. 


修改完了以后,在用LordPE 打开pediy.dll的目录表,修正重定位表的大小为0x22,!
OK,到这里修改过程就算结束了!
下面我们写个程序调用一下测试一下效果!
void CBisaiDlg::OnOK() 
{ 
typedef void(*pOpenUrl)(void); 
HINSTANCE hDLL; 
pOpenUrl OpenUrl; 
hDLL=LoadLibrary("pediy.dll"); 
OpenUrl=(pOpenUrl)GetProcAddress(hDLL,"OpenUrlA"); 
OpenUrl(); 
::FreeLibrary(hDLL); 
} 

效果如下图:

OK,整个修改过程到这里就算结束了!!
由于本人以前学习都只是看书,所以,这次修改很多很多都是第一次操作,希望各位大大别笑话我!
虽然我没有看懂这次评分的标准,但是通过这次活动我一定会学到很多东西的!
同样,也希望像我一样的新朋友能通过我贴出来的东西真正的有所收获!!
最后再次谢谢各位大大的帮助!

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (17)
JiYangTX 2008-10-5 15:30
2
0
支持个,赞老兄进步好快
烁皓 2008-10-5 16:19
3
0
很好!很详细。
美丽破船 5 2008-10-5 20:34
4
0
还不是因为有像你一样的大哥努力哦~~~嘿嘿`~~
你也要加油哈`~~
JiYangTX 2008-10-5 20:50
5
0
偶还是只小菜鸟,
看到大家的进步,实在是高兴
偶已经落伍太多了,得加油赶
Soargon 2008-10-5 22:23
6
0
第一题都没看过.....误了这班车...哎
nwgao 2008-10-5 23:16
7
0
启动OD,用OD添加函数OpenUrlA!

这里具体操作是怎样的,能不能说的具体些? 才开始学这个,不是很懂. 多谢!!!
frozenrain 2008-10-5 23:37
8
0
原来lordpe可以这么用啊  我IAT用C32asm纯手工打造,弄了N次才弄好,又长见识了
要学会编 2008-10-6 03:33
9
0
学习学习. 很详细.
美丽破船 5 2008-10-6 06:29
10
0
请大哥仔细看帖子,我基本上操作的每一步怎么做,为什么这么做,都写的很清楚了!
xiaodai 2008-10-7 17:21
11
0
输出表指针在开始应该修改一下,不然PE编辑器看不到你修改的输出函数信息啊
glery 2 2008-10-7 18:04
12
0
很详很强大。。。
冷血书生 28 2008-10-7 18:24
13
0
厉害~~学习拉~~感谢分享!
zhuliang 5 2008-10-7 22:34
14
0
RVA为0x2014的地方,文件偏移不是0x641而应该是0x614吧?
瞧红尘 2 2008-10-8 08:49
15
0
略微的看了下,发现我没做出来主要是因为两点没过关。
    不敢认真看,以后等自己再学段时间。再去尝试

1.函数我想自己全部自己加到dll中去,而不是通过导入一个函数。如能通过这样达到效果除了改变多点也没什么。可我还达不到这点

2.我不熟悉重定位。
美丽破船 5 2008-10-9 11:56
16
0
谢谢大哥的指正,是我的失误,在此给大家抱歉了`~~~
Runzy 2008-10-10 17:19
17
0
按照LZ的做。。。。

我怎么做。怎么错。。。唉。!
wlkcrq 2008-10-13 07:01
18
0
支持~~~~~学习中~~
游客
登录 | 注册 方可回帖
返回