欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

【成果6.4】软件保护壳技术专题 - 加密资源节

【成果6.4】软件保护壳技术专题 - 加密资源节

什么是WINDOWS的资源这里就不提了。写过WIN程序的人应该都晓得了。如果没写过,那么。。。建议去写哈。
关于加密资源节,也是加壳过程中的一个可选项而已。加和不加都不太对破解造成影响。但是如果
你的程序中,有一些重要数据在资源节里面而你又不想让其他人通过资源浏览器参看到,那么这个
时候加密资源节就有必要了。在这里节,我们首先了解一下资源节在PE文件中的结构。其次,编写
一个简单的资源浏览器用于熟悉资源节的结构。最后,完成一个加密与解密资源节的小程序。
资源节可以说在PE结构中最复杂的一个结构了。整体是一个2叉树结构。
总共有3层。第一层是类型,第二层是名称,第三层是语言,在语言后面就是一个指向资源数据的位置的结构了。
下面将资源节的结构如图:
资源节结构图:
附件中查看 呵呵。。。
资源节处于数据目录的第三项可以通过微软预定义的宏IMAGE_DIRECTORY_ENTRY_RESOURCE来定位资源
节的数据目录。通过VirtualAddress转换文件偏移 + 文件映射地址就得到了资源节所在文件的位置
节内容的起始是一个被称为资源目录表的结构,如下:
IMAGE_RESOURCE_DIRECTORY STRUCT
    Characteristics dd      ?
    TimeDateStamp dd        ?
    MajorVersion dw         ?
    MinorVersion dw         ?
    NumberOfNamedEntries dw ?
    NumberOfIdEntries dw    ?
IMAGE_RESOURCE_DIRECTORY ENDS
Characteristics:资源标志,保留,设置为0
TimeDataStamp:时间戳,由资源编译器设定
MajorVersion:主版本号,由用户设定
MinorVersion:次版本号,由用户设定
以下这两项是我们说要关心的
NumberOfNamedEntries:通过字符串来定义的资源
NumberOfIdEntries:用过序号来定义的资源
这两项的和为引入资源的总数,在这个结构后面是一组由IMAGE_RESOURCE_DIRECTORY_ENTRY组成的数组
具体个数为NumberOfNamedEntries + NumberOfIdEntries
以下为结构的说明:
IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT
    union
        rName    RECORD NameIsString:1,NameOffset:31
        Name1 dd ?
        Id dw ?
    ends
    union
        OffsetToData dd ?
          rDirectory    RECORD DataIsDirectory:1,OffsetToDirectory:31
    ends
IMAGE_RESOURCE_DIRECTORY_ENTRY ENDS
这个结构在不同的位置是不同的意义。
在第一层的为类型,Name1代表的是一个类型,在资源类型方面有16个基本类型
"RT_CURSOR"
"RT_BITMAP"
"RT_ICON"
"RT_MENU"
"RT_DIALOG"
"RT_STRING"
"RT_FONTDIR"
"RT_FONT"
"RT_ACCELERATOR"
"RT_RCDATA"
"DIFFERENCE"
"RT_GROUP_CURSOR"
"RT_GROUP_ICON"
"RT_VERSION"
也有更多的类型,这方面的资料很少。我也没有能收集全,RT_RCDATA类型表示为自定义的。
这里为标准的类型值。
在第二层时:如果Name的2进制最高位时候1,那么它表示一个以名字引出的资源,此时Name的低2位表示一个从资源节开头到它的偏移
使用Name的低2位值 + 资源节开头的地址 指向一个IMAGE_RESOURCE_DIRECTORY_STRING结构。资源的名字使用UNICODE编码。
IMAGE_RESOURCE_DIRECTORY_STRING STRUCT
    Length1 dw      ?
    NameString db   ?
IMAGE_RESOURCE_DIRECTORY_STRING ENDS
Length1表示有几个字母
NameString为以双0结尾的UNICODE字符串。
在第三层时,Name表示资源所用语言的代码。
OffsetToData:这个字段在不同层都表示一个到资源节开头的偏移。
不同的是,如果OffsetToData的2进制最高位是1,表示还有下面的其他层(语言层或者名字层,类型层总是存在)。
如果是0,则表示一个到IMAGE_RESOURCE_DATA_ENTRY的偏移
IMAGE_RESOURCE_DATA_ENTRY STRUCT
    OffsetToData dd ?
    Size1 dd        ?
    CodePage dd     ?
    Reserved dd     ?
IMAGE_RESOURCE_DATA_ENTRY ENDS
OffsetTOData表示到资源数据的偏移,这个偏移是到加载地址(ImageBase)的偏移。
Size1为数据的长度
CodePage:一般为0
Reserved:一般为0
接下来看段代码可能会更清晰一些。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功