/*************************************************************************************
/*提交比赛第一阶段第一题 *
/*要求如下: *
/*1.为DLL文件新增输出表,同时增加输出函数OpenUrlA; *
/*2.OpenUrlA函数功能是调用IE浏览器打开http://bbs.pediy.com,打开后无其他操作; *
/*3.不得改变pediy.dll的ImageBase的值400000h; *
/*4. 最终提交的程序,必须可运行在Windows 2000/XP系统上; *
/*5. 将修改好了的程序,与修改步骤(将整个过程用文字简单描述一下),一起上传到答案提交区(http://bbs.pediy.com/forumdisplay.php?f=120)。 *
/* *
/***********************************************************************************
/**
/*第一次参加比赛,外加上对自己的水平实在实在是让人不感恭维!但是活动重在参与嘛~
/*所以希望大家多多鼓励,多多指正文章中的错误!在此谢谢各位了!
/**********************************
下面进入正题!
要我们先为DLL增加一个输出表!
这个还比较容易,
用LordPE的PE编辑器打开这个DLL,点目录出现如下图:
好了,现在要添加输出表,就应该到程序里找一块空地:用地址转换器(FLC)把
0x2014转换成文件偏移地址:
0x641我们用WINHEX打开pediy.dll,直接的到输入表的地方:
0x641,向前找一下空余的地方:我找的是
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/" [COLOR="red"]注意:这里需要修复重定位表
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"]注意:这里需要修复重定位表
008D10E8 |. C9 leave
008D10E9 \. C3 retn
OK,到这里,理论上讲,应该是没有问题的了,可是这个文件是DLL程序,基址不固定,所以需要修复重定位表,让我们开始吧!!
我们需要重定位的地址(RVA)有两处:10DA、10E4
将它们转换一下得到:30DA、30E4
用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,整个修改过程到这里就算结束了!!
由于本人以前学习都只是看书,所以,这次修改很多很多都是第一次操作,希望各位大大别笑话我!
虽然我没有看懂这次评分的标准,但是通过这次活动我一定会学到很多东西的!
谢谢各位大大的帮助!
最后祈祷我能得个高分,嘻嘻!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)