首页
社区
课程
招聘
[成果6.4]软件保护壳技术专题 - 加密资源节
发表于: 2008-7-10 21:27 22839

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

2008-7-10 21:27
22839

什么是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

接下来看段代码可能会更清晰一些。

ResViewEntry proc uses ebx ecx edx edi esi pEntry : LPVOID, dwLevel : DWORD
    LOCAL szOutFileName[MAX_PATH] : BYTE
;; level = 0,1,2

    mov esi, pEntry
    assume esi : ptr IMAGE_RESOURCE_DIRECTORY
    [COLOR=Red];; 计算有几个资源在当前目录下[/COLOR]
    mov cx, word ptr [esi].NumberOfNamedEntries
    add cx, word ptr [esi].NumberOfIdEntries
    movzx ecx, cx
    [COLOR=Red];; 这里存在着ecx个IMAGE_RESOURCE_DIRECTORY_ENTR[/COLOR]Y
    add esi, sizeof IMAGE_RESOURCE_DIRECTORY
    mov edi, esi
    assume edi : ptr IMAGE_RESOURCE_DIRECTORY_ENTRY
ResDirEntryLoop:
   [COLOR=Red] ;; 打印资源层[/COLOR]
    invoke JudegeResourceEntryLevel, edi, dwLevel
    mov eax, dword ptr [edi].OffsetToData
    test eax, FIRSTBIT
    jz FoundTheDataEntry
    and eax, 0000FFFFh
    add eax, g_pResSection
    mov edx, dwLevel
    inc edx
    invoke ResViewEntry, eax, edx
    jmp ContinueResDirEntryLoop
    FoundTheDataEntry:
    [COLOR=Red];; 取出资源文件[/COLOR]
    add eax, g_pResSection
    assume eax : ptr IMAGE_RESOURCE_DATA_ENTRY
    mov edx, dword ptr [eax].Size1
    mov eax, dword ptr [eax].OffsetToData
    [COLOR=Red];; 转化RVA到偏移[/COLOR]
    invoke RVA2Offset, g_pMem, eax
    push eax
    push ecx
    push edx
    invoke wsprintf, addr szOutFileName, offset g_szOutOrdFormat, eax
    pop edx
    pop ecx
    pop eax
    add eax, g_pMem
    invoke OutputToFile, addr szOutFileName, eax, edx
    ContinueResDirEntryLoop:
    add edi, sizeof IMAGE_RESOURCE_DIRECTORY_ENTRY      
    dec ecx
    test ecx, ecx
    jnz ResDirEntryLoop
    
    
    assume esi : nothing
    assume edi : nothing
    ret

ResViewEntry endp

JudegeResourceEntryLevel proc uses ebx ecx edx edi esi pResEntry : LPVOID, dwLevel : DWORD
    LOCAL szTmpBuf[MAX_PATH] : BYTE
    
    ;; init local variable
    mov ecx, MAX_PATH
    lea edi, szTmpBuf
    xor eax, eax
    cld
    rep stosb
    
    mov edi, pResEntry
    assume edi : ptr IMAGE_RESOURCE_DIRECTORY_ENTRY
    mov eax, dwLevel
       
    cmp eax, 0
    jnz JudgeLevelOne
    [COLOR=Red];; 显示类型[/COLOR]
    mov eax, dword ptr [edi].Name1
    invoke ShowResourceType, eax
    jmp ExitJudgeLevel
JudgeLevelOne:
    cmp eax, 1
    jnz JudgeLevelTwo
    [COLOR=Red];; 显示名称[/COLOR]
    mov eax, dword ptr [edi].Name1
    [COLOR=Red];; 最高位是0时表示使用ID[/COLOR]
    test eax, FIRSTBIT
    jz UseID
    and eax, 0000FFFFh
    add eax, g_pResSection
    assume eax : ptr IMAGE_RESOURCE_DIR_STRING_U
    lea esi, [eax].NameString
    lea edi, szTmpBuf
    [COLOR=Red];; 拷贝字符串到局部变量[/COLOR]
    mov cx, word ptr [eax].Length1
    movzx ecx, cx
    cld
    rep movsw
    invoke crt_printf, offset g_szOutFormat, offset g_szResNameByStr
    invoke crt_wprintf, addr szTmpBuf
    invoke crt_printf, offset g_szOutFormat, offset g_szEndLine
    jmp ExitJudgeLevel                
    UseID:
    invoke crt_printf, offset g_szResNameById, eax   
    jmp ExitJudgeLevel
JudgeLevelTwo:
    [COLOR=Red];; 第三次是语言,这里输出语言定义的常量[/COLOR]
    mov eax, dword ptr [edi].Name1
    invoke crt_printf, offset g_szResLang, eax
ExitJudgeLevel:
    assume eax : nothing
    assume edi : nothing
    ret

JudegeResourceEntryLevel endp

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (31)
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
2
没人顶,,, 自己做沙发。。。
2008-7-10 23:38
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
我来顶~~~~加密资源很好~~~~
2008-7-11 00:06
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习学习.要打印出来慢慢看. 感谢玩命.
2008-7-11 03:46
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
资源乱糟糟啊

顶/...
2008-7-11 04:02
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
太失误了`~~
一直在跟这个专题,竟然到现在没有坐过沙发`~~
2008-7-11 14:35
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
7
跟着玩命学习。
2008-7-11 14:53
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
只能看懂asm。让写写不出来完整的。

所以这个专题对偶等菜鸟是只能束之高阁

还是顶一下。
2008-7-11 16:34
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
9
多谢大家支持。。。
2008-7-11 17:11
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
有时间一定好好学习~
2008-7-11 18:08
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
努下學~~~~~~~
2008-7-11 19:29
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
12
谁抢了我的板凳
2008-7-12 00:43
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
一定好好学习  ..
2008-7-12 04:23
0
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
14
美丽破船,是全面发展啊!!!
2008-7-13 22:53
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
由于太强了,只能观望一下,收藏
2008-7-14 00:39
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
16
友情up up
2008-7-14 09:19
0
雪    币: 359
活跃值: (435)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
17
确实不错,顶一下,呵,
2008-7-14 20:37
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
XOR了一哈
2008-8-30 16:20
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习了,支持
2008-8-30 22:23
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习下
2008-8-30 23:42
0
雪    币: 219
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
留位,有待研究...
2008-10-19 22:13
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=;]...[/QUOTE]
来此地支持一下,最近正在研究这个东西
2009-2-8 18:05
0
雪    币: 246
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
下载研究下了
2009-3-6 11:04
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
原理的东西越多越好呀,我对这些知识很多的不太理解透
2009-3-6 14:17
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
学习,顶一个
2009-4-14 01:53
0
游客
登录 | 注册 方可回帖
返回
//