首页
社区
课程
招聘
[原创]美丽の破船的答案
发表于: 2008-10-2 10:43 2461

[原创]美丽の破船的答案

2008-10-2 10:43
2461
/*************************************************************************************

/*提交比赛第一阶段第一题 *

/*要求如下: *

/*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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
呀呀,直接从我的编辑器里复制出来的!
没有帖图也没有排版!

在附件里有我用WORD的转换的  .mht格式 的分析过程!
2008-10-2 10:48
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
3
OpenUrlA 函数大小 = 26 字节
附件提交次数 = 1
得分 = min[1.0, 13/26]x100 -[1-1]x5 = 50.000000
另外文档很详细,加10分:)
总分60分
2008-10-2 12:15
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
呵呵,谢谢老大`~~
2008-10-2 19:43
0
游客
登录 | 注册 方可回帖
返回
//