对类HelloWorld程序中添加一个MessageBox弹窗

对类HelloWorld程序中添加一个MessageBox弹窗

 

 

分析:

任一程序运行的时候都会加载kernel32.dll,MessageBoxA()这个API却是在user32.dll中的。所以在HelloWorld.exe中是没办法直接添加MessageBoxA()的调用。

不过好在有kernel32.dll,其中有两个API可以解决user32.dll没加载的问题,分别是LoadLibraryA(filename)GetProcAddress(hModule, 函数名)

操作:

清除基址重定位表

先用PE View这个工具查看一下HelloWorld.exe是否用基址重定位表。若有,就用WinHex工具把IMAGE_OPTIONAL_HEADER中的BASE RELOCATION Table清空为0。(这样是为了避免我们硬编进去的代码变得不可用,具体原因看关于基址重定位表的内容)

 

记录ImageBase的值

PE View就可以在IMAGE_OPTIONAL_HEADER中看到的

 

一般ImageBase的值都为00400000

API的导入地址(IMPORT Table)

首先查到IMAGE_OPTIONAL_HEADERDataDirectories数组中的Import TableRVA值为 000064BC

 

 

RVA值代表的是Import Table相关的数据在文件中相对于文件头的偏移量:

 

这时要注意一下Import Address Table RAV这个数据的值,因为这个值会告诉我们,从kernel32.dll中导入的API列表在文件中的位置。在这个程序里的值,其值为00006000

去到文件的偏移量00006000上看到了是个函数列表,暂时这个程序只有需要用的kernel32中的函数。

 

注意看Data列表的值,其实它也是RVA值来,指向的是文件中当前项所代理的函数名字符串。现在不妨看看文件偏移量00006594上的内容:

 

PE文件加载到了内存,Data中的值就会被替换成真实的API起始地址的。但现在要做的是我们会知道这个列表会加载内存的哪个位置呢?首先需要看看这个列表是在哪个节区中?在这个程序中,它是在.rdata节区中。

 

 

所以我们需要看看节区.rdata的节区头信息。

 

记录下其中的RVA00006000,根据公式:

虚拟地址(内存中) = ImageBase + RVA

得出这个节区会加载到00406000上,用OllDbg查看一下

 

``````````这时我们去一下761929AC上,应该会看到这是API GetCommandLineA() 的指向,在这里又跳转了一次

 

但我们操作的时候不理会这样,只要记下00406000这个地址就行,具体操作如下:

CALL  DWORD   PTR  DS:[00406000]

只要把00406000换成对应的LoadLibraryA之类的地址就好。

 

LoadLibraryA:00406080

GetProcAddress:0040607C

到这里,准备工作已经做了。

输入下面的代码:

 

需要记录一下00405923这个值,稍候修改PE头信息的作为新的入口点( AddressOfEntryPoint )

另外要注意红框的代码 

JMP  00401041

这个是用来跳转回程序原本的入口点的,可以事先用PE编辑器查看一下,并且记下:

 

也是用这个工具,把入口点改成我们的新的入口点:00405923

 

再保存就好了

之后运行测试一下,原始的:

 

修改后的:   

 

 





转载于:https://www.cnblogs.com/dilex/p/5049762.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值