修改进程常量的几种方法.docx
《修改进程常量的几种方法.docx》由会员分享,可在线阅读,更多相关《修改进程常量的几种方法.docx(8页珍藏版)》请在三一办公上搜索。
1、1. 引言本文笔者在研究某著名软件的安全性时,碰到要修改进程中只读数据段(.rdata冲的常量 值的场景。笔者将这方的方法技巧及相关的经验向广大读者朋友进行分享,同时由于笔者技术水平有限,本文中若有错误恳请不吝赐教)。图-1修改常量值的程序代码修改常量值,为避免编译t昔误,直 接修改内存而不能Kffio为了简单的说明问题,笔者使用delph 1写了一个小示例程序(其实,使用什么语言并不 重要,本示例程序只是为了分析问题,并验证问题解决思路是否正确,从严格意义来说该示 例也有许多不严谨之处,例如因为编译器不同对字符串常量的处理也是不同的,但这些细节 问题我们暂时可以忽略),在本示例程序中,声明了
2、一个全局常量,在程序中动态修该常量 值,看看运行下过如何。write Log (1 =改p Co list := 0G_Name 1;write Log (1常的地址:twrite Log ( t G_Narn& ;.一 wrj匕已Lou L)F始 普竦艳”址日 Naiumm肖+,wri teLog C m-恐可而T日段示倒稗L HH1 KEl Mfil *LMB LJ-25 Q9 06】 LA03 L3:咨网 411 LCr&5 L3 5方仙相 LCHJ3; L3 5 细5 LCrOi l3.S_ 44tl*a3H!iit: iee 盾M配 Ibmllllthii it 00Mt TklEH
3、NW! H Hs 夺值 *(Aec*xx -vialitidn *L *ldr*xxtn no did* Bfi it aiWmo. kkb Kritt of tjddr*ii. UHE04修改常量值报写内存措误作杆差.眼墨谨同黄却遂鲂IS布充,姓和TFft丈*抵雷史EW击 QQ: 7Q75W12.图-2运行程序修改常量值报写内存错误如图-2所示,运行示例程序修改常量值,会报写内存错误。当然,本示例只是修改本进 程中的常量值,在实际的生产环境没有太大的实际意义,笔者使用该示例只是聚焦问题本质, 简化实际场景。在软件安全研究领域,经常需要修改第三方进程注入常量的只读数据中的数 据,分析思路和方法
4、是相同的,笔者接下来,将围绕该示例对报错原因进行深入分析,并且 给出该问题的解决方法。2. 问题分析本小节笔者对在进程运行期间修改常量值报写内存错误的原因进行分析。笔者曾看到过 一篇博客博客,其作者认为常量的只是在编译期间进行检查其值是否发生变化,在运行期间 常量的值是可以修改的。这个观点是错误的(至少来说是不准确的)。在程序运行期间常量 的值也是不可以修改的,那么这是如何做到的呢?在进程中一般都含有三个S(section),代码段(.text),数据段(.data),只读数据段(.rdata), 段的名称会因为编译器不同而有差异,微软的C,C+编译器一般将代码段命名为.text”,数 据段名
5、为“.data”,只读数据段命名为.rdata”。Borlad的pascal和C+编译器将代码段名 为”CODE”,数据段命名为DATA”,只读数据段名为”.rdata”。代码段(.text)的访问控制属性是可执行,可读,不可写的。数据段的访问控制属性是可 读写。只读数据段(.rdata)中的访问控制属性是只读的,资源文件,动态链接库导入表,常量 一般都存储在该段。如果本进程或者外部进程中的代码尝试写不可读内存,则会触发异常。 常量具体存储在哪个数据段,会因编译器的不同而有差异,但其所在段的访问控制属性应该 是不可写的。该结论的分析过程如下。2.1使用CE查看示例程序中全局变量内存在图-2示例
6、程序运行的日志中可以得知全局常量G_Name的内存地址为0x00452700, 使用CE(Cheat Engine是一款内存分析、修改的工具,和IDA,OD并称为逆向分析的三剑 客)查看到全局变量G_Name所在页的基地址为0x0045200,内区页的访问控制属性是可执 行/只读,故写内存操作会触发异常。那么,全局量G_Name在哪个段(Section)呢?根据其 访问控制属性来看其应该是在代码段,该推论是否正确呢?图-3使用CE查看示例程序内存2.2分析示例程序的PE头在PE文件头中会对程序的段信息详细的描述,如图-4和图-5所示,使用UE打开示 例程序RDataSectionDemo.ex
7、e所呈现PE文件头。关于PE文件结构细节,本文不再展开叙 述,后续如果时间允许,笔者会写一篇专本关于PE文件分析的文章。如图-4所示,在PE文件的IMAGE_NT_HEADER中可以看出示例程序共分为8个段。如 图-5所示可看出这8个段分别为CODE段、DATA段、BSS段、.idata段、.tls段、.rdata 段-reloc段、.rsrc段。每个段头40字节,包括段名,段大小,段RAV地址,段属性信息。 笔者不再对每个段进行一一分析,重点分析代码段(CODE,在其它编译器编译的目标程序中 通常叫.text)。如图-5所示,代码段的RAV地址0x00001000,根据该地址加上exe的基地
8、址 0x00400000(默认是该基地址,在程序编译时可以设置为不同的值)计算出代码段的虚拟基 地址(VA)是0x00401000。代码段的大小(未页对齐)0x00052054,win32默认的内存页 的大小4K,内存页对齐后大小为0x00053000,据此可以推算出代码段的虚拟地址(VA)的范 围是 0x004010000x00454000o同样如图-5所示,可以看出代码段的属性为0x60000020=0x40000000 or 0x20000000 or 0x00000020。其中 0x40000000 表示据段可读,0x20000000 表示段可执行,0x0000002 表示段中包含代码
9、。根据2.1节所分析的全局变量的地址(虚拟地址VA)为0x00452700可以的得出全局常量G_Name是在代码段(CODE段)中的结论,同时根据段属性的分析也佐证了这一点。由于代码段访问控制属性是可执行/只读,所以在修改全局常量的值时会触发异常。OODOOCi5DhOODOOOeDhOQDOQO-3DhOEgCHiQhDQDOQOvDh DggOhOQDOQOOOhOOQCimDhOODOOCl2DhOODQQjbDhoomo-cohODDOQOdDhjijDOGOSDhggg眼ClDDOQClaDhdDDOai&DhOODQQllDh0000013DhODDOOLDhOODOOKDhoom
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 修改 进程 常量 方法
链接地址:https://www.31ppt.com/p-5013289.html