📄 rlp.asm
字号:
ADD EAX,12
.if DWORD PTR[EAX] == 0
MOV DLLPointer,0
.endif
.endw
.endif
;------------------------------------------------------------------
; Strip IAT
;
;
MOV EAX,FileMapVA
ADD EAX,3Ch
ADD AX,WORD PTR[EAX] ;WinME/98/95 compatibility!
SUB AX,3Ch ;
MOV EBX,DWORD PTR[EAX+0D8h]
MOV ECX,DWORD PTR[EAX+0DCh]
.if EBX > 0 && ECX > 0
ADD EBX,ImageBase
INVOKE ConvertVA2FO,FileMapVA,EBX
ADD EAX,FileMapVA
INVOKE RtlZeroMemory,EAX,ECX
.endif
;------------------------------------------------------------------
; Strip export table
;
;
.if oExportTable == 1 && IsDll == 0
MOV EAX,FileMapVA
ADD EAX,3Ch
ADD AX,WORD PTR[EAX] ;WinME/98/95 compatibility!
SUB AX,3Ch ;
MOV EBX,DWORD PTR[EAX+78h]
MOV ECX,DWORD PTR[EAX+7Ch]
.if EBX > 0 && ECX > 0
ADD EBX,ImageBase
INVOKE ConvertVA2FO,FileMapVA,EBX
ADD EAX,FileMapVA
INVOKE RtlZeroMemory,EAX,ECX
.endif
.endif
;------------------------------------------------------------------
CALL FindMainIcon
;------------------------------------------------------------------
; Load Resources
;
;
PUSH offset szPackingResources
CALL _show_log_message
PUSH MAIN_ICON
MOV pFirst,1
MOV EBX,FileMapVA
ADD EBX,3Ch
ADD BX,WORD PTR[EBX] ;WinME/98/95 compatibility!
SUB BX,3Ch ;
MOV PEHeader,EBX
MOV EAX,DWORD PTR[EBX+88h]
.if EAX != 0
ADD EAX,ImageBase
INVOKE ConvertVA2FO,FileMapVA,EAX
ADD EAX,FileMapVA
MOV pRSRC,EAX
MOVZX EBX,WORD PTR[EAX+12]
ADD BX,WORD PTR[EAX+14]
MOV Level1_CNT,EBX
ADD EAX,16
.while Level1_CNT > 0
MOV EBX,DWORD PTR[EAX]
MOV pType,EBX
MOV EBX,DWORD PTR[EAX+4]
XOR EBX,80000000h
ADD EBX,pRSRC
MOVZX ECX,WORD PTR[EBX+12]
ADD CX,WORD PTR[EBX+14]
MOV Level2_CNT,ECX
ADD EBX,16
.while Level2_CNT > 0
MOV ECX,DWORD PTR[EBX]
MOV pName,ECX
.if pFirst == 1
PUSHAD
MOV ECX,DWORD PTR[EBX]
.if ECX > 80000000h || pType > 80000000h
.if ECX < 80000000h
MOV ECX,pType
.endif
XOR ECX,80000000h
ADD ECX,pRSRC
.if BYTE PTR[ECX] != NULL
.while BYTE PTR[ECX] != NULL
ADD ECX,2
.endw
MOV pFirst,2
ADD ECX,2
SUB ECX,pRSRC
MOV RSRCSize,ECX
.endif
.endif
POPAD
.endif
MOV ECX,DWORD PTR[EBX+4]
XOR ECX,80000000h
ADD ECX,pRSRC
MOVZX EDX,WORD PTR[ECX+12]
ADD DX,WORD PTR[ECX+14]
MOV Level3_CNT,EDX
ADD ECX,16
.while Level3_CNT > 0
MOV EDX,DWORD PTR[ECX+4]
ADD EDX,pRSRC
MOV EDI,DWORD PTR[EDX]
MOV pDataRVA,EDI
MOV EDI,DWORD PTR[EDX+4]
MOV pSize,EDI
.if pFirst == 1
MOV pFirst,0
PUSHAD
MOV EAX,pDataRVA
ADD EAX,ImageBase
INVOKE ConvertVA2FO,FileMapVA,EAX
ADD EAX,FileMapVA
SUB EAX,pRSRC
MOV RSRCSize,EAX
PUSHAD
ADD EAX,500000h
MOV pRSRCBuffSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV pRSRCBuff,EAX
MOV pRSRCBuffPos,EAX
INVOKE RtlMoveMemory,pRSRCBuff,pRSRC,RSRCSize
MOV EAX,RSRCSize
ADD pRSRCBuffPos,EAX
POPAD
POPAD
.elseif pFirst == 2
MOV pFirst,0
PUSHAD
MOV EAX,RSRCSize
ADD EAX,500000h
MOV pRSRCBuffSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV pRSRCBuff,EAX
MOV pRSRCBuffPos,EAX
INVOKE RtlMoveMemory,pRSRCBuff,pRSRC,RSRCSize
MOV EAX,RSRCSize
ADD pRSRCBuffPos,EAX
POPAD
.endif
PUSHAD
MOV rPack,0
MOV EAX,pType
MOV EBX,offset rawbuffer
.while DWORD PTR[EBX] != 0
.if DWORD PTR[EBX] == EAX
MOV rPack,1
.endif
ADD EBX,4
.endw
.if rPack == 0
MOV EAX,pType
.if EAX > 80000000h
XOR EAX,80000000h
ADD EAX,pRSRC
.if WORD PTR[EAX] > 0
MOVZX ECX,WORD PTR[EAX]
ADD EAX,2
.while ECX > 0 && BYTE PTR[EAX] != 0
ADD EAX,2
DEC ECX
.endw
.if ECX == NULL
XOR EDX,EDX
MOV EAX,pType
XOR EAX,80000000h
ADD EAX,pRSRC
ADD EAX,2
MOV EBX,EAX
MOV EAX,offset szTYPELIB
.while BYTE PTR[EAX] != 0
MOVZX ECX,BYTE PTR[EAX]
.if CL != BYTE PTR[EBX]
INC EDX
.endif
ADD EBX,2
ADD EAX,2
.endw
.if EDX == NULL
MOV rPack,1
.endif
.endif
.endif
.endif
.endif
POPAD
.if pType == 03h || pType == 10h || pType == 0Eh || pType == 18h || rPack == 1
PUSHAD
.if ((pType == 03h) && (MAIN_ICON > 0)) || (pType != 03h) || rPack == 1
.if pType == 03h
DEC MAIN_ICON
.endif
MOV EAX,pDataRVA
ADD EAX,ImageBase
INVOKE ConvertVA2FO,FileMapVA,EAX
ADD EAX,FileMapVA
MOV EBX,SizeOfImage
ADD EBX,1000h
MOV ECX,hPackedFilePos
SUB ECX,hPackedFileBuff
SUB ECX,200h
ADD ECX,EBX
MOV EBX,pRSRCBuffPos
SUB EBX,pRSRCBuff
ADD ECX,EBX
PUSHAD
INVOKE RtlMoveMemory,pRSRCBuffPos,EAX,pSize
MOV EAX,pSize
ADD pRSRCBuffPos,EAX
POPAD
SUB EDX,pRSRC
ADD EDX,pRSRCBuff
MOV DWORD PTR[EDX],ECX
.endif
POPAD
.endif
ADD ECX,8
DEC Level3_CNT
.endw
ADD EBX,8
DEC Level2_CNT
.endw
ADD EAX,8
DEC Level1_CNT
.endw
MOV EBX,hPackedFileBuff
ADD EBX,3Ch
ADD BX,WORD PTR[EBX] ;WinME/98/95 compatibility!
SUB BX,3Ch ;
MOV PEHeader,EBX
MOV EBX,SizeOfImage
ADD EBX,1000h
MOV ECX,hPackedFilePos
SUB ECX,hPackedFileBuff
SUB ECX,200h
ADD ECX,EBX
MOV EAX,pRSRCBuffPos
SUB EAX,pRSRCBuff
PUSH EAX
PUSH pRSRCBuff
CALL WriteData
MOV EAX,PEHeader
MOV DWORD PTR[EAX+88h],ECX
MOV ECX,pRSRCBuffPos
SUB ECX,pRSRCBuff
MOV DWORD PTR[EAX+8Ch],ECX
.endif
POP MAIN_ICON
MOV EBX,FileMapVA
ADD EBX,3Ch
ADD BX,WORD PTR[EBX] ;WinME/98/95 compatibility!
SUB BX,3Ch ;
MOV PEHeader,EBX
;------------------------------------------------------------------
PUSH offset szPackingSections
CALL _show_log_message
;------------------------------------------------------------------
; Pack sections / aplib
;
.if Compressor == 1
MOV FirstSection,0
MOV EAX,PEHeader
ADD AX,WORD PTR[EAX+14h]
ADD EAX,18h
MOV CurrentSectionOffset,EAX
MOV ESI,offset PackedSectionTable
MOV EDI,hPackedFilePos
.while CurrentSectionNumber > 0
MOV EBX,CurrentSectionOffset
MOV ECX,FileMapVA
ADD EBX,8
MOV EAX,DWORD PTR[EBX]
MOV VirtualSize,EAX
MOV EAX,DWORD PTR[EBX+4]
MOV VirtualOffset,EAX
MOV EAX,DWORD PTR[EBX+8]
MOV RawSize,EAX
MOV EAX,DWORD PTR[EBX+12]
MOV RawOffset,EAX
MOV CompressSectionOffset,EAX
ADD CompressSectionOffset,ECX
MOV EAX,DWORD PTR[EBX+1Ch]
MOV SectionFlags,EAX
SUB EBX,8
PUSH EBX
PUSH SectionFlags
CALL IsSectionPackable
.if RawSize > 0
.if EAX == 1
CALL initProgress
.if FirstSection == 0
PUSHAD
MOV EAX,VirtualOffset
ADD EAX,ImageBase
INVOKE FilterCode,EAX,CompressSectionOffset,RawSize
MOV EAX,VirtualOffset
MOV FirstSectionOffset,EAX
MOV EAX,RawSize
MOV FirstSectionSize,EAX
MOV FirstSection,1
POPAD
.endif
MOV DWORD PTR[ESI],EDI
ADD ESI,4
MOV EAX,VirtualOffset
; ADD EAX,ImageBase
MOV DWORD PTR[ESI],EAX
ADD ESI,4
INVOKE aP_max_packed_size,RawSize
MOV OutMemBuffSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV OutMemBuff,EAX
INVOKE aP_workmem_size,RawSize
MOV WorkMemSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV WorkMemBuff,EAX
INVOKE aP_pack,CompressSectionOffset,OutMemBuff,RawSize,WorkMemBuff,addr cProgress,NULL
ADD EAX,4
MOV PackedSize,EAX
ADD EDI,PackedSize
INVOKE VirtualFree,WorkMemBuff,WorkMemSize,MEM_DECOMMIT
PUSH PackedSize
PUSH OutMemBuff
CALL WriteData
INVOKE VirtualFree,OutMemBuff,OutMemBuffSize,MEM_DECOMMIT
.elseif EAX == 2
NOP
.elseif EAX == 3
.if oStripRSRC == 0
CALL RSRCPack
.endif
CALL initProgress
MOV DWORD PTR[ESI],EDI
ADD ESI,4
MOV EAX,VirtualOffset
; ADD EAX,ImageBase
MOV DWORD PTR[ESI],EAX
ADD ESI,4
INVOKE aP_max_packed_size,RawSize
MOV OutMemBuffSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV OutMemBuff,EAX
INVOKE aP_workmem_size,RawSize
MOV WorkMemSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV WorkMemBuff,EAX
INVOKE aP_pack,CompressSectionOffset,OutMemBuff,RawSize,WorkMemBuff,addr cProgress,NULL
ADD EAX,4
MOV PackedSize,EAX
ADD EDI,PackedSize
INVOKE VirtualFree,WorkMemBuff,WorkMemSize,MEM_DECOMMIT
PUSH PackedSize
PUSH OutMemBuff
CALL WriteData
INVOKE VirtualFree,OutMemBuff,OutMemBuffSize,MEM_DECOMMIT
INVOKE VirtualFree,pRSRC,pSize,MEM_DECOMMIT
.elseif EAX == 4
MOV DWORD PTR[ESI],EDI
ADD ESI,4
MOV EAX,VirtualOffset
; ADD EAX,ImageBase
MOV DWORD PTR[ESI],EAX
ADD ESI,4
INVOKE CompressRelocations,CompressSectionOffset,RawSize
MOV RawSize,EBX
MOV CompressSectionOffset,EAX
INVOKE aP_max_packed_size,RawSize
MOV OutMemBuffSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV OutMemBuff,EAX
INVOKE aP_workmem_size,RawSize
MOV WorkMemSize,EAX
INVOKE VirtualAlloc,NULL,EAX,MEM_COMMIT,PAGE_EXECUTE_READWRITE
MOV WorkMemBuff,EAX
INVOKE aP_pack,CompressSectionOffset,OutMemBuff,RawSize,WorkMemBuff,addr cProgress,NULL
ADD EAX,4
MOV PackedSize,EAX
ADD EDI,PackedSize
INVOKE VirtualFree,WorkMemBuff,WorkMemSize,MEM_DECOMMIT
PUSH PackedSize
PUSH OutMemBuff
CALL WriteData
INVOKE VirtualFree,OutMemBuff,OutMemBuffSize,MEM_DECOMMIT
INVOKE VirtualFree,CompressSectionOffset,RawSize,MEM_DECOMMIT
.else
ADD EDI,RawSize
PUSH RawSize
PUSH CompressSectionOffset
CALL WriteData
.endif
.endif
ADD CurrentSectionOffset,28h
DEC CurrentSectionNumber
.endw
.endif
;------------------------------------------------------------------
; Pack sections / lzma
;
.if Compressor == 2
MOV FirstSection,0
MOV EAX,PEHeader
ADD AX,WORD PTR[EAX+14h]
ADD EAX,18h
MOV CurrentSectionOffset,EAX
MOV ESI,offset PackedSectionTable
MOV EDI,hPackedFilePos
.while CurrentSectionNumber > 0
MOV EBX,CurrentSectionOffset
MOV ECX,FileMapVA
ADD EBX,8
MOV EAX,DWORD PTR[EBX]
MOV VirtualSize,EAX
MOV EAX,DWORD PTR[EBX+4]
MOV VirtualOffset,EAX
MOV EAX,DWORD PTR[EBX+8]
MOV RawSize,EAX
MOV EAX,DWORD PTR[EBX+12]
MOV RawOffset,EAX
MOV CompressSectionOffset,EAX
ADD CompressSectionOffset,ECX
MOV EAX,DWORD PTR[EBX+1Ch]
MOV SectionFlags,EAX
SUB EBX,8
PUSH EBX
PUSH SectionFlags
CALL IsSectionPackable
.if RawSize > 0
.if EAX == 1
CALL initProgress
.if FirstSection == 0
PUSHAD
MOV EAX,VirtualOffset
ADD EAX,ImageBase
INVOKE FilterCode,EAX,CompressSectionOffset,RawSize
MOV EAX,VirtualOffset
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -