/***************************************************
/*
/*交了题目以后就几天没有过来,今天看到好多人都把自己的做法帖出来了!
/*真的让人佩服,也亲眼看了传说中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,
也就是说我们要调用这个函数的话,只需要CALL dowrd ptr[基址+501c]就OK了!
如下图:


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

代码:
008D3050 68 74 74 70 3A 2F 2F 62 62 73 2E 70 65 64 69 79 http://bbs.pediy
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 = "http://bbs.pediy.com/注意:这里需要修复重定位表008D10DE |. 6A 00 push 0 ; |Operation = NULL
008D10E0 |. 6A 00 push 0 ; |hWnd = NULL
008D10E2 |. FF15 1C508D00 call dword ptr [<&Shell32.ShellExecut>; \ShellExecuteA注意:这里需要修复重定位表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,整个修改过程到这里就算结束了!!
由于本人以前学习都只是看书,所以,这次修改很多很多都是第一次操作,希望各位大大别笑话我!
虽然我没有看懂这次评分的标准,但是通过这次活动我一定会学到很多东西的!
同样,也希望像我一样的新朋友能通过我贴出来的东西真正的有所收获!!
最后再次谢谢各位大大的帮助!
上传的附件 第一题[EXE].rar
第一题[SRC].rar