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
相关推荐
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的一个重要属
Hy-MT2(Python)
「Hy-MT2(Python)」是开源项目(Python)。源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。
【超全必看】JavaWeb中Cookie、Session、JSP的使用详解(附示例代码)
会话 会话: 一次会话中包含多次请求和响应。 当浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,会话结束。 功能: 在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie 服务器端会话技术:Session Cookie 概念:客户端会话技术,将数据保存到客户端 快速入门 使用步骤: 1.创建Cookie对象,绑定数据 new Cookie(String n...
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
基于蜣螂优化算法的多无人机安全航迹规划方法研究(Matlab代码实现)
内容概要:本文研究了基于多策略改进蜣螂优化算法(MSDBO)的多无人机协同三维安全航迹规划方法,旨在解决城市空中交通等复杂环境中多无人机集群飞行的路径规划与动态避障问题。通过引入多种优化策略对蜣螂算法进行改进,增强了算法的全局搜索能力与收敛精度,构建了以路径长度、飞行高度、威胁规避和转弯角度等为约束的综合成本最小化目标函数,实现了多无人机在三维空间中的高效协同避障与安全路径生成。该方法有效提升了飞行任务的安全性与执行效率,并通过Matlab仿真验证了其相较于传统算法在路径质量、避障能力和收敛性能方面的优越性。; 适合人群:具备一定智能优化算法基础和Matlab编程能力,从事无人机路径规划、群体智能算法、空中交通管理或相关工程应用研究的科研人员、高校研究生及自动化、航空航天领域的技术人员。; 使用场景及目标:①应用于城市巡检、应急救援、物流配送等多无人机协同任务中的三维路径规划;②为解决复杂动态环境下多机冲突消解、威胁规避与航迹优化问题提供高效算法支持;③推动蜣螂优化算法在多智能体系统与复杂工程优化中的实际落地与拓展应用。; 阅读建议:建议结合文中提供的Matlab代码进行仿真实践,深入理解MSDBO算法的设计机制与航迹规划模型的构建逻辑,可尝试调整环境参数、威胁分布或优化目标权重,观察算法在不同场景下的适应性与鲁棒性,进一步掌握智能优化算法在无人机系统中的应用方法与调参技巧。
记一次git reset事故
Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者 | 与佳期来源 | 与佳期的个人博客http:...
有限长度直导线的三维磁场计算:应用毕奥-萨法尔定律(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
双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
脑机接口(BCI)从原理到开发实战 07|运动想象BCI实战:基于BCI Competition IV 2a数据集
本文基于BCI Competition IV 2a数据集,详细介绍运动想象脑机接口系统的全流程实现。首先概述了该数据集的实验范式、参数特点和优势,然后指导环境准备与数据下载。通过代码示例展示了数据加载、事件标记提取和信号可视化方法。重点构建了完整的预处理流水线,包括通道选择、重参考、带通滤波(8-30Hz)和ICA去伪迹等关键步骤。文章旨在帮助读者将零散的BCI知识整合为完整的实战项目,掌握从原始脑电数据到运动意图解码的核心技术。
头歌OpenGauss数据库 - 单表查询 答案
本关任务:用SELECT语句检索数据表中指定字段的数据;用SELECT语句检索数据表中所有字段的数据。为了完成本关任务,你需要掌握: 1.如何获取数据表中指定字段的数据;2.如何获取数据表中的所有数据。
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网
高等数学第五章---定积分(§5.3定积分的计算方法)
这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。
APDU
# APDU # 定义:APDU(ApplicationProtocolDataUnit--应用协议数据单元)。协议数据单元PDU(ProtocolDataUnit)是指对等层次之间传递的数据单位。协议数据单元(ProtocolDataUnit)物理层的PDU是数据位(bit),数据链路层的PDU是数据帧(frame),网络层的PDU是数据包(packet),传输层的PDU是数据段(segment...
大模型训练流程(四):PPO强化学习实战与调优指南
本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。
生成式引擎优化(GEO)的概念与技术路径
生成式引擎优化(GEO)是针对生成式AI引擎的新型优化策略,旨在提升内容在AI搜索与问答平台中的可见性和可信度。与传统SEO相比,GEO更注重语义理解、知识图谱和多模态生成等技术,通过优化内容的结构化和平台适配性,使品牌信息在生成式AI中更易被采纳和呈现。其核心技术包括语义理解、向量数据库和实时反馈优化等,应用于品牌传播、智能客服和个性化推荐等领域。随着AI技术发展,GEO将向智能化、自动化方向演进,成为内容优化的重要工具。
878



被折叠的 条评论
为什么被折叠?



