cyclotron's Win32 PE Library

Fast上传图片成功,FastDFSweb页面显示失败 Fast上传图片成功 web页面显示失败 查看日志 root@ubuntu:/etc/fdfs# cd /data/fastdfs/tracker root@ubuntu:/data/fastdfs/tracker# ls data logs root@ubuntu:/data/fastdfs/tracker# cd logs root@ubuntu:/data/fastdfs/tracker... 阅读详情

 Pamqara写过一个PELibrary,但自己写的东西毕竟用起来比较顺手,所以自己建了一个简单的library,给写壳提供了一些特别的方便性.
时间关系,注释不是很详细,让代码来说话吧,欢迎报告bug和扩充库:)


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>             Win32 PE Library            >>>>>>>>>>>>>>>

;>>>>>>>>               by cyclotron              >>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.486
.model flat, stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
include comdlg32.inc
includelib user32.lib
includelib kernel32.lib
includelib comdlg32.lib

InitFileMap  proto
CheckPEValidity  proto
CloseFileMap  proto
GetPeInfo  proto  :dword
RVA2Offset  proto  :dword
Offset2RVA  proto  :dword
GetImportsInfo  proto  :dword
GetCodeScnInfo  proto  :dword
ObfuscateOEP  proto  :dword
UpdateEntryPoint  proto  :dword
AlignFile  proto  :dword
AlignScn  proto  :dword
AddSection  proto  :dword,:dword,:dword
GetScnInfo  proto  :dword,:dword
GetExtraDataInfo  proto  :dword
MergeScns  proto  :dword,:dword,:dword
OpenFileDialog  proto
CreateOutFile  proto
AppendScnCode  proto  :dword,:dword,:dword,:dword
UpdatePackedScnHeader  proto  :dword,:dword,:dword
CheckPackingFlag  proto  :dword
SetPackingFlag  proto  :dword
UpdateImportRVA  proto  :dword
GetStrLen  proto  :dword
tEHash    proto  :dword,:dword,:dword
crc32    proto  :dword,:dword

.data
hInFile    dd  0
hOutFile  dd  0
dwFileSize  dd  0
lpBytesRead  dd  0
lpPeHeader  dd  0
lpFileHeader  dd  0
szPeFileName  db  MAX_PATH dup(0)
szFilter  db  'eXeFiles',0,'*.exe',0,'All Files',0,'*.*',0,0
szCurrentDir  db  '.',0
szTitle    db  'Win32 PE Library - Proudly Presented by cyclotron',0
CurrentHashOffset  dd  0

;STRUCTURES
PE_INFO  struct
  dwEntryPointRVA  dd  ?
  dwImageBase  dd  ?
  dwSectionAlignment  dd  ?
  dwFileAlignment  dd  ?
  dwSizeOfImage  dd  ?
  dwCheckSum  dd  ?
  dwNumberOfSections  dd  ?
PE_INFO  ends

IMPORTS_INFO  struct
  dwImportDirRVA  dd  ?
  dwImportDirSize  dd  ?
  lpImportDir  dd  ?
  dwIATDirRVA  dd  ?
  dwIATDirSize  dd  ?
  lpIATDir  dd  ?
IMPORTS_INFO  ends

SCN_INFO  struct
  szName    dq  0
  dwVirtualSize  dd  ?
  dwVirtualAddress  dd  ?
  dwRawSize  dd  ?
  dwRawAddress  dd  ?
  dwCharacteristics  dd  ?
  lpScn    dd  ?
SCN_INFO  ends

EXTRADATA_INFO  struct
  dwRawAddress  dd  ?
  dwSize    dd  ?
  lpExtraData  dd  ?
EXTRADATA_INFO  ends

.code
InitFileMap  proc
  invoke  CreateFile,offset szPeFileName,/
                       GENERIC_READ,/
                       FILE_SHARE_READ,/
                       NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,/
                       NULL  
  .if  eax == INVALID_HANDLE_VALUE
    mov  eax,FALSE
    ret
  .else
    mov  hInFile,eax
  .endif
  invoke  GetFileSize,hInFile,NULL
  mov  dwFileSize,eax
  invoke  VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
  mov  lpFileHeader,eax
  invoke  ReadFile,hInFile,eax,dwFileSize,offset lpBytesRead,NULL
  .if  eax != 0
    mov  eax,TRUE
  .else
    mov  eax,FALSE
  .endif
  ret
InitFileMap  endp

CheckPEValidity  proc  uses esi
  mov  esi,lpFileHeader
  .if  word ptr [esi] == IMAGE_DOS_SIGNATURE
    assume  esi:ptr IMAGE_DOS_HEADER
    add  esi,[esi].e_lfanew
    assume  esi:nothing
    .if  word ptr [esi] == IMAGE_NT_SIGNATURE
      mov  lpPeHeader,esi
    .else
      mov  eax,FALSE
      ret
    .endif
  .else
    mov  eax,FALSE
    ret
  .endif
  mov  eax,TRUE
  ret
CheckPEValidity  endp

CloseFileMap  proc
  invoke  VirtualFree,lpFileHeader,0,MEM_RELEASE
  .if  eax==0
                mov  eax,FALSE
                 ret 
  .endif
  mov  lpFileHeader,0
        invoke  CloseHandle,hInFile
        mov  hInFile,0
        mov  eax,TRUE
        ret
CloseFileMap  endp

GetPeInfo  proc  uses esi edi @lpPeInfo:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  edi,@lpPeInfo
  assume  edi:ptr PE_INFO
  push  [esi].OptionalHeader.AddressOfEntryPoint
  pop  [edi].dwEntryPointRVA
  push  [esi].OptionalHeader.ImageBase
  pop  [edi].dwImageBase
  push  [esi].OptionalHeader.SectionAlignment
  pop  [edi].dwSectionAlignment
  push  [esi].OptionalHeader.FileAlignment
  pop  [edi].dwFileAlignment
  push  [esi].OptionalHeader.SizeOfImage
  pop  [edi].dwSizeOfImage
  push  [esi].OptionalHeader.CheckSum
  pop  [edi].dwCheckSum
  mov  ax,[esi].FileHeader.NumberOfSections
  cwd
  mov  [edi].dwNumberOfSections,eax
  assume  esi:nothing
  assume  edi:nothing
  ret
GetPeInfo  endp

RVA2Offset  proc  uses ebx ecx edx edi esi @dwRVA:dword
  mov  esi,lpFileHeader
  assume  esi:ptr IMAGE_DOS_HEADER
  add  esi,[esi].e_lfanew
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  edi,@dwRVA
  mov  edx,esi
  add  edx,sizeof IMAGE_NT_HEADERS
  mov  cx,[esi].FileHeader.NumberOfSections
  movzx  ecx,cx
  assume  edx:ptr IMAGE_SECTION_HEADER
  .while  ecx > 0
    .if  edi >= [edx].VirtualAddress
      mov  eax,[edx].VirtualAddress
      add  eax,[edx].SizeOfRawData
      .if  edi < eax
        mov  eax,[edx].VirtualAddress
        sub  edi,eax
        mov  eax,[edx].PointerToRawData
        add  eax,edi
        ret
      .endif
    .endif
    add  edx,sizeof IMAGE_SECTION_HEADER
    dec  ecx
  .endw
  assume  edx:nothing
  assume  esi:nothing
  mov  eax,FALSE
  ret
RVA2Offset  endp

Offset2RVA  proc  uses ebx ecx edx edi esi @dwOffset:dword
  mov  esi,lpFileHeader
  assume  esi:ptr IMAGE_DOS_HEADER
  add  esi,[esi].e_lfanew
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  edi,@dwOffset
  mov  edx,esi
  add  edx,sizeof IMAGE_NT_HEADERS
  mov  cx,[esi].FileHeader.NumberOfSections
  movzx  ecx,cx
  assume  edx:ptr IMAGE_SECTION_HEADER
  .while  ecx > 0
    .if  edi >= [edx].PointerToRawData
      mov  eax,[edx].PointerToRawData
      add  eax,[edx].SizeOfRawData
      .if  edi < eax
        mov  eax,[edx].PointerToRawData
        sub  edi,eax
        mov  eax,[edx].VirtualAddress
        add  eax,edi
        ret
      .endif
    .endif
    add edx,sizeof IMAGE_SECTION_HEADER
    dec ecx
  .endw
  assume  edx:nothing
  assume  esi:nothing
  mov  eax,FALSE
  ret
Offset2RVA  endp

GetImportsInfo  proc  uses ebx esi edi @lpImportsInfo:dword
  local  @dwIATMin:dword
  local  @dwIATMax:dword
  
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  lea  eax,[esi].OptionalHeader.DataDirectory/
      [IMAGE_DIRECTORY_ENTRY_IMPORT*sizeof IMAGE_DATA_DIRECTORY]
  mov  esi,eax
  assume  esi:ptr IMAGE_DATA_DIRECTORY
  mov  edi,@lpImportsInfo
  assume  edi:ptr IMPORTS_INFO
  mov  eax,[esi].VirtualAddress
  mov  [edi].dwImportDirRVA,eax
  invoke  RVA2Offset,eax
  add  eax,lpFileHeader
  mov  [edi].lpImportDir,eax
  push  [esi].isize
  pop  [edi].dwImportDirSize
  
  xor  eax,eax
  mov  @dwIATMax,eax
  or  eax,7FFFFFFFh
  mov  @dwIATMin,eax
  
  mov  eax,[esi].VirtualAddress
  invoke  RVA2Offset,eax
  add  eax,lpFileHeader
  mov  esi,eax
  assume  esi:ptr IMAGE_IMPORT_DESCRIPTOR
  .while  [esi].OriginalFirstThunk || [esi].TimeDateStamp || /
      [esi].ForwarderChain || [esi].Name1 || [esi].FirstThunk
    .if  [esi].OriginalFirstThunk
      mov  ebx,[esi].OriginalFirstThunk
    .else
      mov  ebx,[esi].FirstThunk
    .endif
    invoke  RVA2Offset,ebx
    mov  ebx,eax
    add  ebx,lpFileHeader
    mov  eax,[esi].FirstThunk
    .while  dword ptr [ebx]
      .if  eax < @dwIATMin
        mov  @dwIATMin,eax
      .endif
      .if  eax > @dwIATMax
        mov  @dwIATMax,eax
      .endif
      add  eax,4
      add  ebx,4
    .endw
    add  esi,sizeof IMAGE_IMPORT_DESCRIPTOR
  .endw
  push  @dwIATMin
  pop  [edi].dwIATDirRVA
  mov  eax,@dwIATMax
  sub  eax,@dwIATMin
  add  eax,4
  mov  [edi].dwIATDirSize,eax
  invoke  RVA2Offset,@dwIATMin
  add  eax,lpFileHeader
  mov  [edi].lpIATDir,eax
  assume  esi:nothing
  assume  edi:nothing
  ret
GetImportsInfo  endp

GetCodeScnInfo  proc  uses ebx ecx edx esi edi @lpCodeScnInfo:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  ebx,[esi].OptionalHeader.AddressOfEntryPoint
  
  mov  edx,esi
  add  edx,sizeof IMAGE_NT_HEADERS
  mov  cx,[esi].FileHeader.NumberOfSections
  movzx  ecx,cx
  assume  edx:ptr IMAGE_SECTION_HEADER
  .while  ecx > 0
    .if  ebx >= [edx].VirtualAddress
      mov  eax,[edx].VirtualAddress
      add  eax,[edx].SizeOfRawData
      .if  ebx < eax
        mov  edi,@lpCodeScnInfo
        assume  edi:ptr SCN_INFO
        push  [edx].VirtualAddress
        pop  [edi].dwVirtualAddress
        push  [edx].Misc.VirtualSize
        pop  [edi].dwVirtualSize
        push  [edx].SizeOfRawData
        pop  [edi].dwRawSize
        push  [edx].Characteristics
        pop  [edi].dwCharacteristics
        mov  eax,[edx].PointerToRawData
        mov  [edi].dwRawAddress,eax
        add  eax,lpFileHeader
        mov  [edi].lpScn,eax
        mov  esi,edx
        mov  ecx,8
        rep  movsb
        mov  eax,TRUE
        ret
      .endif
    .endif
    add  edx,sizeof IMAGE_SECTION_HEADER
    dec  ecx
  .endw
  assume  esi:nothing
  assume  edi:nothing
  assume  edx:nothing
  mov  eax,FALSE
  ret
GetCodeScnInfo  endp

; 偷取原始入口点的部分指令,经变形后存储在指定区域,清除原来的指令,返回值为结束偷取后第一条指令的RVA
ObfuscateOEP  proc  uses ecx esi edi @lpSubstitution:dword
  mov  esi,lpPeHeader
  mov  edi,@lpSubstitution
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  eax,[esi].OptionalHeader.AddressOfEntryPoint
  assume  esi:nothing
  invoke  RVA2Offset,eax
  add  eax,lpFileHeader
  mov  esi,eax
  mov  eax,[esi]
  .while  al != 0E8h && ax != 15FFh && ax != 25FFh &&/
    al != 74h && al != 75h && al != 76h && al != 77h && al != 0E9h && al != 0EBh
    .if  al == 55h    ;push ebp
      mov  eax,4EC8303h  ;sub esp,4  //3 bytes
      stosd
      mov  eax,242C8903h  ;mov [esp],ebp  //3 bytes
      stosd
      xor  al,al
      mov  [esi],al
      inc  esi
    .elseif  ax == 0EC8Bh    ;mov ebp,esp
      mov  ax,5401h  ;push esp  //1 byte
      stosw
      mov  ax,5D01h  ;pop ebp  //1 byte
      stosw
      xor  ax,ax
      mov  [esi],ax
      add  esi,2
    .elseif  al == 6Ah    ;push byte  //2 bytes
      mov  byte ptr [edi],2
      inc  edi
      movsw
      xor  ax,ax
      mov  [esi-2],ax
    .elseif  al == 68h    ;push dword
      mov  ax,5001h  ;push eax  //1 byte
      stosw
      mov  eax,2404C707h  ;mov dword ptr [esp],XXXXXXXXX  //7 bytes
      stosd
      xor  eax,eax
      mov  [esi],al
      inc  esi
      movsd
      sub  esi,4
      mov  [esi],eax
      add  esi,4
    .elseif  al == 64h
      inc  esi
      mov  ax,[esi]
      .if  ax == 0A1h  ;mov eax,fs:[0]
        mov  byte ptr [edi],2
        inc  edi
        mov  ax,0C033h  ;xor eax,eax  //2 bytes
        stosw
        mov  eax,30FF6403h  ;push dword ptr fs:[eax]  //3 bytes
        stosd
        mov  ax,5801h  ;pop eax  //1 byte
        stosw
        inc  esi
        xor  eax,eax
        mov  [esi-2],ax
        mov  [esi],eax
        add  esi,4
      .elseif  ax == 2589h  ;mov fs:[0],esp
        mov  ax,5401h  ;push esp  //1 byte
        stosw
        mov  eax,58F6407h  ;pop dword ptr fs:[0]  //7 bytes
        stosd
        xor  eax,eax
        stosd
        add  esi,2
        mov  [esi-4],eax
        mov  [esi],eax
        add  esi,4
      .endif
    .elseif  al == 50h  ;push eax
      mov  eax,4EC8303h  ;sub esp,4  //3 bytes
      stosd
      mov  eax,24048903h  ;mov [esp],eax  //3 bytes
      stosd
      xor  al,al
      mov  [esi],al
      inc  esi
    .elseif  al == 53h  ;push ebx
      mov  eax,4EC8303h  ;sub esp,4  //3 bytes
      stosd
      mov  eax,241C8903h  ;mov [esp],ebx  //3 bytes
      stosd
      xor  al,al
      mov  [esi],al
      inc  esi
    .elseif  al == 56h  ;push esi
      mov  eax,4EC8303h  ;sub esp,4  //3 bytes
      stosd
      mov  eax,24348903h  ;mov [esp],edi  //3 bytes
      stosd
      xor  al,al
      mov  [esi],al
      inc  esi
    .elseif  al == 57h  ;push edi
      mov  eax,4EC8303h  ;sub esp,4  //3 bytes
      stosd
      mov  eax,243C8903h  ;mov [esp],esi  //3 bytes
      stosd
      xor  al,al
      mov  [esi],al
      inc  esi
    .elseif  ax == 0C483h  ;add esp,XX
      mov  eax,[esi]
      shl  eax,8
      mov  al,3
      stosd
      dec  esi
      xor  eax,eax
      mov  [esi],eax
      add  esi,4
    .elseif  ax == 0EC83h  ;sub esp,XX
      mov  ax,5101h  ;push ecx  //1 byte
      stosw
      lodsd
      shl  eax,8    ;sub esp,(XX-4)  //3 bytes
      mov  al,3
      sub  eax,4000000h
      stosd
      sub  esi,5
      xor  eax,eax
      mov  [esi],eax
      add  esi,4
    .elseif  ax == 6589h  ;mov [ebp+XX],esp
      mov  eax,[esi]
      shl  eax,8
      mov  al,3
      stosd
      dec  esi
      xor  eax,eax
      mov  [esi],eax
      add  esi,4
    .elseif  ax == 45C7h  ;mov [ebp+XX],XXXXXXXX
      mov  ax,6805h  ;push XXXXXXXX  //5 bytes
      stosw
      add  esi,3
      movsd
      sub  esi,5
      lodsb
      shl  eax,16
      mov  ax,458Fh  ;pop [ebp+XX]  //3 bytes
      shl  eax,8
      mov  al,3
      stosd
      xor  eax,eax
      mov  [esi-4],eax
      mov  [esi],eax
      add  esi,4
    .elseif  ax == 0DB33h  ;xor ebx,ebx
      mov  byte ptr [edi],2
      mov  ax,0DB2Bh
      stosw
      xor  ax,ax
      mov  [esi],ax
      add  esi,2
    .elseif  ax == 5D89h  ;mov [ebp+XX],ebx
      mov  eax,[esi]
      shl  eax,8
      mov  al,3
      stosd
      dec  esi
      xor  eax,eax
      mov  [esi],eax
      add  esi,4
    .else
      .break
    .endif
    mov  eax,[esi]
  .endw
  xor  al,al
  stosb
  sub  esi,lpFileHeader
  invoke  Offset2RVA,esi
  ret
ObfuscateOEP  endp

; 更新入口点RVA,返回值为原入口点RVA
UpdateEntryPoint  proc  uses esi @dwNewEntryPoint:dword  ;Return OEP
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  eax,[esi].OptionalHeader.AddressOfEntryPoint
  push  @dwNewEntryPoint
  pop  [esi].OptionalHeader.AddressOfEntryPoint
  assume  esi:nothing
  ret
UpdateEntryPoint  endp

; 将输入双子按磁盘文件对齐值对齐
AlignFile  proc  uses ecx edx esi @OrgSize:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  ecx,[esi].OptionalHeader.FileAlignment
  assume  esi:nothing
  mov  eax,@OrgSize
  cdq
  div  ecx
  .if  edx != 0
    inc  eax
  .endif
  mul  ecx
  ret
AlignFile  endp

; 将输入双子按区块对齐值对齐
AlignScn  proc  uses ecx edx esi @OrgSize:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  ecx,[esi].OptionalHeader.SectionAlignment
  assume  esi:nothing
  mov  eax,@OrgSize
  cdq
  div  ecx
  .if  edx != 0
    inc  eax
  .endif
  mul  ecx
  ret
AlignScn  endp

; 增加一个区块的块头信息,可以指定区块名称、大小和属性,同时更新NumberOfSections字段和ImageSize字段,调用了GetScnInfo
AddSection  proc  uses ebx ecx edx esi edi @szScnName:dword,@dwSize:dword,@dwCharacteristics:dword
  local  @stNewScnInfo:SCN_INFO
  local  @dwImageSize
  
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  lea  ebx,[esi].OptionalHeader.DataDirectory/
      [IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT*sizeof IMAGE_DATA_DIRECTORY]
  mov  edi,[ebx]
  .if  edi != 0
    add  edi,lpFileHeader
    mov  ecx,[ebx+4]
    rep  stosb
    mov  edi,ebx
    mov  ecx,sizeof IMAGE_DATA_DIRECTORY
    rep  stosb
  .endif
  xor  ecx,ecx
  mov  cx,[esi].FileHeader.NumberOfSections
  add  esi,sizeof IMAGE_NT_HEADERS
  assume  esi:ptr IMAGE_SECTION_HEADER
  mov  edi,[esi].PointerToRawData
  add  edi,lpFileHeader
  mov  eax,sizeof IMAGE_SECTION_HEADER
  mul  ecx
  add  esi,eax
  add  esi,sizeof IMAGE_SECTION_HEADER
  .if  esi <= edi
    sub  esi,sizeof IMAGE_SECTION_HEADER
    invoke  GetScnInfo,0,addr @stNewScnInfo
    push  @dwSize
    pop  [esi].Misc.VirtualSize
    mov  eax,@stNewScnInfo.dwVirtualSize
    invoke  AlignScn,eax
    add  eax,@stNewScnInfo.dwVirtualAddress
    mov  [esi].VirtualAddress,eax
    add  eax,@dwSize
    mov  @dwImageSize,eax
    invoke  AlignFile,@dwSize
    mov  [esi].SizeOfRawData,eax
    mov  eax,@stNewScnInfo.dwRawSize
    invoke  AlignFile,eax
    add  eax,@stNewScnInfo.dwRawAddress
    mov  [esi].PointerToRawData,eax
    push  @dwCharacteristics
    pop  [esi].Characteristics
    mov  edi,@szScnName
    xchg  esi,edi
    mov  ecx,8
    rep  movsb
    mov  esi,lpPeHeader
    assume  esi:ptr IMAGE_NT_HEADERS
    inc  [esi].FileHeader.NumberOfSections
    push  @dwImageSize
    pop  [esi].OptionalHeader.SizeOfImage
    mov  eax,TRUE
  .else
    mov  eax,FALSE
  .endif
  assume  esi:nothing
  assume  edi:nothing
  ret
AddSection  endp

; 取得指定区块的信息,0表示最后一个区块,同时如果输入区块序号大于区块数,也取得最后一个区块的信息
GetScnInfo  proc  uses ecx edx esi edi @nScn:dword,@lpScnInfo:dword  
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  xor  ecx,ecx
  mov  cx,[esi].FileHeader.NumberOfSections
  add  esi,sizeof IMAGE_NT_HEADERS
  .if  @nScn == 0 || @nScn > ecx
    dec  ecx
    mov  @nScn,0
  .else
    mov  ecx,@nScn
    dec  ecx
  .endif
  mov  eax,sizeof IMAGE_SECTION_HEADER
  mul  ecx
  add  esi,eax
  assume  esi:ptr IMAGE_SECTION_HEADER
  mov  edi,@lpScnInfo
  assume  edi:ptr SCN_INFO
  push  [esi].Misc.VirtualSize
  pop  [edi].dwVirtualSize
  push  [esi].VirtualAddress
  pop  [edi].dwVirtualAddress
  push  [esi].SizeOfRawData
  pop  [edi].dwRawSize
  mov  eax,[esi].PointerToRawData
  mov  [edi].dwRawAddress,eax
  add  eax,lpFileHeader
  mov  [edi].lpScn,eax
  push  [esi].Characteristics
  pop  [edi].dwCharacteristics
  mov  ecx,8
  rep  movsb
  .if  @nScn == 0
    mov  eax,FALSE    ;got the last section
  .else
    mov  eax,TRUE
  .endif
  assume  esi:nothing
  assume  edi:nothing
  ret
GetScnInfo  endp

; 取得附加数据的信息
GetExtraDataInfo  proc  uses ecx edx esi @lpExtraDataInfo:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  xor  ecx,ecx
  mov  cx,[esi].FileHeader.NumberOfSections
  add  esi,sizeof IMAGE_NT_HEADERS
  mov  eax,sizeof IMAGE_SECTION_HEADER
  dec  ecx
  mul  ecx
  add  esi,eax
  assume  esi:ptr IMAGE_SECTION_HEADER
  mov  edx,[esi].PointerToRawData
  add  edx,[esi].SizeOfRawData
  push  edx
  invoke  GetFileSize,hInFile,NULL
  pop  edx
  mov  esi,@lpExtraDataInfo
  assume  esi:ptr EXTRADATA_INFO
  .if  eax > edx
    mov  [esi].dwRawAddress,edx
    sub  eax,edx
    mov  [esi].dwSize,eax
    add  edx,lpFileHeader
    mov  [esi].lpExtraData,edx
    mov  eax,TRUE
  .else
    mov  [esi].dwRawAddress,0
    mov  eax,FALSE
  .endif
  assume  esi:nothing
  ret
GetExtraDataInfo  endp

; 合并区块,输入参数包括起始区块序号(从1开始)和终止区块序号,并可以指定合并后的区块名称
MergeScns  proc  uses ebx ecx edx esi edi @nStart:dword,@nEnd:dword,@szScnName:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  xor  ecx,ecx
  mov  cx,[esi].FileHeader.NumberOfSections
  mov  ebx,@nStart
  .if  ecx > ebx || ecx > @nEnd || ebx >= @nEnd
    mov  eax,FALSE
    ret
  .endif
  
  xor  eax,eax
  mov  ax,[esi].FileHeader.NumberOfSections
  add  eax,@nStart
  sub  eax,@nEnd
  mov  [esi].FileHeader.NumberOfSections,ax
  add  esi,sizeof IMAGE_NT_HEADERS
  assume  esi:ptr IMAGE_SECTION_HEADER
  mov  eax,sizeof IMAGE_SECTION_HEADER
  mov  ecx,ebx
  dec  ecx
  mul  ecx
  add  esi,eax
  mov  edi,esi
  add  edi,sizeof IMAGE_SECTION_HEADER
  assume  edi:ptr IMAGE_SECTION_HEADER
  .while  ebx < @nEnd
    mov  eax,[edi].VirtualAddress
    add  eax,[edi].Misc.VirtualSize
    sub  eax,[esi].VirtualAddress
    mov  [esi].Misc.VirtualSize,eax
    mov  eax,[edi].SizeOfRawData
    add  [esi].SizeOfRawData,eax
    mov  eax,[edi].Characteristics
    or  [esi].Characteristics,eax
    add  edi,sizeof IMAGE_SECTION_HEADER
    inc  ebx
  .endw
  mov  ebx,@nEnd
  sub  ebx,@nStart
  push  esi
  add  esi,sizeof IMAGE_SECTION_HEADER
  .while  ebx > 0
    xchg  esi,edi
    mov  ecx,sizeof IMAGE_SECTION_HEADER
    rep  movsb
    xor  al,al
    xchg  esi,edi
    sub  edi,sizeof IMAGE_SECTION_HEADER
    rep  stosb
    dec  ebx
  .endw
  pop  esi
  mov  edi,@szScnName
  mov  ecx,8
  xchg  esi,edi
  rep  movsb
  assume  esi:nothing
  assume  edi:nothing
  mov  eax,TRUE
  ret
MergeScns  endp

; 调用通用对话框打开PE文件
OpenFileDialog  proc  uses ecx edi
  local  stofn:OPENFILENAME
  
  xor  al,al
  lea  edi,stofn
  mov  ecx,sizeof OPENFILENAME
  rep  stosb
  mov  stofn.lStructSize,sizeof OPENFILENAME
  mov  stofn.lpstrFilter,offset szFilter
  mov  stofn.lpstrFile,offset szPeFileName
  mov  stofn.nMaxFile,sizeof szPeFileName
  mov  stofn.lpstrInitialDir,offset szCurrentDir
  mov  stofn.lpstrTitle,offset szTitle
  mov  stofn.Flags,OFN_FILEMUSTEXIST or OFN_LONGNAMES or OFN_PATHMUSTEXIST
  invoke  GetOpenFileName,addr stofn
  .if  eax == 0
    mov  eax,FALSE
  .else
    mov  eax,TRUE
  .endif
  ret
OpenFileDialog  endp

; 输出文件命名为xxx_.exe,并创建该文件,返回值为该文件的句柄
CreateOutFile  proc  uses ecx edi
  lea  edi,szPeFileName
  xor  ecx,ecx
  dec  ecx
  mov  al,'.'
  repnz  scasb
  dec  edi
  mov  al,'_'
  stosb
  mov  eax,'exe.'
  stosd
  xor  al,al
  stosb
  invoke  CreateFile,offset szPeFileName,GENERIC_READ or GENERIC_WRITE,/
          FILE_SHARE_READ,/
          NULL,CREATE_ALWAYS,/
          FILE_ATTRIBUTE_NORMAL,NULL
  .if  eax == INVALID_HANDLE_VALUE
    mov  eax,FALSE
  .endif
  ret
CreateOutFile  endp

; 在新文件中写入新增区块并补上附加数据
AppendScnCode  proc  uses ebx esi edi @lpOrgLastScnInfo:dword,@lpExtraDataInfo:dword,/
          @lpNewScnData:dword,@dwNewScnSize:dword
  local  lpBytesWritten:dword
  
  mov  esi,@lpOrgLastScnInfo
  assume  esi:ptr SCN_INFO
  mov  ebx,[esi].dwRawSize
  add  ebx,[esi].dwRawAddress
  invoke  WriteFile,hOutFile,lpFileHeader,ebx,addr lpBytesWritten,NULL
  invoke  AlignFile,@dwNewScnSize
  mov  ebx,eax
  invoke  WriteFile,hOutFile,@lpNewScnData,ebx,addr lpBytesWritten,NULL
  mov  edi,@lpExtraDataInfo
  assume  edi:ptr EXTRADATA_INFO
  .if  [edi].dwRawAddress != 0
    invoke  WriteFile,hOutFile,[edi].lpExtraData,[edi].dwSize,addr lpBytesWritten,NULL
  .endif
  invoke  SetEndOfFile,hOutFile
  assume  esi:nothing
  assume  edi:nothing
  ret
AppendScnCode  endp

; 当区块被压缩以后,其参数要作相应的调整
UpdatePackedScnHeader  proc  uses ecx edx esi edi @nScn:dword,@dwSize:dword,@dwCharacteristics:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  xor  ecx,ecx
  mov  cx,[esi].FileHeader.NumberOfSections
  .if  @nScn > ecx
    mov  eax,FALSE
    ret
  .endif
  add  esi,sizeof IMAGE_NT_HEADERS
  assume  esi:ptr IMAGE_SECTION_HEADER
  .if  @nScn == 1
    push  @dwSize
    pop  [esi].Misc.VirtualSize
    invoke  AlignFile,@dwSize
    mov  [esi].SizeOfRawData,eax
    push  @dwCharacteristics
    pop  [esi].Characteristics
  .else
    mov  ecx,@nScn
    dec  ecx
    mov  eax,sizeof IMAGE_SECTION_HEADER
    mul  ecx
    add  esi,eax
    mov  edi,esi
    sub  esi,sizeof IMAGE_SECTION_HEADER
    assume  edi:ptr IMAGE_SECTION_HEADER
    push  @dwSize
    pop  [edi].Misc.VirtualSize
    invoke  AlignScn,@dwSize
    add  eax,[esi].VirtualAddress
    mov  [edi].VirtualAddress,eax
    invoke  AlignFile,@dwSize
    mov  [edi].SizeOfRawData,eax
    add  eax,[esi].PointerToRawData
    mov  [edi].PointerToRawData,eax
    push  @dwCharacteristics
    pop  [edi].Characteristics    
  .endif
  assume  esi:nothing
  assume  edi:nothing
  mov  eax,TRUE
  ret
UpdatePackedScnHeader  endp

CheckPackingFlag  proc  uses esi @dwFlag:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  eax,[esi].FileHeader.NumberOfSymbols
  .if  eax == @dwFlag
    mov  eax,TRUE
  .else
    mov  eax,FALSE
  .endif
  assume  esi:nothing
  ret
CheckPackingFlag  endp

SetPackingFlag  proc  uses esi @dwFlag:dword
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  push  @dwFlag
  pop  [esi].FileHeader.NumberOfSymbols
  assume  esi:nothing
  ret
SetPackingFlag  endp

; 更新输入表RVA,返回值为原来的RVA
UpdateImportRVA  proc  uses ebx esi @NewImportRVA
  mov  esi,lpPeHeader
  assume  esi:ptr IMAGE_NT_HEADERS
  mov  eax,@NewImportRVA
  lea  ebx,[esi].OptionalHeader.DataDirectory/
      [IMAGE_DIRECTORY_ENTRY_IMPORT*sizeof IMAGE_DATA_DIRECTORY]
  xchg  eax,[ebx]
  assume  esi:nothing
  ret
UpdateImportRVA  endp

GetStrLen  proc  uses ecx edi @lpString:dword
  or  ecx,0FFFFFFFFh
  xor  al,al
  mov  edi,@lpString
  repnz  scasb
  not  ecx
  dec  ecx
  mov  eax,ecx
  ret
GetStrLen  endp

; tElock中提取出来的校验算法修改版,@dwKey一般可以传入循环计数值
tEHash  proc  uses ebx ecx edx esi edi @SrcStart:dword,@SrcSize:dword,@dwKey:dword
  mov  esi,@SrcStart
  mov  ebx,@SrcSize
  xor  ecx,ecx
  lea  eax,[ecx-1]
  mov  edi,@dwKey
HasheLoop:
  xor  edx,edx
  mov  dl,[esi]
  xor  dl,al
HashiLoop:
  shr  edx,1
  jnb  @F
  add  edx,edi
@@:
  inc  ecx
  and  cl,7
  jnz  HashiLoop
  shr  eax,8
  xor  eax,edx
  inc  esi
  dec  ebx
  jg  HasheLoop
  not  eax
  ret
tEHash  endp

crc32  proc  @lData:dword,@ptrData:dword
  push  esi
  push  ecx
  push  edx

  mov  esi, @ptrData
  xor  edx, edx
  or  eax, -1
  mov  ecx, @lData

crc32_loop:
  mov  dl, byte ptr [esi]
  xor  dl, al
  shr  eax, 8
  xor  eax, dword ptr [crc32_table + 4*edx]
  inc  esi
  dec  ecx
  jnz  crc32_loop

  not  eax

  pop  edx
  pop  ecx
  pop  esi
  ret

crc32_table  dd  000000000h, 077073096h, 0EE0E612Ch, 0990951BAh, 0076DC419h
    dd  0706AF48Fh, 0E963A535h, 09E6495A3h, 00EDB8832h, 079DCB8A4h
    dd  0E0D5E91Eh, 097D2D988h, 009B64C2Bh, 07EB17CBDh, 0E7B82D07h
    dd  090BF1D91h, 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh
    dd  01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h, 0136C9856h
    dd  0646BA8C0h, 0FD62F97Ah, 08A65C9ECh, 014015C4Fh, 063066CD9h
    dd  0FA0F3D63h, 08D080DF5h, 03B6E20C8h, 04C69105Eh, 0D56041E4h
    dd  0A2677172h, 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh
    dd  035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h, 032D86CE3h
    dd  045DF5C75h, 0DCD60DCFh, 0ABD13D59h, 026D930ACh, 051DE003Ah
    dd  0C8D75180h, 0BFD06116h, 021B4F4B5h, 056B3C423h, 0CFBA9599h
    dd  0B8BDA50Fh, 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h
    dd  02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh, 076DC4190h
    dd  001DB7106h, 098D220BCh, 0EFD5102Ah, 071B18589h, 006B6B51Fh
    dd  09FBFE4A5h, 0E8B8D433h, 07807C9A2h, 00F00F934h, 09609A88Eh
    dd  0E10E9818h, 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h
    dd  06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh, 06C0695EDh
    dd  01B01A57Bh, 08208F4C1h, 0F50FC457h, 065B0D9C6h, 012B7E950h
    dd  08BBEB8EAh, 0FCB9887Ch, 062DD1DDFh, 015DA2D49h, 08CD37CF3h
    dd  0FBD44C65h, 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h
    dd  04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh, 04369E96Ah
    dd  0346ED9FCh, 0AD678846h, 0DA60B8D0h, 044042D73h, 033031DE5h
    dd  0AA0A4C5Fh, 0DD0D7CC9h, 05005713Ch, 0270241AAh, 0BE0B1010h
    dd  0C90C2086h, 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh
    dd  05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h, 059B33D17h
    dd  02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh, 0EDB88320h, 09ABFB3B6h
    dd  003B6E20Ch, 074B1D29Ah, 0EAD54739h, 09DD277AFh, 004DB2615h
    dd  073DC1683h, 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h
    dd  0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h, 0F00F9344h
    dd  08708A3D2h, 01E01F268h, 06906C2FEh, 0F762575Dh, 0806567CBh
    dd  0196C3671h, 06E6B06E7h, 0FED41B76h, 089D32BE0h, 010DA7A5Ah
    dd  067DD4ACCh, 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h
    dd  0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h, 0D1BB67F1h
    dd  0A6BC5767h, 03FB506DDh, 048B2364Bh, 0D80D2BDAh, 0AF0A1B4Ch
    dd  036034AF6h, 041047A60h, 0DF60EFC3h, 0A867DF55h, 0316E8EEFh
    dd  04669BE79h, 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h
    dd  0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh, 0C5BA3BBEh
    dd  0B2BD0B28h, 02BB45A92h, 05CB36A04h, 0C2D7FFA7h, 0B5D0CF31h
    dd  02CD99E8Bh, 05BDEAE1Dh, 09B64C2B0h, 0EC63F226h, 0756AA39Ch
    dd  0026D930Ah, 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h
    dd  095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h, 092D28E9Bh
    dd  0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h, 086D3D2D4h, 0F1D4E242h
    dd  068DDB3F8h, 01FDA836Eh, 081BE16CDh, 0F6B9265Bh, 06FB077E1h
    dd  018B74777h, 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch
    dd  08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h, 0A00AE278h
    dd  0D70DD2EEh, 04E048354h, 03903B3C2h, 0A7672661h, 0D06016F7h
    dd  04969474Dh, 03E6E77DBh, 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h
    dd  037D83BF0h, 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h
    dd  0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h, 0BAD03605h
    dd  0CDD70693h, 054DE5729h, 023D967BFh, 0B3667A2Eh, 0C4614AB8h
    dd  05D681B02h, 02A6F2B94h, 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh
    dd  02D02EF8Dh

crc32    endp

PE-library:轻量级便携式可执行解析库和一个演示peParser应用程序 聚乙烯 适用于Windows程序的轻型可移植可执行格式解析库。 方便进行恶意软件分析和开发。 可能是真正的越野车,可能容易受到各种内存损坏的侵害:-)以前写过,经过重构,固定,改进,增强的即席创建,而没有意愿对其进行正确重写或尝试查找并解决任何未解决的内存处理问题。 用法 暴露了以下分析端点: PE::AnalyseFile本地可用文件分析 PE::AnalyseDump原始进程内存转储分析 PE::AnalyseMemory分析在指定进程中映射的内存区域 PE::AnalyseProcess分析远程过程主模块。 PE::AnalyseProcessModule分析在远程进程虚拟内存中映射的指定模块。 其他公开功能值得一试: PE::InsertShellcode将输入的Shellcode插入到新注入的PE部分中 PE::ReadBytes和PE::WriteBytes文件/进程I 立即下载

相关推荐

The Pe Library Project-开源

这是一个处理PE文件的PE头、导入表、导出表和节表的库。它完全用mASM编码,所以它非常快而且非常小支持所有版本的Windows.C、VB.Net、包含 VB 6、ASM 和更多标头。

Android中Activity四种启动模式和taskAffinity属性详解

在android应用开发中,打造良好的用户体验是非常重要的。而在用户体验中,界面的引导和跳转是值得深入研究的重要内容。在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回退栈)。activity的启动模式会影响Task和Back Stack的状态,进而影响用户体验。除了启动模式之外,Intent类中定义的一些标志(以FLAG_ACTIVITY_开头)也会影响Task和Back Stack的状态。在这篇文章中主要对四种启动模式进行分析和验证,其中涉及到activity的一个重要属

青铜的博客 878

Hy-MT2(Python)

「Hy-MT2(Python)」是开源项目(Python)。源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。

【超全必看】JavaWeb中Cookie、Session、JSP的使用详解(附示例代码)

会话 会话: 一次会话中包含多次请求和响应。 当浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,会话结束。 功能: 在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie 服务器端会话技术:Session Cookie 概念:客户端会话技术,将数据保存到客户端 快速入门 使用步骤: 1.创建Cookie对象,绑定数据 new Cookie(String n...

qq_41112238的博客 1060

SpringBoot+Vue+Mysql图书馆管理系统(源码+文档)

SpringBoot+Vue+Mysql图书馆管理系统 WEB端软件项目(源码+文档)--11 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本(db.sql 建库 + 演示数据.sql,导入即有多条真实感演示数据);③论文文档;④开题报告;⑤答辩PPT;⑥任务书与项目部署运行说明文档(含演示账号与导入步骤)。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI、用户前台 HTML+Vue+Layui、后台首页数据看板(SVG 图表)、Maven 构建。 一、角色设计 读者(用户): 注册登录、图书检索与浏览、在线借阅申请、归还信息查看、罚金查询与缴纳、图书评论、图书收藏、留言反馈、个人中心等。 管理员: 图书信息管理、图书分类管理、借阅申请审核、归还登记、罚金管理、读者管理、评论管理、馆内资讯管理、留言板管理、轮播图管理、后台数据统计看板等。 二、前台功能模块(读者端) 首页展示:全屏轮播图、图书信息一览、馆内资讯速递、图书搜索入口 图书浏览:图书分类导航(世界名著 / 人文社科 / 少儿读物等六大分类)、图书列表检索、图书详情页(封面、作者、出版社、可借数量、简介) 借阅模块:在线提交借阅申请、选择借阅天数、管理员审核、借阅记录查询(借阅中 / 已归还)、应还日期提醒 归还模块:归还信息查看、归还日期登记核对 罚金模块:逾期罚金查询、缴纳状态管理(已缴 / 未缴) 图书评论:图书详情页留言评论互动 收藏模块:图书收藏与取消收藏、我的收藏列表 馆内资讯:开馆调整、新书通报、活动公告等资讯列表与详情 留言板:读者建议与咨询留言、管理员回复 个人中心:个人资料修改、修改密码 三、后台管理模块 .....

五子棋小游戏,可联机,单机

五子棋小游戏,可联机,单机

JVM致命错误日志(hs_err_pid.log)分析

最近两天测试环境有一个服务总是会挂(两到三天一次),JVM虚拟机总是会崩溃。所以有必要了解JVM崩溃的原因是什么。当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定。默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM

chenssy 的技术博客 11万+

基于蜣螂优化算法的多无人机安全航迹规划方法研究(Matlab代码实现)

内容概要:本文研究了基于多策略改进蜣螂优化算法(MSDBO)的多无人机协同三维安全航迹规划方法,旨在解决城市空中交通等复杂环境中多无人机集群飞行的路径规划与动态避障问题。通过引入多种优化策略对蜣螂算法进行改进,增强了算法的全局搜索能力与收敛精度,构建了以路径长度、飞行高度、威胁规避和转弯角度等为约束的综合成本最小化目标函数,实现了多无人机在三维空间中的高效协同避障与安全路径生成。该方法有效提升了飞行任务的安全性与执行效率,并通过Matlab仿真验证了其相较于传统算法在路径质量、避障能力和收敛性能方面的优越性。; 适合人群:具备一定智能优化算法基础和Matlab编程能力,从事无人机路径规划、群体智能算法、空中交通管理或相关工程应用研究的科研人员、高校研究生及自动化、航空航天领域的技术人员。; 使用场景及目标:①应用于城市巡检、应急救援、物流配送等多无人机协同任务中的三维路径规划;②为解决复杂动态环境下多机冲突消解、威胁规避与航迹优化问题提供高效算法支持;③推动蜣螂优化算法在多智能体系统与复杂工程优化中的实际落地与拓展应用。; 阅读建议:建议结合文中提供的Matlab代码进行仿真实践,深入理解MSDBO算法的设计机制与航迹规划模型的构建逻辑,可尝试调整环境参数、威胁分布或优化目标权重,观察算法在不同场景下的适应性与鲁棒性,进一步掌握智能优化算法在无人机系统中的应用方法与调参技巧。

记一次git reset事故

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者 | 与佳期来源 | 与佳期的个人博客http:...

iOS_开发 351

有限长度直导线的三维磁场计算:应用毕奥-萨法尔定律(Matlab代码实现)

内容概要:本文系统阐述了基于毕奥-萨伐尔定律计算有限长度直导线在三维空间中产生磁场的理论方法与实现过程。通过建立直导线磁场的积分数学模型,结合数值离散化处理手段,利用Matlab编程实现磁场矢量的精确计算与三维可视化,详细展示了空间任意点处磁场强度的大小与方向分布特性。文中深入探讨了该方法相较于安培环路定律在处理非闭合、有限长导体时的适用优势,并提供了完整的Matlab代码实现方案,便于读者复现结果、理解物理规律并拓展至更复杂的电磁场建模问题。; 适合人群:具备电磁学基础理论知识和Matlab编程能力的高等院校电气、物理及相关专业的本科生、研究生、科研人员以及从事电磁兼容、电力工程、传感器设计等领域的工程技术开发者。; 使用场景及目标:①作为电磁场与电磁波课程的教学辅助材料,帮助学生直观理解毕奥-萨伐尔定律的物理内涵与实际应用;②为工程实践中直导线电流产生的磁场建模、电磁干扰(EMI)分析、磁传感器布局优化等提供可靠的仿真依据;③作为学习复杂电磁系统数值计算方法的入门级实践案例,为进一步研究奠定基础。; 阅读建议:建议读者结合经典电磁学教材,仔细推导文中的积分公式,透彻理解其物理意义,并亲自运行所提供的Matlab代码,通过调整导线长度、电流强度及观察点位置等参数,观察磁场分布的变化规律,从而深化对三维静磁场特性的直观认知与工程应用理解。

塔式熔盐光热朗肯循环电站建模!并且搭建了Simulink模型!!

内容概要:本文详细介绍了塔式熔盐光热朗肯循环电站的建模过程,并基于MATLAB/Simulink平台构建了完整的系统仿真模型。该模型深度融合了光热发电的核心组件与朗肯循环的能量转换机制,涵盖太阳能集热、熔盐传热储热、蒸汽发生及汽轮发电等关键环节,能够有效模拟系统的动态响应特性与能量转换效率。研究特别关注系统在变工况下的运行性能,通过仿真手段分析其电能输出稳定性、热力循环效率以及对电网调频的潜在支撑能力,凸显了Simulink在复杂能源系统多物理场耦合仿真中的强大功能与工程应用价值。; 适合人群:具备一定电力系统、热力学基础知识和Simulink软件操作技能的研究生、科研人员及能源领域的工程师。; 使用场景及目标:① 深入学习和掌握塔式熔盐光热电站的工作原理、系统组成及建模方法;② 利用Simulink进行多能耦合的综合能源系统仿真研究,探究系统优化运行策略与动态性能;③ 为从事新能源发电、储能技术及智能电网调度的专业人士提供先进的技术参考和创新灵感。; 阅读建议:读者在学习本文时,应结合具体的系统原理图与Simulink模型进行对照分析,深入理解各模块的数学建模与参数设置。强烈建议动手复现仿真模型并调整关键参数,通过改变光照强度、熔盐流量等输入条件来观察系统输出的变化,以加深对光热电站动态特性的理解,培养解决实际工程问题的实践与创新能力。

dvm aborts for acceesing stale reference

本文主要描述Android下由于线程同步问题引起的dvm访问已经销毁的对象的Issue. 文末, 会给出bug定位和参考解决方案. 可以做为MIB 系统BUG定位和分析参考资料.   Log标志 E dalvikvm: JNI ERROR (app bug): accessed stale global reference 0x%p (index %d in a table of siz

zirconsdu的专栏 7996

双Buck电路并联VDCM下垂控制(Simulink仿真实现)

内容概要:本文介绍了基于Simulink的双Buck电路并联VDCM下垂控制的仿真实现,属于电力电子与新能源系统控制领域的研究内容。通过构建双Buck电路的并联拓扑结构,结合VDCM(电压下降控制法)下垂控制策略,实现多个变换器模块间的均流与稳定输出电压控制。文中详细阐述了控制原理、系统建模方法、关键参数设计及Simulink仿真模型的搭建过程,展示了在负载变化或输入波动条件下系统的动态响应与稳定性表现,验证了所提控制策略在提高系统可靠性与模块化扩展性方面的有效性。; 适合人群:具备电力电子技术、自动控制理论基础,从事新能源变换器、直流微电网、模块化电源系统等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握双Buck电路的工作原理与并联运行特性;② 学习VDCM下垂控制机制及其在均流控制中的应用;③ 构建并调试多模块并联DC-DC变换器的Simulink仿真模型,用于科研验证或教学演示。; 阅读建议:建议结合Simulink仿真环境动手实践,重点关注控制器参数整定、均流效果评估及系统抗干扰能力分析,同时可延伸至其他并联均流控制策略(如主从控制、平均电流法)的对比研究。

Interview QA-COBOL & COBOL II

Q1) Name the divisions in a COBOL program ?. A1) IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION,PROCEDURE DIVISION.Q2) What are the different data types available in COBOL?A2) Alpha-nu

生活在别处 8825

脑机接口(BCI)从原理到开发实战 07|运动想象BCI实战:基于BCI Competition IV 2a数据集

本文基于BCI Competition IV 2a数据集,详细介绍运动想象脑机接口系统的全流程实现。首先概述了该数据集的实验范式、参数特点和优势,然后指导环境准备与数据下载。通过代码示例展示了数据加载、事件标记提取和信号可视化方法。重点构建了完整的预处理流水线,包括通道选择、重参考、带通滤波(8-30Hz)和ICA去伪迹等关键步骤。文章旨在帮助读者将零散的BCI知识整合为完整的实战项目,掌握从原始脑电数据到运动意图解码的核心技术。

小明的博客 852

头歌OpenGauss数据库 - 单表查询 答案

本关任务:用SELECT语句检索数据表中指定字段的数据;用SELECT语句检索数据表中所有字段的数据。为了完成本关任务,你需要掌握: 1.如何获取数据表中指定字段的数据;2.如何获取数据表中的所有数据。

d214493517的博客 5722

Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed

方法一:如果你是C++程序员,如果你写过一个很复杂的程序,如果你经常碰到莫名其妙的崩溃问题。那么你就有可能遭遇了野指针。如果你比较细心,注意了Debug output输出窗口的话,那么你就有可能注意到这样一行提示:HEAP:   Free   Heap   block   xxxxxxxx modified   at   xxxxxxxx after   it   was   freed网

7677

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4353

APDU

# APDU # 定义:APDU(ApplicationProtocolDataUnit--应用协议数据单元)。协议数据单元PDU(ProtocolDataUnit)是指对等层次之间传递的数据单位。协议数据单元(ProtocolDataUnit)物理层的PDU是数据位(bit),数据链路层的PDU是数据帧(frame),网络层的PDU是数据包(packet),传输层的PDU是数据段(segment...

weixin_30865427的博客 2709

大模型训练流程(四):PPO强化学习实战与调优指南

本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。

weixin_29051811的博客 438

生成式引擎优化(GEO)的概念与技术路径

生成式引擎优化(GEO)是针对生成式AI引擎的新型优化策略,旨在提升内容在AI搜索与问答平台中的可见性和可信度。与传统SEO相比,GEO更注重语义理解、知识图谱和多模态生成等技术,通过优化内容的结构化和平台适配性,使品牌信息在生成式AI中更易被采纳和呈现。其核心技术包括语义理解、向量数据库和实时反馈优化等,应用于品牌传播、智能客服和个性化推荐等领域。随着AI技术发展,GEO将向智能化、自动化方向演进,成为内容优化的重要工具。

Baixue5209的博客 1049
上一篇: 使用TASM编译COFF格式和连接
下一篇: PE_Info 之DIY
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值