首页
社区
课程
招聘
[原创]手工向可执行程序添加MessageBox弹窗(一)
发表于: 2017-4-21 01:35 28896

[原创]手工向可执行程序添加MessageBox弹窗(一)

2017-4-21 01:35
28896

最近在学习PE结构,网上找到滴水第三期中关于PE的讲解,视频中是用impsg做的讲解,用那个实现起来比较简单,因为impsg文件对齐和内存对齐粒度一样,所以不需要考虑文件对齐和内存对齐,为了加深自己对PE文件的理解,事后我用notepad做实验时候总是出错,主要原因是notepad文件对齐和内存粒度不同导致FOA与RAW转换出错,最后将过程记录下来。文中难免有差错,请指正。

在此之前需要对Windows PE结构有个基本的了解。

方法①:

方法②: 用OllyDBG加载notepad,左下角command框中输入bp MessageBoxA下断点。查看断点即可得MessageBox地址为:0x77D507EA

main函数反汇编:

得到CALL的硬编码是E8
call func继续跟进去:

得到JMP的硬编码是E9
func函数反汇编:

观察到:

E8后边的值并不是真正我们要调用的函数地址, 他们有以下关系:

总结出:

通过之前的学习,可以构造出:

                                                                                 图1

图2具体信息.png

                                                                                图2  

从图2中可以得到以下信息:

计算文件中代码区空闲空间

SizeOfRawData(0x7800) - VirtualSize(0x007748) >  0x12

空闲空间大于shellcode长度,可以放得下。

PointerToRawData(0x0400)+SizeOfRawData(0x7800)=0x7C00,

在0x7B48与0x7C00之间写入shellcode:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/05/08
最新回复 (16)
雪    币: 47147
活跃值: (20405)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
感谢分享,这文章适合新手学习
2017-4-21 15:41
0
雪    币: 2347
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
构造PE和插shellcode是一个复杂的过程呢!
2017-4-21 16:13
0
雪    币: 6250
活跃值: (3315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享,这文章适合我等新手学习
2017-4-21 20:11
0
雪    币: 1427
活跃值: (4378)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
5
挺棒的
2017-4-23 19:21
0
雪    币: 8
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
这也能加精...
2017-4-23 19:57
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主有没研究过怎么直接调用messageboxa呢?最近在研究这个,怎么能直接得到messageboxa的地址,然后call一下,目前只能用call  [0042a2ac]去实现,但我用od调出了[0042a2ac]的值,然后直接call这个值,程序在od调试时能成功,但正常运行时出错。。,我在win10下的
2018-3-24 16:57
0
雪    币: 9011
活跃值: (1610)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
学习了,谢谢分享
2018-5-2 10:33
0
雪    币: 77
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了,谢谢分享。。。
2018-5-2 18:23
0
雪    币: 36
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢分享
2018-10-10 17:08
0
雪    币: 60
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
程序在内存中真正运行的地址怎么求啊,是FOA转RVA然后加上imagebase么,还有SectionAlignment和FileAlignment不相同的话和这个有关系么?
最后于 2019-4-17 16:40 被mb_nzrqtgjl编辑 ,原因:
2019-4-17 15:20
0
雪    币: 1398
活跃值: (863)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我的熊猫 楼主有没研究过怎么直接调用messageboxa呢?最近在研究这个,怎么能直接得到messageboxa的地址,然后call一下,目前只能用call [0042a2ac]去实现,但我用od调出了[00 ...
这个messagebox的地址不应该是1000 0000以后的值吗?
2019-10-25 22:17
0
雪    币: 1398
活跃值: (863)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mb_nzrqtgjl 程序在内存中真正运行的地址怎么求啊,是FOA转RVA然后加上imagebase么,还有SectionAlignment和FileAlignment不相同的话和这个有关系么?
真正的运行地址就是你用ue打开看到的地址减去pointertorawdata➕rva+基址就是就是真正运行的地址了,后边那两个就是文件中和内存中对齐的标准
最后于 2019-10-25 22:28 被zhuAE86编辑 ,原因: 写错了
2019-10-25 22:23
0
雪    币: 0
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主,有个地方不清楚。为什么用e8指令调用api,而不用ff 15指令。反汇编代码里面就是用的ff 15调用的messagebox。
2019-12-24 17:21
0
雪    币: 86
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
麻烦大佬看一下,实在不知道问题出在哪里。。
2019-12-30 21:50
0
雪    币: 194
活跃值: (79)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
64位pe程序怎么加messagebox?
2020-3-9 20:29
0
雪    币: 345
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
我在VS中所显示的MessageBox的反汇编压参不是6A 00。而是 

MessageBox(0, 0, 0, 0);
00007FF63C87173A 45 33 C9             xor         r9d,r9d  
00007FF63C87173D 45 33 C0             xor         r8d,r8d  
00007FF63C871740 33 D2                xor         edx,edx  
00007FF63C871742 33 C9                xor         ecx,ecx  
00007FF63C871744 FF 15 06 EA 00 00    call        qword ptr [__imp_MessageBoxA (07FF63C880150h)]  
不知道是什么情况。。
2021-3-15 10:28
0
游客
登录 | 注册 方可回帖
返回
//