PE学习之-最简单的程序

PE 学习之总结1 每学习一门新的课程,我都会习惯性的问自已几个问题,为什么要学习它?学习它之后我能干什么? 什么是PE? 为什么要学习PE? 学习完PE我能干什么? 阅读详情

// _pefirst.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "afxwin.h"
#include <iostream>

using std::cout;
using std::endl;

LPCTSTR lpszFileToOpen = _T("C://windows//notepad.exe"); // 本例打开的文件

int main(int argc, char* argv[])
{
 IMAGE_NT_HEADERS  stPEHeader; //NT文件
 IMAGE_SECTION_HEADER *stSectionHeader=NULL; //节表
 short nSection=0; //节表数
 short i;   // for for
 CFile fOpen;
 short iPEAddr;
 if (fOpen.Open(lpszFileToOpen, CFile::typeBinary|CFile::shareDenyNone) == FALSE)
 {
  cout << _T("File open failed.") << endl;
  return 0;
 }
 fOpen.Seek(0x3c, CFile::begin);   //DOS header的偏移 0x3c 处指向开始地址
 fOpen.Read(&iPEAddr, sizeof (short)); //PE文件头地址

 try{fOpen.Seek(iPEAddr, CFile::begin);}
 catch (...){
  cout << _T("文件格式不对!") << endl;
  fOpen.Close();
  return 0;}

 fOpen.Read(&stPEHeader, sizeof (IMAGE_NT_HEADERS)); //读PE头
 if (stPEHeader.Signature != 17744)     //"PE/0/0"
 {
  cout << _T("该文件不是PE格式!") << endl;
  fOpen.Close();
  return 0;
 }
 nSection = stPEHeader.FileHeader.NumberOfSections; //总节数
 stSectionHeader = new IMAGE_SECTION_HEADER[nSection]; //分配nSection个节表

 for (i=0; i<nSection; i++)
 {
  fOpen.Read(&stSectionHeader[i], sizeof (IMAGE_SECTION_HEADER));
  cout << stSectionHeader[i].Name << endl;
 }
 printf("Hello World!/n");
 delete [] stSectionHeader;
 fOpen.Close();
 return 0;
}

PE 表头(PE Header)

我们的 PE 之旅第一站是 PE 表头。像其它的微软可执行档格式一样,PE 文件有一系列
的字段,固定在一个已知(并且很容易找到)的位置上,定义文件的其它部份。PE 表头
内含的重要信息包括程序代码和资料区域的大小位置、适用的操作系统、堆栈(stack)的
最初大小等等。

和其它的微软可执行档格式一样,PE 表头并非在文件的最起头处。文件最前面的数百个
字节是所谓的 DOS stub :一个极小的 DOS 程序,用来输出像 "This Program cannot be
run in DOS mode" 这样的讯息。如果你在一个不支持Win32 的操作系统上跑一个 Win32
程序,就会获得这个错误讯息。当 Win32 加载器把一个 PE 档映像到内存,内存
映像文件(memory mapped file )的第一个字节对应到 DOS Stub 的第一个字节。好得
很,于是,你每执行一个 Win32 程序,就获得了一个免费的DOS 程序(在Win16 中
这个 DOS stub 并不加载内存)。

和其它的微软可执行档格式一样,你可以在 DOS stub 的表头中找到「真正的表头」。
WINNT.H 为 DOS stub 表头定义了一个结构,循此我们将非常容易找到 PE 表头。
e_lfanew 字段是一个相对偏移值(或说是 RVA ),指向真正的 PE 表头。为了获得指
标,你必须为 RVA 加上 image 的基地址:

// Ignoring typecasts and pointer conversion issues for clarity...
pNTHeader = dosHeader + dosHeader->e_lfanew;

一旦你拥有指向 PE 表头的指针,真正的趣味就开始了。PE 表头整个是个
IMAGE_NT_HEADERS 结构,定义于 WINNT.H 。这个结构正是 Windows 95 的module
database 。每一个被加载的 EXE 或 DLL 都以一个 IMAGE_NT_HEADERS 结构表现出
来。此一结构有一个 DWORD 和两个子结构:

DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;

Signature 字段内容应该是 ASCII 的 PE/0/0 。如果 DOS stub 表头中的 e_lfanew 字段
指向一个 NE Signature 而不是一个 PE Signature ,表示你面对的是一个 Win16 NE 可执
行档。如果是 LE Signature 则表示你面对的是一个 VxD 档。如果是 LX Signature 则表
示 OS/2 文件。

再来是一个IMAGE_FILE_HEADER 结构。此结构内含最基础的文件信息。和 COFF 比
较起来,它似乎没有做什么更改。除了是 PE 表头的一部份,它也出现在微软 32 位
编译器所产生的 COFF OBJs 档的最前端。IMAGE_FILE_HEADER 的字段如下。

WORD Machine

文件使用于哪一种 CPU 。下面是 CPU 识别码的定义:

Intel I386 0x14C
Intel i860 0x14D
MIPS R300 0x162
MIPS R400 0x166
DEC Alpha AXP 0x184
Power PC 0x1F0 (little endian )
Motorola 68000 0x268
PA RISC 0x290 (Precision Architecture )

译注:但是在我的 Visual C++ 4.2 WINNT.H 文件中,只有如下定义:
#define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386.
#define IMAGE_FILE_MACHINE_R3000 0x162 //MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000 0x168 // MIPS little-endian
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian

WORD NumberOfSections

EXE 的 OBJ 中的 sections 个数

DWORD TimeDateStamp

联结器产生此一文件的时刻。其格式是自从1969 年12 月31 日4:00 P.M. 之后的总秒数。

DWORD PointerToSymbolTable

COFF 符号表格的偏移位置。此字段只对 COFF 除错信息有用。PE 档支持数种除错格
式,所以除错器应该参考 data directory (稍后描述)字段中的
IMAGE_DIRECTORY_ENTRY_DEBUG 。

DWORD NumberOfSymbols

COFF 符号表格中的符号个数。请看前一字段。

WORD SizeOfOptionalHeader

一个可有可无的表头(出现在本结构之后)的大小。在 EXE 档中,这也就是
IMAGE_OPTIONAL_HEADER 的大小。在 OBJ 档中,微软说它总是 0 。然而,观察
KERNEL32.LIB ,有一个 OBJ 在其中,而它的这个值不是 0 。所以呢,微软的话总是要
打点折扣。

WORD Characteristics

描述此一文件的性质。一些比较重要的性质如下:

0x0001 文件中没有重定位(relocation )
0x0002 文件是个可执行档(也就是说不是 OBJ 或 LIB )
0x2000 文件是动态联结函数库,不是程序。

PE 表头的第三个成份是 IMAGE_OPTIONAL_HEADER 结构。对于 PE 档而言,这一
部份其实并不是可有可无。要知道,COFF 格式允许不同的生产者在标准的
IMAGE_FILE_HEADER 之后定义一个结构。IMAGE_OPTIONAL_HEADER 正是 PE 设
计者认为在基本的 IMAGE_FILE_HEADER 信息之外还需要的一些重要信息。

你并不需要知道 IMAGE_OPTIONAL_HEADER 的所有字段。最重要的两个字段是
ImageBase 和 Subsystem 。如果你喜欢,你可以跳着读或是整个略过下面这些字段说明。

WORD Magic

这值用来定义 image 的状态:
0x0107 一个 ROM image
0x010B 一个正常的(一般的)EXE image 。大部份 PE 档都含此值。

BYTE MajorLinkerVersion
BYTE MinorLinkerVersion

产生此 PE 文件之联结器版本。以十进制而非十六进制表示。例如 2.23 版。

DWORD SizeOfCode

所有 code sections 的总和大小。大部份文件只有一个 code section ,所以此字段通常也
就是 .text section 的大小。

DWORD SizeOfInitializedData

所有内含「初始值资料」的sections (但不包括code sections )的总和大小。然而它似乎
并不包括 initialized data sections 在内。

DWORD SizeOfUninitializedData

这是「需要加载器将之付诸虚拟地址空间,但却不占用磁盘文件」的所有 sections 大小
总和。这些 sections 在程序激活时并不需要什么特别内容,所以才导至 Uninitialized data
这一称呼。未初始化的资料通常集中在 .bss section 中。

DWORD AddressOfEntryPoint

这是 image 开始执行的地址。这是一个RVA (Relative Virtual Address ),通常会落在 .text
section 。此字段对于 DLLs 或 EXEs 都适用。

DWORD BaseOfCode

这是一个 RVA (Relative Virtual Address ),表示文件中的 code section 从何开始。code
section 通常在data section 之前,在 PE 表头之后。微软联结器所产生的 EXEs 中,此
值通常为 0x1000 。Borland 的 TLINK32 则通常指定此值为 0x10000 ,因为预设情况下
它是以 64KB 为排列边界,不像微软的联结器采用 4K 为边界。

DWORD BaseOfData

这是一个 RVA (Relative Virtual Address ),表示文件中的 data section 从何开始。data
section 通常在code section 和 PE 表头之后。

DWORD ImageBase

一旦联结器产生了一个可执行档,它就假设这个文件将被映像到特定位置的内存中。
这个字段放的就是内存起始地址。假设出这样一个地址,联结器才能完成最佳化。如
果文件真的被加载到这个地址,程序代码就完全不需要修补。稍后我将对此有更多的讨论。
在 NT 3.1 EXE 中,预设的 image base 是 0x10000 ,DLL 则是 0x400000 。在 Windows
95 ,0x10000 不再适用,因为那将落在一个被所有行程共享的地址空间中。因而到了 NT
3.5 ,微软把预设的 Win32 EXE ImageBase 改为0x400000 。原来那些NT EXE 程序在
Windows 95 之中将需要比较长的加载时间,因为加载器必须重新定位。稍后我会详细讨
论所谓的「重新定位(relocation )」。

DWORD SectionAlignment

一旦映像到内存中,每一个 section 保证从一个「此值之倍数」的虚拟地址开始。

DWORD FileAlignment

在 PE 档中,组成每一个 section 的原始资料(raw data )保证是从一个「此值之倍数」
的虚拟地址开始。默认值是 0x200 ,如此一来 section 总是能够从磁盘的 sector 开始(因
为 sector 长度总是0x200 个字节)。这个字段相当于 NE 档中的 segment/resource
alignment 大小。与 NE 档不同的是,PE 档不会有上百个 sections ,所以因其特定排列
而浪费的空间不大。

WORD MajorOperatingSystemVersion
WORD MinorOperatingSystemVersion

使用此一可执行文件之操作系统的最小版本。这个字段与稍后即将出现的另一字段
"subsystem" 有类似的用途,因此颇令人困惑。Win32 文件的这两个字段通常指出 1.0 。

WORD MajorImageVersion
WORD MinorImageVersion

使用者自定的字段,允许你拥有不同版本的 EXE 或 DLL 。你可以利用联结器的
/VERSION 选项设定其值。例如:

LINK /VERSION:2.0 myobj.obj

WORD MajorSubsystemVersion
WORD MinorSubsystemVersion

使用此一可执行文件的子系统的最小版本。典型的数值是 4.0 ,代表 Windows 4.0 ,也就是
Windows 95 。

DWORD Reserved1

似乎总是 0 。

DWORD SizeOfImage

加载器必须在意的整个 image 大小。它的范围从 image base 开始,直到最后一个section
为止。最后一个 section 的尾端必需是 SectionAlignment 的倍数。

DWORD SizeOfHeaders

PE 表头以及 section table 的大小。各个 sections 的资料就从其后展开。

DWORD CheckSum

此文件的一个 CRC checksum 。就像微软的其它可执行档一样,此字段通常被忽略并被
设为 0 。然而,所有的 driver DLLs 、所有在开机时间加载的DLLs 、以及 server DLLs 都
必须有一个合法的 checksum 。其算法可以在 IMAGEHLP.DLL 中获得。
IMAGEHLP.DLL 的原始码可以在 Win32 SDK 中找到。

WORD Subsystem

此一可执行文件用来作为使用者接口的子系统。WINNT.H 定义了下列常数:

NATIVE=1 不需要子系统(例如驱动程序)
WINDOWS_GUI=2 在 Windows GUI 子系统中执行
WINDOWS_CUI=3 在 Windows 字符模式子系统中执行(也就是 console 应用程序)
OS2_CUI=5 在 OS/2 字符模式子系统中执行(也就是 OS/2 1.x 应用程序)
POSIZ_CUI=7 在 Posix 字符模式子系统中执行

WORD DllCharacteristics

一组旗标值,用来指示 DLL 的初始化函数(例如 DllMain )在什么环境下被呼叫。这
个值总是 0 ,但操作系统却还是会在四个 events 发生时呼叫 DLL 的初始化函数。此值
的四个数值分别意义如下:

1 :当 DLL 被加载一个行程的地址空间时呼叫之。
2 :当一个线程结束时呼叫之。
4 :当一个线程开始时呼叫之。
8 :当 DLL 退出时呼叫之。

DWORD SizeOfStackReserve

线程初始堆栈的保留大小。然而并不是所有这些内存都被系统委派(committed )。
此值预设为 0x100000 (1MB )。如果你在程序中呼叫 CreateThread 并指定其堆栈大小
为 0 ,获得的线程就有一个与此值相同大小的的堆栈。

DWORD SizeOfStackCommit

一开始即被委派(committed )给线程初始堆栈的内存数量。微软的联结器预设此一
字段为0x1000 (一个page ),Borland 的TLINK32 则把它设为 0x2000 (两个 pages )。

DWORD SizeOfHeapReserve

保留给最初的 process heap 的虚拟内存数量。这个 heap 的 handle 可以利用
GetProcessHeap 获得。注意,并不是所有这些内存都已被委派(committed )。

DWORD SizeOfHeapCommit

一开始即被委派(committed )给process heap 的内存数量。此值预设为0x1000 个位
组。

DWORD LoaderFlags (在 Windows NT 3.5 中被注明为老旧字段)

这个字段似乎和除错有关。我从来没有看过哪一个可执行文件的这些位是设立的,也不
曾清楚知道联结器如何设定它们。下面是其可能的数值与意义:

1 :在开始这个行程之前先引发一个断点(breakpoint )?
2 :在行程被加载之后引发一个除错器执行起来?

DWORD NumberOfRvaAndSizes

在 DataDirectory (下一字段)数组中的项目个数。目前的工具总是把此值设为 16 。

IMAGE_DATA_DIRECTORY DataDirectory [IMAGE_NUMBEROF_DIRECTORY_ENTRIES]

数组一开始的元素内含可执行文件重要部位的RVA (Relative Virtual Address )及大小。阵
列最后的一些元素目前还用不着。数组的第一个元素代表 exported function table (如果
有的话)的地址和大小,第二个元素代表 imported function table 的地址和大小,依此类
推。完整的列表请看 WINNT.H 中的定义。
译注:以下就是完整的列表。
// Directory Entries
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP)
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
这个数组企图让加载器能够迅速在 image 中找到特定的 section ,不需要一一经过每一
个 sections 、比对名称、再继续寻找...。

大部份的数组元素描述一整个 section 资料,但 IMAGE_DIRECTORY_ENTRY_DEBUG
却只包含 .rdata section 中的一小部份。更多信息将在「The .rdata section 」一节中披露。
PE学习.动手写PE.见缝插针 来自:http://bbs.pediy.com/showthread.php?t=138356 此贴用于申请邀请码! 1.PE文件基本结构图 接下来,让我们动手吧! 首先,让我们来明确下目的: 1.构建自己的pe程序,知道了pe文件的结构后,我们就可以按照p 阅读详情

相关推荐

PE框架基础学习(一)

PE 结构图 虚拟地址(VA): 在一个程序运行起来的时候,会被加载到内存中,并且每个进程都有自己的4GB,这个4GB当中的某个位置叫做虚拟地址,由物理地址映射过来的,4GB的空间,并没有全部被用到。 基地址( Imagebase ): 磁盘中的文件加载到内存当中的时候可以加载到任意位置,而这个位置就是程序的基址。EXE默认的加载基址是400000h,DLL文件默认基址是100000...

想喝奶茶的胖大海 3760

PE 自己做

windows11快正式发布了,很多不达标的老旧电脑是不能直接装的。事先准备好一个纯净PE吧。以下文字全部粘贴到 cmd 文件,运行就可以生成一个 boot.wim 文件,放到任意一个可以启动的 win10 u盘的同位置即可,注意原文件的改名备用,不用PE立即改回来即可。当然,直接从安装盘启动 故障恢复控制台也是一样的,多点几下鼠标而已。以下核心内容来源于无忧,我只是校验了一下,加了几句注释,让它可以顺利跑完而已。做好后是只有控制台,需要软件尽量选PE兼容的绿色版放U盘即可,比如ghost32 ghost6

江哥工作室 1941

关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写

  对PE文件结构的各个值定义和作用,这里不提了,网上资源很多,百度一下就好了。所以,本章只说一下,作为代码编写者对PE文件结构操作的方法和技巧。还是通过改进代码,来体会一下吧。  你应该记得前面的BOOL IsPEFile(HANDLE hFIle) 这个函数吧,它的作用是判断文件是否为PE格式文件。它把文件句柄作为参数,虽然许多函数需要文件句柄这个参数,但是作为对PE文件结构操作的函数,这样做是不恰当的,因为如果这样做就要频繁的使用SetFilePointer()、ReadFile()、WriteFil

蛛丝 2155

c语言程序分析工具,C语言编写控制台下PE分析工具(一)

定义一个struct _MAP_FILE_STRUCT结构来存放相关信息。typedef struct _MAP_FILE_STRUCT{HANDLE hFile; //文件句柄HANDLE hMapping;//映射文件句柄LPVOID ImageBase;//映像基址} MAP_FILE_STRUCT, *PMAP_FILE_STRUCT;一、加载要打开的文件采用内存映射的方式将文件加载到内存...

weixin_39754398的博客 386

Windows下的PE文件编程

PE头:PE头是PE文件的第一个有效部分,包含了PE文件的基本信息,如文件类型、入口点地址等。PE头:PE头是PE文件的第一个有效部分,包含了PE文件的基本信息,如文件类型、入口点地址等。本文介绍了Windows下的PE文件编程,包括PE文件的基本结构和创建一个简单的PE文件PE文件(Portable Executable)是Windows操作系统中可执行文件的标准格式。本文介绍了Windows下的PE文件编程,包括PE文件的基本结构和创建一个简单的PE文件的示例代码。

ByteNinja的博客 330

[系统安全] 十六.PE文件逆向基础知识(PE解析和PE编辑工具)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 作者前面介绍了三个漏洞,包括Chrome浏览器保留密码渗透解析、通过Chrome浏

杨秀璋的专栏 1万+

PE可执行文件“减肥”实例 nicotinism(原作)

<br />网上有很多用于查看诸如“拨号设置”、“邮箱帐号”等密码框中的密码的程序,大小从几十KB到几百KB不等。归根结底,就是向edit控件发送一个WM_GETTEXT消息,并没有什么神秘的技术可言,程序写起来也并不复杂,若用汇编,大小应该几KB足以。让我们看看它到底能小到什么程度? <br /><br />        (相关程序,请在www.youkuaiyun.com“软件频道→工具类软件→其他工具”处,下载“mini密码查看器”) <br /><br /><br />        要得到密码框中的密码,一

oathevil的专栏 1039

[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)

本系列虽然叫“网络安全自学篇”,但由于系统安全、软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步。前文分享了数字签名,采用Signtool工具对EXE文件进行签名,接着利用Asn1View、PEVie、010Editor等工具进行数据提取和分析。本文将详细介绍PE文件格式,熟悉各种PE编辑查看工具,针对目标EXE程序新增对话框等,这也为后续PE病毒和恶意代码的攻防打下扎实基础。希望这篇基础文章对您有所帮助~

杨秀璋的专栏 1万+

深入理解PE,手工制作64位PE程序

由于像 ASLR 这样的内存保护以及许多其他原因,该字段指定的地址几乎从未被使用过,在这种情况下,PE 加载程序选择一个未使用的内存范围来加载图像,在将图像加载到该地址后加载器进入一个称为重定位的过程,它修复图像中的常量地址以使用新的图像库,有一个特殊的部分保存有关需要重定位时需要修复的地方的信息,该部分称为重定位部分(对于 DLL,入口点是可选的,在没有入口点的情况下,该。十进制为70,这个大小是由我们在节区的数据量来确定,我们这个操作码+字符常量的总占地大小为70,所以这里填写70。

yhy1315的博客 2031

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1241

3dsMax高效导入OSGB倾斜模型的3个关键步骤与插件应用

本文详细解析了在3dsMax中高效导入OSGB倾斜模型的三个核心步骤:建立索引、处理贴图路径以及选择合适的插件。针对导入过程中常见的模型崩溃、贴图丢失和操作卡顿问题,提供了从数据结构理解到插件选型的实战解决方案,帮助用户实现大规模实景模型在3dsMax中的流畅导入与编辑。

weixin_29238147的博客 468

PE文件感染程序设计(PE病毒)

python提供的glob库可以实现,glob是python自己带的一个文件操作相关模块,用它可以查找符合自己目的的文件,类似于Windows下的文件搜索,支持通配符操作,*,?修改入口点,使得新的EntryPoint指向我写入的shellcode处,并且shellcode的最后一条指令是跳转指令,在shellcode执行完毕后跳转至原EntryPoint继续执行,达到不改变原文件功能的目的。Format)文件格式。我们知道,一个文件的本质上是什么类型的文件取决于它的文件结构,而不是后缀。

m0_59598029的博客 892

ElasticSearch读写性能调优

深层次理解,虽然是每隔一秒就会将内存中的segment数据刷新到segment file中,但实际上这里并没有直接到磁盘文件,而是先写入到OS Cache中。以refresh_interval为间隔时间,将保存在ES 内存缓存区中的数据 刷新到 os的文件系统缓存中,定期清空es的buffer,生成segment。注意:ES 的默认设置,已经综合考虑了数据可靠性,搜索的实时性,写入速度,一般不要盲目修改。将segment刷新到os cache中,并开放了查询权限,以提升搜索的实时性。

qq_44027353的博客 1811

PE文件学习

PE文件,即Portable Executable文件,是一种标准的文件格式,主要用于微软的Windows操作系统上。这种格式被用来创建可执行程序(如.exe文件)、动态链接库(.DLL文件)、设备驱动(.SYS文件)、ActiveX(.OCX文件)以及其他类型的可执行模块。PE文件格式设计得非常灵活和强大,它允许程序在不同版本的Windows上运行,从而实现了一定程度的可移植性。

qq_40569221的博客 1411

银河飞腾FT6678实战指南:OpenMP多核并行编程优化技巧

本文详细介绍了在银河飞腾FT6678多核处理器上使用OpenMP进行并行编程的实战技巧与优化方法。从基础语法到环境配置,再到性能优化的五大核心技巧,包括循环并行化、并行粒度控制、reduction子句使用等,帮助开发者充分发挥FT6678的8核计算能力。通过实际案例展示如何将图像处理算法从200ms优化到28ms,并深入探讨了任务调度、内存访问优化等进阶主题。

weixin_29234423的博客 285

ESP32-CAM与TFT屏幕实时图像传输:Arduino环境下的OV2640驱动实践

本文详细介绍了在Arduino环境下实现ESP32-CAM与TFT屏幕实时图像传输的完整实践方案。重点解析了OV2640摄像头的驱动配置、硬件引脚连接、TFT屏幕初始化及图像显示优化技巧,帮助开发者快速构建稳定的实时图像显示系统,适用于物联网监控、门禁系统等场景。

cuda7parallel的博客 114

Winhex制作PE

能帮到你的话,就给个赞吧 ???? 文章目录# conda 显示/添加/删除 源 # conda 显示/添加/删除 源

qq_42863961的博客 3547

Linux蓝牙开发实战:5分钟搞懂BlueZ与D-Bus通信原理(附D-Feet调试技巧)

本文深入解析Linux下BlueZ蓝牙协议栈与D-Bus通信的核心机制,提供实战开发指南。通过D-Bus对象模型、信号订阅等关键技术点的详细讲解,配合D-Feet工具的高效调试技巧,帮助开发者快速掌握蓝牙设备管理与性能优化方法,提升物联网开发效率。

3a9bq4r8t2y的博客 328

《Windows PE权威指南》学习之第17章 在PE最后一节中插入程序

本章介绍如何在PE文件的最后一节插入补丁程序的方法。与前三章的补丁方法相比,这种方法是最简单也是最有效的一个,在后续章节的实例中几乎都是采用这种方法对目标PE实施补丁的。因为PE文件的最后一节的数据在文件的末尾,所以,将代码添加到最后一节时无需新增节表项,无需移动现有文件内容。 读者可能会问,如果最后一节是在装载时可以被抛弃的节该怎么办(比如重定位节)?幸运的是,相对于可运行的PE文件来说,由于操作系统为每个进程分配的地址空间是独立的,所以其被装载时总是被放置到指定的位置。

chenyijun的专栏 5658

360°视频的视频编解码器性能评估中的常见测试条件和软件参考配置

这几天一直阅读提案,发现状态不是很好,就把几篇我觉得很有用的提案摘录到这里。带(*)标识的地方是我还没懂的地方= =、 首先这篇提案是JVET common test conditions and evaluation procedures for 360° video 1、Introduction 360°视频通用测试条件是在well-defined(*)的环境中进行实验,并且简化实验结果

不是他人太努力,只是自己努力不够罢了 4188

2025_NIPS_Truthful Aggregation of LLMs with an Application to Online Advertising

大型语言模型(LLMs)生成内容的 revenue 变现是在线广告的下一个前沿领域。我们考虑这样一种场景:广告商旨在影响LLM的回复,而平台则寻求最大化广告商价值并确保用户满意度。核心挑战在于,广告商的偏好通常与用户偏好存在冲突,且广告商可能误报其偏好。为解决这一问题,我们提出MOSAIC——一种拍卖机制,它确保真实申报是广告商的占优策略,并使每个广告商的效用与其对社会福利的贡献保持一致。重要的是,该机制无需LLM微调或访问模型权重,且随着计算资源的增加,可证明收敛到最优微调LLM的输出。

c_cpp_csharp的专栏 80

【Python PE解析器】——制作解析PE文件软件 并进行编译EXE程序 并打包为单个安装程序(全程详细包资料)

好久都没更新博客了,最近是真的很忙,每天抽出1小时写博客,有的时候更本没时间,今天写一个解析PE的一个软件,过程和内容很干,干货干货 之前有很多人加我要资料和软件,我从来没说过要钱什么的,只要给个关注和点赞,就可以了,需要什么资料,只要我可以给,我会不要一分钱免费给你们资料,欢迎大家来评论博主😊 点个赞留个关注吧!! 资料(百度网盘) 提取码:i4pt PE解析 软件和源代码包文件 提取码:07bh PE解析器软件安装包 提取码:r9og 破解版打包软件--打包为安装包 先看视频,双击打开

₰₯₮ 的博客 8万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 深入浅出PE文件格式---自己动手打造PE Show
下一篇: PE格式学习讨论群:3214720
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值