PE插缝 和PE添节

PE结构-添加节表和节(附实例代码) 文章目录预备知识添加节表和节的步骤说明:手工添加步骤1.检查是否有足够空间 预备知识 文件结构示意图: 添加节表和节的步骤说明: 1、判断是否有足够的空间,可以添加一个节表. 判断条件: SizeOfHeader - (DOS + 垃圾数据 + PE标记 + 标准PE头 + 可选PE头 + 已存在节表) >= 2个节表的大小 (如果只有一个节表以上的空间也可以加不会报错,但是会有安全隐患) 2、需要修改的数据 添加一个新的节(可以copy一份) 在新增节后面 填充一个节大小的000 阅读详情
#include "stdafx.h"
#include <io.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>



typedef struct tagPeInfo
{
        DWORD dwPeNewEntryAddress;
        DWORD dwPeOldEntryAddress;
        DWORD dwPePhysicalSize;
        DWORD dwPePhysicalAddress;
        DWORD dwPeVirtualSize;
        DWORD dwPeAddress;
        DWORD dwPegapsize;
        DWORD dwPeCodeoffset;
        DWORD dwPeEntryoffset;
}PeInfo,*PPeInfo;


typedef struct PE_HEADER_MAP
{
        DWORD Signature;
        IMAGE_FILE_HEADER _head;
        IMAGE_OPTIONAL_HEADER opt_head;
        IMAGE_SECTION_HEADER section_header[6];
}peHeader;



/*unsigned char szHexCode[] = {0x6A ,0x40 ,0xE8 ,0x15 ,0x00 ,0x00 ,0x00 ,0xCE ,0xDE ,0xCC,
0xF5 ,0xBC ,0xFE ,0xCE ,0xAA ,0xC4 ,0xE3 ,0xA3 ,0xAC ,0xBB,
0xB6 ,0xD3 ,0xAD ,0xC4 ,0xFA ,0xA3 ,0xA1 ,0x00 ,0xE8 ,0x06 ,
0x00 ,0x00 ,0x00 ,0x68 ,0x65 ,0x6C ,0x6C ,0x6F ,0x00 ,0x6A ,
0x00 ,0xB8 ,0x8A ,0x05 ,0xD5 ,0x77 ,0xFF ,0xD0 ,0xe9 ,0x00 ,
                                                                 0x00 ,0x00 ,0x00 };
*/
unsigned char szHexCode[]={0x6A,0x40,0xE8,0x06,0x00,0x00,0x00,0x78,
0x34,0x68,0x00,0xEB,0x09,0xE8,0x04,0x00,0x00,0x00,0x78,0x34,0x68,
0x00,0x6A,0x00,0xB8,0x8A,0x05,0xD5,0x77,0xFF,0xD0,0xe9,0x00,0x00,0x00,0x00};

/*
/*unsigned char szHexCode[]={
0x8B,0xF4,0x68,0x30,0xF0,0x41,0x00,0xFF,0x15,0x3C,
0x41,0x42,0x00,0x3B,0xF4,0xE8,0xA4,0x00,0x00,0x00,
0x89,0x45,0xFC,0x8B,0xF4,0x68,0x1C,0xF0,0x41,0x00,
0x8B,0x45,0xFC,0x50,0xFF,0x15,0x38,0x41,0x42,0x00,
0x3B,0xF4,0xE8,0x89,0x00,0x00,0x00,0x89,0x45,0xF8,
0x6A,0x00,0x6A,0x00,0xE8,0x07,0x00,0x00,0x00,0x63,
0x3A,0x5C,0x31,0x2E,0x67,0x00,0xE8,0x22,0x00,0x00,
0x00,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,
0x77,0x2E,0x62,0x61,0x69,0x64,0x75,0x2E,0x63,0x6F,
0x6D,0x2F,0x69,0x6D,0x67,0x2F,0x6C,0x6F,0x67,0x6F,
0x2E,0x67,0x69,0x66,0x00,0x6A,0x00,0xF8,0xFF,0xD0,
0xe9,0x00,0x00,0x00,0x00};
*/


int GetPeInfo(void *vBasepointer,PPeInfo Peinfo)
{
   IMAGE_DOS_HEADER *iDosHeader=(IMAGE_DOS_HEADER*)vBasepointer;
   if(iDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
   {
           MessageBox(NULL,"Unknown type of file","Unknown type of file",NULL);
           return 0;
   }

   peHeader *pEheader=(peHeader*)((char*)iDosHeader+iDosHeader->e_lfanew);
   if(pEheader->Signature!=IMAGE_NT_SIGNATURE)
   {
           MessageBox(NULL,"Unknown type of file","Unknown type of file",NULL);
           return 0;
   }

   char *szRet=strstr((const char*)pEheader->section_header[0].Name,".text");
   if(!szRet)
   {
           MessageBox(NULL,"Unknown type of file","Unknown type of file",NULL);
           return 0;
   }
   
   Peinfo->dwPeAddress=iDosHeader->e_lfanew;
  
   Peinfo->dwPeVirtualSize=pEheader->section_header[0].Misc.VirtualSize;    //真实长度
   
   Peinfo->dwPePhysicalAddress=pEheader->section_header[0].PointerToRawData;   //物理偏移
  
   Peinfo->dwPePhysicalSize=pEheader->section_header[0].SizeOfRawData;     //物理长度

   Peinfo->dwPegapsize=Peinfo->dwPePhysicalSize
           -Peinfo->dwPeVirtualSize;                       //缝隙大小
  
   Peinfo->dwPeCodeoffset=pEheader->opt_head.BaseOfCode
           -Peinfo->dwPePhysicalAddress;                             //加载到内存中的代码段与文件中的代码段的差
  
   Peinfo->dwPeEntryoffset=pEheader->section_header[0].PointerToRawData
           +pEheader->section_header[0].Misc.VirtualSize;   //代码写入的物理偏移
   
   DWORD dwMods=Peinfo->dwPeEntryoffset%16;
   if(dwMods!=0)
   {
           Peinfo->dwPeEntryoffset+=(16-dwMods);
   }

   Peinfo->dwPeOldEntryAddress=pEheader->opt_head.AddressOfEntryPoint;  //OEP
   Peinfo->dwPeNewEntryAddress=Peinfo->dwPeEntryoffset+Peinfo->dwPeCodeoffset; //程序新入口地址
   return 1;
}

CString StrOfDWord(DWORD dwAddress)
{
        unsigned char waddress[4]={0};
       
        waddress[3]=(char)(dwAddress>>24)&0xFF;
        waddress[2]=(char)(dwAddress>>16)&0xFF;
        waddress[1]=(char)(dwAddress>>8 )&0xFF;
        waddress[0]=(char)(dwAddress    )&0xFF;
       
        return waddress;
}

int WriteCodeTofile(char szFilePath[],PPeInfo Peinfo)
{

   int nTolen=sizeof(szHexCode);
   

   DWORD dwRet;
   int nRet=_open(szFilePath,_O_RDWR | _O_CREAT | _O_BINARY,_S_IREAD | _S_IWRITE);
   if(!nRet)
   {
       MessageBox(NULL,"_open Error!","_open Error!",NULL);
       return 0;
   }
   
   dwRet=_lseek(nRet,(long)Peinfo->dwPeAddress+40,SEEK_SET);
   if(dwRet==-1)
   {
       MessageBox(NULL,"_lseek Error!","_lseek Error!",NULL);
       return 0;
   }

           char szWaddress[4]={0};
    memcpy(szWaddress,StrOfDWord(Peinfo->dwPeNewEntryAddress),4);
   
        dwRet=_write(nRet,szWaddress,4);
           if(dwRet==-1)
    {
                MessageBox(NULL,"_write Error!","_write Error!",NULL);
                return 0;
    }

/*        CString szMsgA;
        DWORD dwMessageBoxAadaddress;
           HINSTANCE gLibMsg=LoadLibrary("user32.dll");
        dwMessageBoxAadaddress=(DWORD)GetProcAddress(gLibMsg,"MessageBoxA");
           szMsgA=StrOfDWord(dwMessageBoxAadaddress);
*/
        CString szOepA;
        DWORD dwAddress;
        dwAddress = 0-(Peinfo->dwPeNewEntryAddress
                -Peinfo->dwPeOldEntryAddress+nTolen);
        szOepA=StrOfDWord(dwAddress);

        for(int i=0;i<4;i++)
        {
                szHexCode[32+i]=szOepA.GetAt(i);
        }

        dwRet=_lseek(nRet,(long)Peinfo->dwPeEntryoffset,SEEK_SET);
        if(dwRet==-1)
        {
                MessageBox(NULL,"_lseek Error!","_lseek Error!",NULL);
                return 0;
        }

        dwRet=_write(nRet,szHexCode,nTolen);
           if(dwRet==-1)
    {
                MessageBox(NULL,"_write Error!","_write Error!",NULL);
                return 0;
    }

        _close(nRet);
        return 1;
}


int InjectCodeToFile(char szFilePath[])
{
   HANDLE hFile=CreateFile(szFilePath,GENERIC_READ|GENERIC_WRITE,
           FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
   if(hFile==INVALID_HANDLE_VALUE)
   {
           MessageBox(NULL,"CreateFile Error!","CreateFile Error!",NULL);
           return 0;
   }

   HANDLE hMapping=CreateFileMapping(hFile,0,PAGE_READONLY | SEC_COMMIT,0,0,0);
   if(!hMapping)
   {
           MessageBox(NULL,"CreateFileMapping Error!","CreateFileMapping Error!",NULL);
           return 0;
   }

   void *vBasepointer=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
   if(!vBasepointer)
   {
           MessageBox(NULL,"MapViewOfFile Error!","MapViewOfFile Error!",NULL);
           return 0;
   }

   CloseHandle(hFile);
   CloseHandle(hMapping);
   
   PeInfo pEinfo;
   int nRet=GetPeInfo(vBasepointer,&pEinfo);
   if(!nRet)
   return 0;
   UnmapViewOfFile(vBasepointer);
   
   if(pEinfo.dwPegapsize<sizeof(szHexCode))
   {
           MessageBox(NULL,"No room to write the data!","No room to write the data!",NULL);
           return 0;
   }

   WriteCodeTofile(szFilePath,&pEinfo);

   return 1;
}



void main()
{
        char szFilePath[MAX_PATH];
        printf("Please Input File Path:");
        scanf("%s",&szFilePath);

        char szFileBak[MAX_PATH];
        lstrcpy(szFileBak,szFilePath);
    lstrcat(szFileBak,".bak");
        CopyFile(szFilePath,szFileBak,FALSE);



        InjectCodeToFile(szFilePath);
 PE添节:

//转载请注明 By 小浩  QQ:82602935
#include <afx.h>
#include <stdio.h>
#include <assert.h>


unsigned char szHexCode[]={0x6A,0x40,0xE8,0x06,0x00,0x00,0x00,0x78,
0x34,0x68,0x00,0xEB,0x09,0xE8,0x04,0x00,0x00,0x00,0x78,0x34,0x68,
    0x00,0x6A,0x00,0xB8,0x8A,0x05,0xD5,0x77,0xFF,0xD0,0xe9,0x00,0x00,0x00,0x00};


CString StrOfDWord(DWORD dwAddress)
{
        unsigned char waddress[4]={0};
       
        waddress[3]=(char)(dwAddress>>24)&0xFF;
        waddress[2]=(char)(dwAddress>>16)&0xFF;
        waddress[1]=(char)(dwAddress>>8 )&0xFF;
        waddress[0]=(char)(dwAddress    )&0xFF;
       
        return waddress;
}


int Align(int size, int ALIGN_BASE)
{
        int ret;
        int result;
       
        assert( 0 != ALIGN_BASE );
       
        result = size % ALIGN_BASE;
        if (0 != result)         
        {
                ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;
        }
        else
        {
                ret = size;
        }
       
        return ret;
}

void main()
{
        char szFilePath[MAX_PATH]={0};
        printf("Please Input FilePath:");
        scanf("%s",&szFilePath);
       
        char szFilaBak[MAX_PATH]={0};
        lstrcpy(szFilaBak,szFilePath);
        lstrcat(szFilaBak,".bak");
    int nRet=CopyFile(szFilePath,szFilaBak,FALSE);
    if(!nRet)
        {
                printf("CopyFile Error!/r/n");
                return;
        }

        FILE *pFile;
        pFile=fopen(szFilePath,"rb+");
        if(pFile==NULL)
        {
                printf("fopen Error!/r/n");
                return;
        }
        fseek(pFile,0,SEEK_SET);

    IMAGE_DOS_HEADER iMageDosHeader;
        fread(&iMageDosHeader,sizeof(IMAGE_DOS_HEADER),1,pFile);
    if(iMageDosHeader.e_magic!=IMAGE_DOS_SIGNATURE)
        {
                printf("Unknown type of file!/r/n");
                return;
        }
        fseek(pFile,iMageDosHeader.e_lfanew,SEEK_SET);

        IMAGE_NT_HEADERS iMageNtHeaders;
        fread(&iMageNtHeaders,sizeof(IMAGE_NT_HEADERS),1,pFile);
        if(iMageNtHeaders.Signature!=IMAGE_NT_SIGNATURE)
        {
                printf("Unknown type of file!/r/n");
                return;
        }

        int nNumOfSections=iMageNtHeaders.FileHeader.NumberOfSections;
    printf("%d Segment/r/n",nNumOfSections);

        int nFileAlignMent,nSectionAlignMent;
        nFileAlignMent=iMageNtHeaders.OptionalHeader.FileAlignment;
        nSectionAlignMent=iMageNtHeaders.OptionalHeader.SectionAlignment;
    printf("File Align Ment:%x/r/n",nFileAlignMent);
    printf("Section Align Ment:%x/r/n",nSectionAlignMent);

        DWORD dwOldOEP=iMageNtHeaders.OptionalHeader.AddressOfEntryPoint;
    printf("File OEP:%08x/r/n",dwOldOEP);

        IMAGE_SECTION_HEADER iMageSectionHeader;
        for(int i=0;i<nNumOfSections;i++)
        {
                fread(&iMageSectionHeader,sizeof(IMAGE_SECTION_HEADER),1,pFile);
                printf("Segment name:%s/r/n",iMageSectionHeader.Name);
        }

        IMAGE_SECTION_HEADER iMageNewSection;
        memset(&iMageNewSection,0,sizeof(IMAGE_SECTION_HEADER));

        strncpy((char*)iMageNewSection.Name,".x4h",strlen(".x4h"));
    iMageNewSection.VirtualAddress=Align(iMageSectionHeader.VirtualAddress
                +iMageSectionHeader.Misc.VirtualSize,nSectionAlignMent);

        int extraLengthAfterAlign=Align(30,nFileAlignMent);

        iMageNewSection.Misc.VirtualSize=Align(extraLengthAfterAlign,nSectionAlignMent);

        iMageNewSection.PointerToRawData=Align(iMageSectionHeader.PointerToRawData
                +iMageSectionHeader.SizeOfRawData,nFileAlignMent);

        iMageNewSection.SizeOfRawData=Align(0x1000,nFileAlignMent);

        iMageNewSection.Characteristics=0xE0000020;
       
           iMageNtHeaders.FileHeader.NumberOfSections++;

        iMageNtHeaders.OptionalHeader.SizeOfCode=Align(iMageNtHeaders.OptionalHeader.SizeOfCode
                +0x1000,nFileAlignMent);

        iMageNtHeaders.OptionalHeader.SizeOfImage=iMageNtHeaders.OptionalHeader.SizeOfImage
                +Align(0x1000,nSectionAlignMent);

        iMageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
        iMageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
        iMageNtHeaders.OptionalHeader.AddressOfEntryPoint=iMageNewSection.VirtualAddress;

        fseek(pFile,0,SEEK_END);
        fseek(pFile,iMageDosHeader.e_lfanew+sizeof(IMAGE_NT_HEADERS)
                +nNumOfSections*sizeof(IMAGE_SECTION_HEADER),SEEK_SET);
    fwrite(&iMageNewSection,sizeof(IMAGE_SECTION_HEADER),1,pFile);

        fseek(pFile,iMageDosHeader.e_lfanew,SEEK_SET);
        fwrite(&iMageNtHeaders,sizeof(IMAGE_NT_HEADERS),1,pFile);
   
        fseek(pFile,0,SEEK_END);
       
        CString szOepA;
        DWORD dwAddress;
        dwAddress = 0-(iMageNewSection.VirtualAddress-dwOldOEP+sizeof(szHexCode));
        szOepA=StrOfDWord(dwAddress);
        for(i=0;i<4;i++)
        {
            szHexCode[32+i]=szOepA.GetAt(i);
        }

        for (i=0; i<Align(0x1000,nFileAlignMent);i++)
        {
                fputc(0,pFile);
        }
        fseek(pFile,iMageNewSection.PointerToRawData,SEEK_SET);
        for (i=0; i<sizeof(szHexCode);i++)
        {
                fputc(szHexCode[i],pFile);
        }
        fclose(pFile);



}
手动修改PE文件:修改节表 目前想到的关于修改节表就是新增节和节表移位,其它的改节的读写什么的就改个Flag而已就不说了。以后有新的想法再添加。 1.新增节 现在很多解析PE格式的软件都有添加节的功能,具体代码怎么写,下面就说一下。PE格式结构排布顺序是这样:Dos头->DosStub->NT头->节表->Padding->节内容。 在节表之后因为文件对齐的关系,可能会多出一段00,这一段00就可以用来 阅读详情

相关推荐

滴水逆向——PE新增一个节

1.问题描述: 2.注意事项: (1)首先判断头部的空白区够不够加节表, 所有的节表后面必须跟40个字节0。所以添加节表时得确保有两个节表大小(即80字节)的连续剩余。 分三种情况:a.头部的最后一个节表后直接可以放下两个节区 b.节表后放不下,但是dos头后pe前可放下 c.前两种情况都不行,需扩大最后...

sunr. 1270

c语言源码补码机器码的定义,几种机器码(原码、反码、补码)应该这样理解...

由于觉得机器码中“原码”、“反码”和"补码"这样的概念过于蛋疼,参考一些博客和问答之后,决定调整优化内容便于回顾,参考链接已经放在文章底部。如果内容有误,或者你有独到的见解,也欢迎你提出来。二进制的概念大家都知道尺子吧,小学开始就在使用的测量距离的工具。现在我允许你以厘米(cm)为唯一的单位,制作一定长度的尺子。例如,我可以制作 1cm 的尺子、2cm 的尺子,那么我可以用这两种长度的尺子作为刻度...

weixin_34336527的博客 1759

PE新增节

测试了几个32位程序,有的能正常工作,有的不行。出错的程序有个共同点是他们最后一个节表后面并不是0,而是有一些奇怪的数据,以32位notepad为例,最后一个节表后面的数据是这样的: 对于其他程序,如ipmsg,还有一个我自己写的32位GUI程序,新增节后都可以正常运行。 对于这个问题,解决方案可以改为扩大最后一个节,或者让NT头上移,就是覆盖掉原来dos stub那部分数据,然后改一下e_lfanew,由于不是本次作业的重点,我就不写了。 下面是函数代码,只包含添加节的函数,其他函数就不贴了,上一篇博客有

hambaga的博客 879

机器码合集开源易语言源码-市场上带多数的

介绍: 可供新手学习和使用! 很简单的代码! 网盘下载地址: http://kekewangLuo.net/DCGzKMVcHCM0 图片:

字节网盘SEO工具 1154

注入机器码到指定进程

注入机器码关联目的进程源码例程程序调用API函数项目的进程中注入机器码,当本进程要被关闭时,等待目的进程先被关闭再关闭自己。易语言!

易语言机器码验证

易语言写的可以限制机器的源码,内含有机器源码。注册机源码。

计算机中数据的表示

机器码和真值 机器码:用二进制0,1表示数字的正负,‘0’表示正号,‘1’表示负号,且把这个数字放在最高位数字前表示,及把符号位和数值放在一起的称为机器码 真值:就是我们平常表示数字的方式 举例:真值 +1001345=机器数就是0 1001345 原码 原码数值部分用数值部分的绝对值直接表示,最高位为数值位,‘0’表示正好,‘1’表示负号。 注意:0的原码有两个值 00000000 和10000...

dongdong7_77的博客 438

VB获取机器码——源码

【【VB获取机器码——源码】】 取得驱动器序列号\取得驱动器序列号.rar

俩种方式注入机器码

PE插缝 和PE添节  Pe插缝:[Copy to clipboard] [ - ]CODE://by 小浩 Q82602935#include "stdafx.h"#include #include #include #include typedef struct tagPeInfo{        DWORD dwPeNewEntryAddress;        DWOR

1365

给软件加机器码和注册机的源码

给软件加机器码和注册机的源码,.好用实惠等等反正很好.

VT虚拟化驱动+内存读写+机器码修改源代码

纯c++源代码,不是.sys, 可以修改CPUID和硬盘ID,里面集成了各种钩子处理、隐藏驱动、伪装、PatchGuard、文件保护、窗口保护、拦截数据包、绕过反调试、等等...非常适合拿来做技术研究。

PE文件:节表-添加节

在所有节的空白区域都不够存放我们想要添加的数据时,这个时候可以通过添加节来扩展我们可操作的空间去存储新的数据(如导入表、代码或资源)。

WolvenSec的博客 1484

侠客游戏机器码解除工具[可运行源码]

侠客游戏机器码限制解除工具3.4修正版是一款专为解除三角洲游戏及其他腾讯游戏机器码限制而设计的工具。使用前需全盘格式化并重装系统,安装游戏后再激活卡密解码,解码成功后效果持久直至下次被封。工具使用需遵循特定步骤,包括观看操作视频、避免安装腾讯反作弊预启动、不更新系统或重装系统、不安装杀毒软件、不更新网卡驱动等。此外,玩腾讯游戏时需卸载外服游戏,避免使用领枪软件、代练压枪驱动、按键脚本等可能导致机器码封禁的行为。工具下载链接为蓝奏云,使用需谨慎,避免蓝屏或死机风险。

PE文件结构:节表

在 PE(Portable Executable)文件结构中,是 PE 文件的重要组成部分之一,位于 PE 头之后。节表记录了各节的虚拟地址、大小、节在 PE 文件中的实际大小和节属性等内容,用于定义程序在内存中的逻辑布局,操作系统加载 PE 文件时,根据节表将不同节的数据映射到正确的内存区域;定义了各节的属性,如是否可执行、可读、可写等,操作系统会根据这些属性对相应内存区域进行保护。在调试过程中,节表可以用来定位代码和数据在文件和内存中的位置,辅助调试器解析程序结构。

WolvenSec的博客 1565

易语言取本机机器码

易语言取本机机器码源码系统结构:取机器码, ======窗口程序集1 || ||------__启动窗口_创建完毕 || ||------取机器码 || ||------_选择框1_被单击 || ||------_选择框2_被单击 || ||------_选择框3_被单击

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

PE文件(三)节表

Name数组的长度最大为8字节,如果定义节的名称为.text,由于.text对应的ASCII码分别为0x2E, 0x74, 0x65, 0x78,0x74,所以Name数组中的数据为2E 74 65 78 74 00 00 00,一共8字节。所有的节表一起记录了该.exe文件中所有的节的信息,每一个节都有对应的节表来存储信息,所有的节对应的节表组合在一起就构成了PE文件的节表结构。内存中的地址:节表在4GB内存中的地址要加上imagebase的值,才是节表真正在内存中的起始地址。

2301_78838647的博客 1702

三端口DC-DC变换器设计与光伏储能协同控制

三端口DC-DC变换器是面向分布式能源系统的关键功率变换拓扑,通过在光伏输入、储能电池与直流负载三个端口间实现动态能量分配,解决多源异步供电下的电压稳定与功率平衡问题。其核心原理基于双Boost半桥架构与双闭环协同控制,融合MPPT最大功率点跟踪与电池智能充放电管理,在保证30V高精度稳压(±0.5V)的同时,支持光伏主导供电与电池支撑供电的自动模式切换。该技术显著提升光储系统能量利用率与供电连续性,广泛应用于微电网、便携式交直流电源及离网型光储一体机等场景,是构建柔性直流配电与智能能源管理的基础硬件单元。

weixin_36431814的博客 142

PE文件格式---节和节表

17.1.4 节表和节 从排列位置来看,PE文件在DOS部分和PE文件头部分以后就是节表和多个不同的节(如图17.1中的③和④所示)。要理解什么是节表,什么是节以及它们之间的关系,那就首先要了解Windows是如何将PE文件映射到内存的。 1. PE文件到内存的映射 在执行一个PE文件的时候,Windows并不在一开始就将整个文件读入内存,而是采用与内存 映射文件类似的机制,...

aod83029的博客 1181

博科的SAN交换机基本操作

2、添加用户testuser赋予user权限可以访问1-128VF默认VF为128账号描述"Test user"密码为password123。1、创建zone别名(100是指当前设备Domain ID,1和2是指对应的index号)2,删除新接入设备的ZONE或保持ZONE配置一致。3、将zone添加到当前生效的CFG中。2、将zone添加到当前生效的CFG中。3、将zone添加到当前生效的CFG中。3,将添加的级联端口持续关闭。4、将当前zone生效。4、将当前zone生效。1、查看当前所有用户。

chenjunokok的博客 1839

【学习体会】Lighttools8.4.0:矩形阵列光源+条形光源的光学仿真分析

在solidworks中设计了条形光源的基本结构: 由32*6个矩形led组成矩形光源阵列,如下所示 另存为step文件后,导入lighttools中,这里要设置模型的光学属性为:吸收体(机械) 因为我们设计的光源模型是一个整体,我们不能单个面的设置光源,比如说, 这样做的话并不会是这个面设置为光源,而是会把做一个模型都变成一个光源,如下 这显然不是我们想要的 那么,我们就在led位置上放置一个矩形面光源, 这样我们就放置好了一个面光源, 但是问题是,还有191...

LeonJin的博客 1万+

PE文件实战教程之手动实现新增节

前面我们说过在空白节添加代码,想要更多空间的话,可以扩大节,但是在最后一个节进行扩大的话,还需要修改原来节的属性,比较麻烦,所以不如直接新增一个节! 并且我们通过手动新增节,可以直观地看到非常多的细节,帮助我们理解原理! 手动实现新增节什么是新增一个节?了解一下节表新增节表的步骤1.判断是否有足够的空间增加一个新节.2.节表新增一个成员,在原最后一个成员后面添加3.修改节的数量4 修改sizeOfImage的大小5.再原有数据的最后,新增一个节的数据(内存对齐的整数倍)6 修正新增节表的属性节.Virt.

weixin_43742894的博客 1900

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 213
上一篇: PE添节
下一篇: 用C实现简单的EPO
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值