首页
社区
课程
招聘
资源重建――为加壳生成可以压缩的资源段
发表于: 2006-7-17 21:41 7742

资源重建――为加壳生成可以压缩的资源段

2006-7-17 21:41
7742

PE(需要加载成RVA=OFFSET的形势)资源经过这个代码处理
会生成一份新的资源,这个资源

1。不能被编辑软件编辑,是混杂的。
2。ID=3/14/16/24 中需要保留的资源都已经移动到新的位置。
  原来的资源段可以压缩了。 另外:原来的资源移走的会清0
3。代码长度经过一点优化,只扫描1遍资源结构,使用递归算法。
  速度可能不是很快,但也不会慢。
4。我测试了几个没有问题,可能存在bug。

; ************** S U B R O U T I N E *****************************************

                        public start
start                   proc near
                        mov     ebp, 400000h            ; 测试代码
                        lea     eax, ds:402000h
                        push    eax
                        sub     eax, ebp
                        push    eax
                        push    ebp
                        mov     eax, [ebp+3Ch]
                        add     eax, ebp
                        mov     eax, [eax+88h]
                        add     eax, ebp
                        push    eax
                        call    restruc_rsrc

                        add     esp, 10h
                        retn

start                   endp

; ************** S U B R O U T I N E *****************************************

restruc_rsrc            proc    C       \
                                ibuf,   \
                                imgbase,\
                                rva,    \
                                obuf

                        local   level
                        local   gicon
                        local   numoficons
                        local   permuted
                        local   rmask
                        local   rtype
                        local   id

                        pusha
                        xor     eax, eax
                        mov     level, eax
                        mov     gicon, eax
                        mov     numoficons, eax
                        mov     permuted, eax
                        mov     rmask, 1014008h
                        mov     ebx, ibuf
                        mov     edi, obuf

@@recursive:
                        movzx   eax, word ptr [ebx+0Ch]
                        movzx   ecx, word ptr [ebx+0Eh]
                        add     eax, ecx
                        push    eax
                        mov     esi, ebx
                        lea     ebx, [edi+10h]
                        lea     ecx, [eax+2]
                        shl     ecx, 3
                        call    @@move

@@cycle:                dec     dword ptr [esp]
                        jl      @@done

                        cmp     permuted, 0
                        jnz     @@permuted

                        mov     ecx, [esp]
                        pusha
                        inc     permuted
                        mov     edx, ebx

@@permute_cycle:        mov     eax, [ebx]
                        cmp     eax, 0Eh
                        jnz     @@dont_swap

                        cmp     ebx, edx
                        jz      @@dont_swap

                        xchg    eax, [edx]
                        mov     [ebx], eax
                        mov     eax, [ebx+4]
                        xchg    eax, [edx+4]
                        mov     [ebx+4], eax

@@dont_swap:            add     ebx, 8
                        loop    @@permute_cycle

                        popa

@@permuted:             mov     esi, [ebx]
                        btr     esi, 1Fh
                        jnb     @@id

                        mov     eax, edi
                        sub     eax, obuf
                        bts     eax, 1Fh
                        mov     [ebx], eax
                        add     esi, ibuf
                        movzx   ecx, word ptr [esi]
                        lea     ecx, [ecx+ecx+2]
                        call    @@move

                        jmp     @@x1

; ----------------------------------------------------------------------------

@@id:                   cmp     level, 1
                        jg      @@x1

                        mov     id, esi
                        jz      @@x1

                        mov     rtype, esi

@@x1:
                        mov     edx, [ebx+4]
                        add     edx, ibuf
                        btr     edx, 1Fh
                        jnb     @@rsrc

                        mov     eax, edi
                        sub     eax, obuf
                        bts     eax, 1Fh
                        push    eax
                        inc     level
                        push    ebx
                        xchg    ebx, edx
                        call    @@recursive

                        pop     ebx
                        dec     level
                        jmp     @@fixup

; ----------------------------------------------------------------------------

@@rsrc:                 mov     eax, rtype
                        btr     rmask, eax
                        jnb     @@dont_move

                        cmp     eax, 3
                        jnz     @@x3

                        mov     esi, gicon
                        test    esi, esi
                        jz      @@dont_move

                        bts     rmask, eax
                        mov     eax, id
                        mov     ecx, numoficons

@@icon_cycle:           cmp     ax, [esi+0Ch]
                        jz      @@do_move

                        add     esi, 0Eh
                        loop    @@icon_cycle

                        jmp     @@dont_move

; ----------------------------------------------------------------------------

@@x3:
                        cmp     eax, 0Eh
                        jnz     @@do_move

                        push    edx
                        mov     eax, [edx+4]
                        sub     eax, 6
                        cdq
                        mov     ecx, 0Eh
                        div     ecx
                        mov     numoficons, eax
                        pop     edx

@@do_move:              mov     esi, edi
                        sub     esi, obuf
                        add     esi, imgbase
                        xchg    esi, [edx]
                        add     esi, ibuf
                        mov     ecx, [edx+4]
                        call    @@move

@@dont_move:            mov     eax, edi
                        sub     eax, obuf
                        push    eax
                        xchg    esi, edx
                        mov     edx, edi
                        push    10h
                        pop     ecx
                        call    @@move

                        cmp     numoficons, 0
                        jz      @@fixup

                        cmp     gicon, 0
                        jnz     @@fixup

                        mov     eax, [edx]
                        add     eax, ibuf
                        add     eax, 6
                        mov     gicon, eax

@@fixup:                pop     eax
                        mov     [ebx+4], eax
                        add     ebx, 8
                        jmp     @@cycle

; ----------------------------------------------------------------------------

@@move:                 cmp     esi, edi
                        jnz     @@move_cycle

                        add     edi, ecx
                        xor     ecx, ecx

@@move_cycle:           jecxz   @@return

                        movsb
                        and     byte ptr [esi-1], 0
                        dec     ecx
                        jmp     @@move_cycle

; ----------------------------------------------------------------------------

@@done:                 pop     eax
                        cmp     level, 0
                        jnz     @@return

                        popa
                        leave

@@return:
                        retn

restruc_rsrc            endp

; ----------------------------------------------------------------------------

                        end start


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
用完了就知道结果 谢谢
2006-7-17 21:46
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
等待牛人编译好再用。
2006-7-17 21:48
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
看不懂
2006-7-17 21:53
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
好多递归,完全看不懂,forgot的汇编真强,强烈建议加注释
2006-7-17 21:56
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
你的汇编怎么学的啊。高中就学这么好。有什么秘笈啊,不要说葵花宝典啊。^_^
2006-7-18 00:28
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
不懂!!
2006-7-18 02:11
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
注释

;
; RESOURCE RESTURCE ENGINE v1.00 
;
; forgot / iPB 2006
;
;
; 1. swap root entries, make GROUP ICON first
; 2. when Id=24/16/14, move 1st one
; 3. when Id=3, query GROUP ICON table, if being in, move it.
; 4. otherwise would be preserved
; 5. the subrountine makes a compressable rsrc section.
;    it's not made for ResEditor, take care!
; 6. I just scan once, with a little optimized(size) code

restruc_rsrc		proc	C	\
				ibuf,	\
				imgbase,\
				rva,	\
				obuf

			local	permuted
			local	level
			local	rtype
			local	id
			local	gicon
			local	numoficons
			local	rmask

; ---------------------------------------------------------------------------

			pusha

			xor	eax, eax
			mov	level, eax
			mov	gicon, eax
			mov	numoficons, eax
			mov	permuted, eax
			
			mov	rmask, 1000000010100000000001000b
							; 1<<3 | 1<<14 | 1<<16 | 1<<24

			mov	ebx, ibuf
			mov	edi, obuf			

; ---------------------------------------------------------------------------

@@recursive:		movzx	eax, word ptr [ebx+0Ch]
			movzx	ecx, word ptr [ebx+0Eh]
			add	eax, ecx

			mov	esi, ebx
			lea	ebx, [edi+10h]		; ebx -> copied entries
			lea	ecx, [eax+2]		; size = 10h + eax * 8
			shl	ecx, 3
			call	@@move

			push	eax			; # of entries

; ---------------------------------------------------------------------------

@@cycle:		dec	dword ptr [esp]
			jl	@@done

; ---------------------------------------------------------------------------

			cmp	permuted, 0
			jne	@@permuted

			mov	ecx, [esp]

			pusha
			inc	permuted

			mov	edx, ebx		; edx -> 1st entry

@@permute_cycle:	mov	eax, [ebx]
			cmp	eax, 14
			jne	@@dont_swap
			cmp	ebx, edx
			je	@@dont_swap

			xchg	eax, [edx]		; [edx] <--> [ebx]
			mov	[ebx], eax

			mov	eax, [ebx+4]
			xchg	eax, [edx+4]
			mov	[ebx+4], eax
			
@@dont_swap:		add	ebx, 8
			loop	@@permute_cycle
			popa

@@permuted:

; ---------------------------------------------------------------------------

			mov	esi, [ebx]
			btr	esi, 31
			jnc	@@id

			mov	eax, edi		; update name ofs
			sub	eax, obuf
			bts	eax, 31
			mov	[ebx], eax

			add	esi, ibuf
			movzx	ecx, word ptr [esi]	; unicode
			lea	ecx, [ecx+ecx+2]
			call	@@move

			jmp	@@x1

; ---------------------------------------------------------------------------

@@id:			cmp	level, 1
			jg	@@x1
			mov	id, esi			; <= 1
			je	@@x1
			mov	rtype, esi		; == 0
@@x1:

; ---------------------------------------------------------------------------

			mov	edx, [ebx+4]
			add	edx, ibuf
			btr	edx, 31
			jnc	@@rsrc

			mov	eax, edi		; next level directory
			sub	eax, obuf
			bts	eax, 31
			push	eax			; update l8r

			inc	level

			push	ebx			
			xchg	ebx, edx
			call	@@recursive
			pop	ebx

			dec	level
			jmp	@@fixup

; ---------------------------------------------------------------------------

@@rsrc:			mov	eax, rtype
			btr	rmask, eax
			jnc	@@dont_move

			cmp	eax, 3
			jne	@@x3

			mov	esi, gicon
			test	esi, esi
			je	@@dont_move

			bts	rmask, eax

			mov	eax, id
			mov	ecx, numoficons

@@icon_cycle:		cmp	ax, [esi+0Ch]
			je	@@do_move
			add	esi, 0Eh
			loop	@@icon_cycle

			jmp	@@dont_move


; ---------------------------------------------------------------------------

@@x3:			cmp	eax, 14
			jne	@@do_move

			push	edx
			mov	eax, [edx+4]
			sub	eax, 6
			cdq
			mov	ecx, 0Eh
			div	ecx
			mov	numoficons, eax
			pop	edx

; ---------------------------------------------------------------------------

@@do_move:		mov	esi, edi
			sub	esi, obuf
			add	esi, rva
			xchg	esi, [edx]
			add	esi, imgbase
			mov	ecx, [edx+4]
			call	@@move

; ---------------------------------------------------------------------------

@@dont_move:		mov	eax, edi
			sub	eax, obuf
			push	eax			; update l8r

			xchg	esi, edx
			mov	edx, edi

			push	10h
			pop	ecx
			call	@@move

; ---------------------------------------------------------------------------

			cmp	numoficons, 0
			je	@@fixup
			cmp	gicon, 0
			jne	@@fixup

			mov	eax, [edx]
			add	eax, imgbase
			add	eax, 6
			mov	gicon, eax

; ---------------------------------------------------------------------------

@@fixup:		pop	eax
			mov	[ebx+4], eax

			add	ebx, 8
			jmp	@@cycle

; ---------------------------------------------------------------------------

@@move:			cmp	esi, edi
			jne	@@move_cycle

			add	edi, ecx
			xor	ecx, ecx

@@move_cycle:		jecxz	@@return
			movsb
			and	byte ptr [esi-1], 0
			dec	ecx
			jmp	@@move_cycle

; ---------------------------------------------------------------------------

@@done:			pop	eax

			cmp	level, 0
			jne	@@return

			popa
			leave

@@return:		retn

; ---------------------------------------------------------------------------

restruc_rsrc		endp
2006-7-18 02:46
0
雪    币: 206
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对汇编
慢慢琢磨
2006-7-18 09:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
汗.............差距啊.......
2006-7-18 09:53
0
游客
登录 | 注册 方可回帖
返回
//