qWord, yeah, i know it's fair to give some more info actually ;) so here it goes...
situation goes so: first, this is the second file mapping (the point where i actually call the procedure to replace these bytes and do all about it:
; GENERATE PE CHECKSUM...
invoke CreateFile, szFname, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL+FILE_FLAG_SEQUENTIAL_SCAN, 0
mov hFile, eax
invoke GetFileTime, hFile, addr fCRTime, addr fACTime, addr fWRTime
invoke GetFileSize, hFile, 0
mov dwOutPutSize, eax
invoke GlobalAlloc, GPTR, dwOutPutSize
mov pMem, eax
invoke ReadFile, hFile, pMem, dwOutPutSize, addr dwBytesWritten, 0
invoke CloseHandle, hFile
invoke StealBytes, pMem, OEP, PEP ; TODO!
mov eax, pMem
... and these are the procedures, that are related to the replacement of code itself:
StolenCodeReplacementProc PROC
db 068h ; push
SIZEOF_DATA_BEFORE_PEP_VA equ ($-offset StolenCodeReplacementProc)
new_ep dd 0
jmp @after_struc
entrypoints db SIZEOF_EP_STRUC dup(0)
@after_struc:
ret
StolenCodeReplacementProc ENDP
SIZEOF_STOLEN_BYTES equ ($-offset StolenCodeReplacementProc)
SB_DATA STRUC
OEP_RVA dd ?
OEP_VA dd ?
PEP_RVA dd ?
PEP_VA dd ?
SB_DATA ENDS
sbData SB_DATA <0>
StealBytes PROC uses ebx ecx edx esi edi ptrMem:DWORD, dOEP:DWORD, dPEP:DWORD
LOCAL ptrFirstSec:DWORD
LOCAL ptrNtHeader:DWORD
LOCAL ptrTextSec:DWORD
LOCAL ptrPackSec:DWORD
LOCAL rawOEPOffset:DWORD
LOCAL rawPEPOffset:DWORD
LOCAL ptrStorageArea:DWORD
LOCAL ptrOEP:DWORD
LOCAL ptrPEP:DWORD
;int 3
mov eax, dOEP
mov sbData.OEP_RVA, eax
mov eax, dPEP
mov sbData.PEP_RVA, eax
mov ebx, ptrMem
add ebx, [ebx+03Ch]
ASSUME EBX:PTR IMAGE_NT_HEADERS
mov edx, ebx
add edx, sizeof IMAGE_NT_HEADERS
mov ptrFirstSec, edx
mov ptrNtHeader, ebx
ASSUME EDX:PTR IMAGE_SECTION_HEADER
@sec_lpy:
mov eax, [edx].VirtualAddress
cmp sbData.OEP_RVA, eax
jl @no_text_section
add eax, [edx].Misc.VirtualSize
cmp sbData.OEP_RVA, eax
jg @no_text_section
mov eax, ptrMem
add eax, [edx].PointerToRawData
mov ptrTextSec, eax
mov eax, sbData.OEP_RVA
sub eax, [edx].VirtualAddress
mov rawOEPOffset, eax
add eax, ptrMem
mov ptrOEP, eax
@no_text_section:
mov eax, [edx].VirtualAddress
cmp sbData.PEP_RVA, eax
jl @no_packer_section
add eax, [edx].Misc.VirtualSize
cmp sbData.PEP_RVA, eax
jg @no_packer_section
mov eax, ptrMem
add eax, [edx].PointerToRawData
mov ptrPackSec, eax
@no_packer_section:
add edx, sizeof IMAGE_SECTION_HEADER
cmp dword ptr [edx], 0
jz @out_of_lpy
jmp @sec_lpy
@out_of_lpy:
mov edi, ptrPackSec
add edi, BACKUP_AREA_DISTANCE
mov ptrStorageArea, edi
mov ecx, SIZEOF_STOLEN_BYTES
mov esi, ptrOEP
rep movsb ; injecting original data inside loader...
mov eax, [ebx].OptionalHeader.ImageBase
add eax, sbData.PEP_RVA
mov sbData.PEP_VA, eax ; calculating VA of loader...
push eax ; PEP VA, stack operation!
lea esi, StolenCodeReplacementProc
mov edi, ptrOEP
mov ecx, SIZEOF_STOLEN_BYTES
rep movsb ; copying our stub code to OEP...
pop eax ; PEP VA, stack operation!
mov edi, ptrOEP
add edi, SIZEOF_DATA_BEFORE_PEP_VA
stosd ; injecting VA of loader
mov eax, sbData.OEP_RVA
mov [ebx].OptionalHeader.AddressOfEntryPoint, eax
ret
StealBytes ENDP
ASSUME EBX:NOTHING
ASSUME EDX:NOTHING
it's work in progress, so don't be too harsh about the current quality of the code, please, i know it's got quite more work onto that piece of code :t