学生黑客联盟-官网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 276|回复: 10

PE文件笔记九 实战之HOOK程序添加弹窗续

[复制链接]

该用户从未签到

12

主题

12

帖子

62

积分

网站信息宣传员

Rank: 7Rank: 7Rank: 7

积分
62
发表于 2021-9-14 13:57:34 | 显示全部楼层 |阅读模式
继续PE系列笔记的更新
PE其它笔记索引可前往:
PE文件笔记一 PE介绍
在前面的PE文件笔记八 实战之HOOK程序添加弹窗中能够使用OD达到在运行态时添加弹窗的功能,接下来则要对先前的反汇编的硬编码稍作修改然后插入到PE文件中,最后再修改入口点即可;具体流程在上个笔记已经说明了,这里不再赘述
PE实战之给程序添加弹窗续

最终效果图

先看一下最终的效果图
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(1)
反汇编和硬编码的对应关系

因为后面要将反汇编代码转换为硬编码,于是这里就要研究一下两者的对应关系
先贴上先前得到的反汇编代码
  1. 00401130 >    6A 00         push 0x0
  2. 00401132      68 52114000   push MessageB.00401152
  3. 00401137      68 48114000   push MessageB.00401148
  4. 0040113C      6A 00         push 0x0
  5. 0040113E      E8 A7F69477   call user32.MessageBoxA
  6. 00401143    - E9 8801C4FF   jmp 000412D0
  7. 00401148      6c            db 6c
  8. ........
复制代码
push对应硬编码

压入的第一个和第四个参数是一个立即数0,于是它对应的硬编码固定为6A 00
  1. 00401130 >    6A 00         push 0x0
  2. 0040113C      6A 00         push 0x0
复制代码
前面的6A是固定的,表示压入一个立即数,
后面的字节码表示压入的立即数,该立即数 的范围是0~0x7F即0~127
当立即数大于0x7F后硬编码和其含义就都改变了
  1. 6A 7F         push 0x7F
  2. 68 80000000   push 0x80
复制代码
于是得到了push 立即数 对应的硬编码为6A 立即数
压入的第二个和第三个参数是内存地址0x00401152中存储的数据和0x00401148中存储的数据
  1. 00401132      68 52114000   push MessageB.00401152
  2. 00401137      68 48114000   push MessageB.00401148
复制代码
观察硬编码和压入的地址的关系
前面的68是固定的,表示push 一个内存地址
后面的则是要push的内存地址的小端存储,倒过来看就是压入的内存地址了
举个例子,如果push 的内存地址为0x12345678
则其对应的硬编码为 68 78 56 34 12
  1. 68 78563412   push 0x12345678
复制代码
于是得到了push 内存地址 对应的硬编码为 68 内存地址的小端存储
call对应硬编码

接下来就是调用MessageBoxA了,其形式为:call MessageBoxA对应的内存地址
  1. 0040113E      E8 A7F69477   call user32.MessageBoxA
  2. 上面为OD的反汇编引擎为方便我们观看,而显示的内容,下面才是实际的反汇编代码
  3. 0040113E      E8 A7F69477   call 77D507EA
复制代码
分析call 内存地址 和 硬编码的关系
前面的E8是固定的,表示直接调用一个内存地址
后面的则是偏移,该偏移为小端存储,此时值为:0x7794F6A7
不难发现这个偏移 = call的内存地址 - 当前的内存地址 - 当前指令的总长度
即 0x7794F6A7 = 0x77D507EA - 0x0040113E - 5
再举个例子,如果当前要跳转的内存地址为0x12345678
则其对应的 偏移 = 0x12345678 - 0040113E - 5 = 11F44535
  1. 0040113E      E8 3545F411   call 12345678
复制代码
于是得到了call 内存地址 对应的硬编码为 E8 偏移的小端存储,其中偏移 = 要调用的内存地址 - 当前的内存地址 - 当前指令的总长度
jmp对应硬编码
  1. 00401143    - E9 8801C4FF   jmp 000412D0
复制代码
前面的E9是固定的,表示跳转到一个内存地址
后面的也是偏移,该偏移为小端存储,此时值为:0xFFC40188
偏移 = jmp的内存地址 - 当前的内存地址 - 当前指令总长度
即 0xFFC40188 = 0x000412D0 - 0x00401143 - 5
于是得到了jmp 内存地址 对应的硬编码为 E9 偏移的小端存储,其中偏移 = 要跳转的内存地址 - 当前的内存地址 - 当前指令总长度
寻找空白区

知道了硬编码如何构造以后,就要在PE文件中找一块空白区,向里面写入要执行的硬编码
有了先前PE文件笔记二 PE文件的两种状态的知识,可以知道由于文件对齐,在块表和块之间是存在空隙(空白区)的,于是可以向这块区域写入硬编码
这次用来演示的软件是前面经常出场的EverEdit.exe,直接找到其对应的空白区:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(2)
构造硬编码

找到空白区的地址为0x2B0,注意此时的地址为文件中的状态
在内存中其对应的地址为ImageBase+0x2B0 = 0x00400000+0x2B0 = 0x004002B0
PS:如果选取的空白区为块中的空白区,则需要进行FOA到VA的转换,相关内容在PE文件笔记七 RVA与FOA转换已说明,这里不再赘述
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(3)
于是从这里开始构造硬编码
根据前面反汇编一行一行来构造硬编码
  1. 00401130 >    6A 00         push 0x0
  2. 00401132      68 52114000   push MessageB.00401152
  3. 00401137      68 48114000   push MessageB.00401148
  4. 0040113C      6A 00         push 0x0
  5. 0040113E      E8 A7F69477   call user32.MessageBoxA
  6. 00401143    - E9 8801C4FF   jmp 000412D0
  7. 00401148      6c            db 6c
复制代码
push 参数

1.push 0 直接用6A 00填充,无需修改
2.push 内存地址,该内存地址存储第二个参数"tips",因为内存地址尚未填充,先用00代替,为 68 00 00 00 00
3.push 内存地址,该内存地址存储第三个参数"lyl610abc",同样先用00代替,为 68 00 00 00 00
4.push 0 直接用6A 00填充,无需修改
于是得到的硬编码为:6A 00 68 00 00 00 00 68 00 00 00 00 6A 00,将其写入文件中:
  1. 6A00680000000068000000006A00
复制代码
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(4)
call MessageBoxA

call 内存地址,要call的内存地址为MessageBoxA对应的地址,在本机中为0x77D507EA
此时的内存地址为ImageBase+0x2BE= 0x004002BE
于是可以算出 偏移 = 要跳转的地址 - 内存地址 - 当前指令总长度 = 0x77D507EA - 0x004002BE -5 = 0x77950527
于是得到的硬编码为 E8 27 05 95 77,将其写入文件中:
  1. E827059577
复制代码
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(5)
jmp 程序入口点

所谓的程序入口点就是 扩展PE头中的AddressOfEntryPoint + ImageBase得到的内存地址
在先前的PE文件笔记五 PE文件头之扩展PE头中其实已经看过了,这里再用PE工具:Detect It Easy查看一下:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(6)
可以得到AddressOfEntryPoint 为0x16AF12,加上ImageBase得到0x56AF12
于是要跳转的地址就是0x56AF12,对应汇编为 jmp 0x56AF12
此时的内存地址为ImageBase+0x2C3 = 0x004002C3
偏移 = 要跳转的地址 - 此时的内存地址 - 当前指令的总长度 = 0x56AF12 - 0x004002C3 - 5 = 0x0016AC4A
于是得到对应的硬编码为 E9 4A AC 16 00,将其写入文件中:
  1. E94AAC1600
复制代码
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(7)
填充字符串ASCII码
参数含义字符串ASCII文件中起始地址内存中起始地址
第三个参数窗口内容lyl610abc6C796C363130616263002C8004002C8
第二个参数窗口标题tips74697073002D2004002D2
填充完如下:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(8)
修正参数

填充完字符串就可以修正参数了
第二个参数 为 push  0x004002D2,对应"tips",对应硬编码为68 D2 02 40 00
  1. 68D2024000
复制代码
第三个参数为  push  0x004002C8,对应"lyl610abc",对应硬编码为68 C8 02 40 00
  1. 68C8024000
复制代码
修正完的结果为:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(9)
所有的硬编码
  1. 6A0068D202400068C80240006A00E827059577E94AAC16006C796C363130616263007469707300
复制代码
修改程序入口点

构造完硬编码后,只要将程序入口点改为硬编码的首地址:0x2B0即可
找到原本的程序入口点

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(10)
修改程序入口点

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(11)
保存程序并测试运行

最后便是将程序保存,然后打开
保存

我这里另存为了EverEdit2.exe
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(12)
测试运行

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍在前面的PE文件笔记八 实战之HOOK程序(13)
可以看到能够成功地为程序添加弹窗,完毕(~ ̄▽ ̄)~
说明

测试的系统务必为32位的XP系统,在高版本的系统有DEP和ASLR保护机制,使用以上方法修改后无法运行
上面的MessageBoxA的地址是用OD获取的,具体方法见上一篇笔记,如果想要复现为程序添加弹窗,则要修改对应的MessageBoxA的地址
附件

附上本笔记中要修改的EverEdit文件:点我下载

该用户从未签到

3

主题

1617

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-9-14 13:57:52 | 显示全部楼层
因为我这里的空白区取的是节表和节之间的空白区,可能是不具备对应的可执行权限
一般来说是要取的空白区是具备权限的、在节和节之间的那片空白区
回复

使用道具 举报

该用户从未签到

1

主题

1574

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-9-14 13:57:57 | 显示全部楼层
我特地修改为节和节之间具备权限的空白区后去测试了,在WIN10 x64上没有c0000007b报错了
但由于ASLR(地址随机化)的原因 无法push直接的内存地址了,只能改为全部改为push 0,然后修正一下MessageBoxA的地址即可正常运行了:
运行结果: 网络新闻动向交流-我特地修改为节和节之间具备权限的空白区后去测试了,在WIN10 x64上没有c0000007b报错了但由于ASLR(地址(14) 网络新闻动向交流-我特地修改为节和节之间具备权限的空白区后去测试了,在WIN10 x64上没有c0000007b报错了但由于ASLR(地址(15)
回复

使用道具 举报

该用户从未签到

3

主题

1617

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-9-14 13:58:40 | 显示全部楼层
因为高版本系统有 ASLR(地址随机化)和DEP(数据执行保护) 两种系统保护机制
由于地址的随机化,和插入代码权限不匹配的原因是无法执行的
并且不同系统的MessageBoxA是不同的,这次添加的弹窗的代码是一种伪ShellCode
很多内容要到后面才好说明,这次的例子主要是为了巩固PE知识,也就不再继续深入了
回复

使用道具 举报

该用户从未签到

3

主题

1617

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-9-14 13:59:32 | 显示全部楼层
测试的系统务必为32位的XP系统?
我修改程序入口后程序直接c0000007b报错,我程序入口改到其他空白区就能打开
回复

使用道具 举报

该用户从未签到

3

主题

1617

帖子

893

积分

高级会员

Rank: 4

积分
893
发表于 2021-9-14 13:59:52 | 显示全部楼层
经验+1:lol:lol,坐等扩大节
回复

使用道具 举报

该用户从未签到

1

主题

1574

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-9-14 14:00:44 | 显示全部楼层
先前我所写的RVA和FOA的转换有些错误,正在改正,也在补充FOA转RVA的内容
回复

使用道具 举报

该用户从未签到

1

主题

1574

帖子

1045

积分

金牌会员

Rank: 6Rank: 6

积分
1045
发表于 2021-9-14 14:01:13 | 显示全部楼层
类似的文章读过一次。用到的时候找不到。我总是不肯下功夫。
回复

使用道具 举报

该用户从未签到

0

主题

1683

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-9-14 14:01:59 | 显示全部楼层
哎,汇编真是好东西啊
回复

使用道具 举报

该用户从未签到

0

主题

1683

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-9-14 14:02:20 | 显示全部楼层
好东西  收藏~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭Powered by ©科大讯飞语音云

QQ|Archiver|手机版|小黑屋|TBC ( 鄂ICP备19004742号(鄂ICP备19004742号-2) )|网站地图|鄂ICP备19004742号(鄂ICP备19004742号-2) 联系站长

GMT+8, 2021-9-23 14:26 , Processed in 0.859375 second(s), 66 queries .

Powered by TBC! X3.4

© 2001-2020 TBC.. 技术支持 by 复仇者黑客组织

快速回复 返回顶部 返回列表