当前位置: 首页 > 编程日记 > 正文

PE文件和COFF文件格式分析——节信息

在《PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3》中,我们看到一些区块的信息都有偏移指向。而我们本文讨论的节信息是没有任何偏移指向的,所以它是紧跟在可选文件头后面的。(转载请注明来源于breaksoftware的csdn博客)于是该节的起始位置要如此计算

size_t unDwordSize = sizeof(DWORD); // PE\0\0
size_t unImgFileHeaderSize = sizeof(IMAGE_FILE_HEADER);
LPVOID lpSectionHeaderStart = (LPBYTE)m_lpPEStart + unDwordSize + unImgFileHeaderSize + m_FileHeader.SizeOfOptionalHeader;

有了起始地址,那么结束地址呢?在《PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1》中,我们描述过,IMAGE_FILE_HEADER::NumberOfSections就是用于指定该节信息的个数的。这样我们便可以得到节信息

size_t unSectionHeaderSize = sizeof( IMAGE_SECTION_HEADER );
for ( int i = 0; i < m_FileHeader.NumberOfSections; i++ ) {IMAGE_SECTION_HEADER SectionHeader;if ( FALSE == SafeCopy( &SectionHeader, lpSectionHeaderStart, unSectionHeaderSize ) ) {break;}// 不够严谨哦!不要这么用!		m_vecSectionHeaders.push_back( SectionHeader );lpSectionHeaderStart = (LPBYTE)(lpSectionHeaderStart) + unSectionHeaderSize;
}

像Stud_PE和PE Explorer等都是这么做的。但是我这儿说一下,这样做是不严谨的,我会在之后论述这样草率的做法为什么不对。

我先拿我电脑上notepad.exe为例,看看它的节信息

再看下保存节信息的结构体IMAGE_SECTION_HEADER ,和上图对照看就容易理解了。

#define IMAGE_SIZEOF_SHORT_NAME              8
typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];union {DWORD   PhysicalAddress;DWORD   VirtualSize;} Misc;DWORD   VirtualAddress;DWORD   SizeOfRawData;DWORD   PointerToRawData;DWORD   PointerToRelocations;DWORD   PointerToLinenumbers;WORD    NumberOfRelocations;WORD    NumberOfLinenumbers;DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

Name是使用UTF-8编码,以\0结尾,大小为8Byte的字符串。它是节的名称,如上图中的.text、.data和.rsrc。看到Name的长度为8,你是不是在想到:小于,等于和大于?现在我们就讨论下如果节名长度小于、等于和大于8的情况。

节名长度小于8 的情况。这个场景最简单了,不足的位用\0填充。

节名长度等于8的情况。因为结构大小是固定的,所以我们不可能找到一个空余的位置放置\0,那么这8byte就全部填充名字了。

以下是我收集的节名信息

IMAGESETCTIONNAME g_ImageSectionName[] = {{'.','b','s','s','\0','\0','\0','\0'},{'.','c','o','r','m','e','t','a'},{'.','d','a','t','a','\0','\0','\0'},{'.','d','e','b','u','g','$','F'},{'.','d','e','b','u','g','$','P'},{'.','d','e','b','u','g','$','S'},{'.','d','e','b','u','g','$','T'},{'.','d','r','e','c','t','v','e'},{'.','e','d','a','t','a','\0','\0'},{'.','i','d','a','t','a','\0','\0'},{'.','i','d','l','s','y','m','\0'},{'.','p','d','a','t','a','\0','\0'},{'.','r','d','a','t','a','\0','\0'},{'.','r','e','l','o','c','\0','\0'},{'.','r','s','r','c','\0','\0','\0'},{'.','s','b','s','s','\0','\0','\0'},{'.','s','d','a','t','a','\0','\0'},{'.','s','r','d','a','t','a','\0'},{'.','s','x','d','a','t','a','\0'},{'.','t','e','x','t','\0','\0','\0'},{'.','t','l','s','\0','\0','\0','\0'},{'.','t','l','s','$','\0','\0','\0'},{'.','v','s','d','a','t','a','\0'},{'.','x','d','a','t','a','\0','\0'}
};

像.debug$F这样的就是占用了8个byte的

节名长度大于8的情况。这个场景怎么办?结构体大小固定,我们不能越界写!那我们只能在其他地方去写了,然后在这个位置保存我们写入数据的偏移即可!是的,PE规范就是采用的这样的思想,只是稍微有点不同:以/开始,其后跟着一个表示偏移量的十进制数字字符串,如/4(0x2f 0 0x34 0x00 0x00 0x00 0x00 0x00 0x00)。这个数字是相对字符串表起始位置的偏移RA,我们的真实的节名就保存在字符串表中。我在我电脑上找到一个这样的文件avcodec-52.dll。我们先看Stud_PE的分析结果

可以看到Stud_PE对第5节的名字的解析是错的的,那正确的是什么?现在我们要回顾《PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1》,该文中我埋了一个伏笔,我把段提出来

        PointerToSymbolTable是0x00000000,该字段记录了该PE文件中调试信息符号表。由于符号表信息是在程序运行时不需要加载进入内存的,所以这个偏移使用的是相对文件头偏移RA。目前微软推荐是:将映像文件调试符号表信息独立的放在PDB文件中,所以不会在PE文件中再保存调试符号表信息,于是这个字段应该为0。当然这并不是硬性要求,我发现我电脑上就存在很多该字段不为0的文件。刚开始时我也不是很明白它们为什么要使用这个字段,特别是其指向的字符表个数(NumberOfSymbols)为0!!你说既然大小为0,那你指向有什么意思呢?其实这种设计是非常有深意的,我会在之后的章节中介绍这种深意。
        NumberOfSymbols是0x00000000,该字段记录了该PE文件中调试信息符号表元素个数。对于映像文件,该字段为0(非硬性要求),,理由在PointerToSymbolTable中已经说明。通过NumberOfSymbols和PointerToSymbolTable,我们可以找到字符串表起始位置,因为字符串表紧跟在符号表之后。  

看了这段后,我想你应该对那个伏笔有了解答。想想也挺有意思,微软不推荐在文件中包含调试信息,于是PointerToSymbolTable和NumberOfSymbols就是应该废弃的。可是这两个数据却关联着字符串表。字符串表大部分时候可以不使用,但是如果DLL中存在超过8byte的节名时又不得不用,于是只好让PointerToSymbolTable指向字符串表开始,而NumberOfSymbols为0。

现在我们来看下上面那个Stud_PE分析出错的文件的文件头信息

我们去0x001c1600+4的位置去寻找该节名字,该节名位.eh_frame,长度是9byte。

这儿要特别说明一点,可执行文件的节名长度是不会超过8的。即使obj文件中节名存在超过8的,也会在链接进入可执行文件时被截断。

VirtualSize属性是节加载进入内存后,节在内存中的大小。如果它比SizeOfRawData大,则多余的部分是用0x00填充的。这个性质非常重要,它是关系到RVA和RA之间换算的一个基础。

VirtualAddress属性是节加载进入内存后其第一个字节相对于映像基址的偏移(RVA)。

SizeOfRawData是磁盘映像文件中该节的已初始化数据的大小。对于可执行文件来说,它必须是IMAGE_OPTIONAL_HEADER32(64)::FileAlignment的倍数。.如果该节中仅包含未初始化的数据,则该字段为0。

PointerToRawData是磁盘映像文件中该节相对于映像基址的偏移(RA)。对于可执行文件来说,它的值要是IMAGE_OPTIONAL_HEADER32(64)::FileAlignment的倍数。如果该节中仅包含未初始化的数据,则该字段为0。

PointerToRelocations指向节中重定位项开头的相对映像基址的偏移(RA)。可执行文件或者不能重定向的文件该字段应该为0。

PointerToLinenumbers指向节中行号项的相对映像基址偏移(RA)。因为已经不推荐在PE文件中包含调试信息,所以该字段一般为0。

NumberOfRelocations是节中重定位项的个数。可执行文件和不可以重定位的文件该字段为0。

NumberOfLinenumbers是节中行号项的个数。因为已不推荐PE文件中包含调试信息,所以该字段一般为0。

Characteristics描述节的特征。

Flag

Value

Description

0x00000000

Reserved for future use.

0x00000001

Reserved for future use.

0x00000002

Reserved for future use.

0x00000004

Reserved for future use.

IMAGE_SCN_TYPE_NO_PAD

0x00000008

The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.

0x00000010

Reserved for future use.

IMAGE_SCN_CNT_CODE

0x00000020

The section contains executable code.

IMAGE_SCN_CNT_INITIALIZED_DATA

0x00000040

The section contains initialized data.

IMAGE_SCN_CNT_UNINITIALIZED_ DATA

0x00000080

The section contains uninitialized data.

IMAGE_SCN_LNK_OTHER

0x00000100

Reserved for future use.

IMAGE_SCN_LNK_INFO

0x00000200

The section contains comments or other information. The .drectve section has this type. This is valid for object files only.

0x00000400

Reserved for future use.

IMAGE_SCN_LNK_REMOVE

0x00000800

The section will not become part of the image. This is valid only for object files.

IMAGE_SCN_LNK_COMDAT

0x00001000

The section contains COMDAT data. For more information, see section 5.5.6, “COMDAT Sections (Object Only).” This is valid only for object files.

IMAGE_SCN_GPREL

0x00008000

The section contains data referenced through the global pointer (GP).

IMAGE_SCN_MEM_PURGEABLE

0x00020000

Reserved for future use.

IMAGE_SCN_MEM_16BIT

0x00020000

For ARM machine types, the section contains Thumb code.  Reserved for future use with other machine types.

IMAGE_SCN_MEM_LOCKED

0x00040000

Reserved for future use.

IMAGE_SCN_MEM_PRELOAD

0x00080000

Reserved for future use.

IMAGE_SCN_ALIGN_1BYTES

0x00100000

Align data on a 1-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_2BYTES

0x00200000

Align data on a 2-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_4BYTES

0x00300000

Align data on a 4-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_8BYTES

0x00400000

Align data on an 8-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_16BYTES

0x00500000

Align data on a 16-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_32BYTES

0x00600000

Align data on a 32-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_64BYTES

0x00700000

Align data on a 64-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_128BYTES

0x00800000

Align data on a 128-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_256BYTES

0x00900000

Align data on a 256-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_512BYTES

0x00A00000

Align data on a 512-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_1024BYTES

0x00B00000

Align data on a 1024-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_2048BYTES

0x00C00000

Align data on a 2048-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_4096BYTES

0x00D00000

Align data on a 4096-byte boundary. Valid only for object files.

IMAGE_SCN_ALIGN_8192BYTES

0x00E00000

Align data on an 8192-byte boundary. Valid only for object files.

IMAGE_SCN_LNK_NRELOC_OVFL

0x01000000

The section contains extended relocations.

IMAGE_SCN_MEM_DISCARDABLE

0x02000000

The section can be discarded as needed.

IMAGE_SCN_MEM_NOT_CACHED

0x04000000

The section cannot be cached.

IMAGE_SCN_MEM_NOT_PAGED

0x08000000

The section is not pageable.

IMAGE_SCN_MEM_SHARED

0x10000000

The section can be shared in memory.

IMAGE_SCN_MEM_EXECUTE

0x20000000

The section can be executed as code.

IMAGE_SCN_MEM_READ

0x40000000

The section can be read.

IMAGE_SCN_MEM_WRITE

0x80000000

The section can be written to.

IMAGE_SCN_LNK_NRELOC_OVFL 标志表明节中重定位项的个数超出了节头中为每个节保留的16 位所能表示的范围。如果设置了此标志并且节头中的NumberOfRelocations 域的值是0xffff,那么实际的重定位项个数被保存在第一个重定位项的VirtualAddress 域(32 位)中。如果设置了IMAGE_SCN_LNK_NRELOC_OVFL
标志但节中的重定位项的个数少于0xffff,则表示出现了错误。

最后贴一下Section节的获取算法

BOOL CGetPEInfo::GetSectionHeaders()
{GETPESTART();BOOL bSuc = FALSE;do {size_t unDwordSize = sizeof(DWORD); // PE\0\0size_t unImgFileHeaderSize = sizeof(IMAGE_FILE_HEADER);LPVOID lpSectionHeaderStart = (LPBYTE)m_lpPEStart + unDwordSize + unImgFileHeaderSize + m_FileHeader.SizeOfOptionalHeader;size_t unSectionHeaderSize = sizeof( IMAGE_SECTION_HEADER );for ( int i = 0; i < m_FileHeader.NumberOfSections; i++ ) {IMAGE_SECTION_HEADER SectionHeader;if ( FALSE == SafeCopy( &SectionHeader, lpSectionHeaderStart, unSectionHeaderSize ) ) {break;}IMAGE_SECTION_HEADERINFO SectionHeaderInfo;if ( '/' == SectionHeader.Name[0]) {std::string szOffsetStringTable;szOffsetStringTable.assign( &SectionHeader.Name[1], &SectionHeader.Name[IMAGE_SIZEOF_SHORT_NAME-1]);int nOffsetString = atoi( szOffsetStringTable.c_str() );LPSTR lpSetcionNameStart = (LPSTR)m_lpFileStart + m_FileHeader.PointerToSymbolTable;lpSetcionNameStart += (DWORD)(sizeof(IMAGE_SYMBOL) * m_FileHeader.NumberOfSymbols);lpSetcionNameStart += nOffsetString;SectionHeaderInfo.szSectionName = lpSetcionNameStart;if ( 0 != m_FileHeader.NumberOfSymbols ) {//_ASSERT(FALSE);      }}m_vecSectionHeaders.push_back( SectionHeader );SectionHeaderInfo.ImgSecHD = SectionHeader;m_vecSetcionHeaderInfo.push_back(SectionHeaderInfo);lpSectionHeaderStart = (LPBYTE)(lpSectionHeaderStart) + unSectionHeaderSize;}bSuc = TRUE;} while (0);return bSuc;
}

相关文章:

强悍!使用Flash和Silverlight制作控件

Silverlight已经发布了正式版本&#xff0c;我也到网站下载了一个并看看&#xff0c;突然发现了他的例子中包含了这个公司。NETiKA TECH。之所以说他强&#xff0c;是因为他尽然使用Flash和Silverlight制作了仿造WinForm的控件&#xff0c;包括&#xff1a;常见的控件&#xff…

《评人工智能如何走向新阶段》后记(再续8)

由AI科技大本营下载自视觉中国2019.12.13 81.近来一波人工智能热潮是在大数据的海量样本及超强计算能力两者支撑下形成的。所以说这一波人工智能是由大数据喂养出来的。这时的机器智能在感知智能和计算智能等一些具体问题上已经达到甚至超越人类水平&#xff0c;目前在语音识别…

Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详介AvatarNode

2019独角兽企业重金招聘Python工程师标准>>> 正如大家所知&#xff0c;NameNode在Hadoop系统中存在单点故障问题&#xff0c;这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。 1. Secondary NameNode 原理&#…

PE文件和COFF文件格式分析——RVA和RA相互计算

之前几节一直是理论性质的东西非常多。本文将会讲到利用之前的知识得出一个一个非常有用的一个应用。&#xff08;转载请指明来源于breaksoftware的csdn博客&#xff09; 首先我们说下磁盘上A.exe文件和正在内存中运行的A.xe之间的关系。当我们双击A.exe后&#xff0c;A.exe会运…

《评人工智能如何走向新阶段》后记(再续9)

由AI科技大本营下载自视觉中国2019.12.16 96. 近日《Nature》杂志推荐2019年度10大科学进展的杰出论文&#xff0c;其中一篇是有关人工智能的&#xff0c;谈采用深度学习/强化学习算法来训练四足机器狗ANYmal&#xff0c;使它能快速爬起来。该文谈到&#xff0c;在反复训练下&…

RTX组织架构刷新出现了问题

今天发现RTX的组织架构刷新出现了问题。按照网络上的方法什么的把什么配置文件的IP地址改啊改啊。还是没有用。也TELNET了8010端口&#xff0c;也没有用。其实这样的方法之前把服务程序装在另一台机器上倒是可以的。有点麻烦的了。呵呵不知道各位博友有没有解决的好方法啊。呵呵…

一个最简单的通过WireShark破解SSL加密网络数据包的方法

原文地址&#xff1a; http://article.yeeyan.org/view/530101/444688 一般来说&#xff0c;我们用WireShark来抓取包进行分析是没有多大问题的。但这里有个问题是&#xff0c;如果你碰到的是用SSL/TLS等加密手段加密过的网络数据的时候&#xff0c;往往我们只能束手无策。在过…

PE文件和COFF文件格式分析——导出表

在之前的《PE可选文件头》相关博文中我们介绍了可选文件头中很多重要的属性&#xff0c;而其中一个非常重要的属性是&#xff08;转载请指明来源于breaksoftware的CSDN博客&#xff09; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 该数组保存了…

将Quartz.NET集成到 Castle中

Castle是针对.NET平台的一个开源项目&#xff0c;从数据访问框架ORM到IOC容器&#xff0c;再到WEB层的MVC框架、AOP&#xff0c;基本包括了整个开发过程中的所有东西&#xff0c;为我们快速的构建企业级的应用程序提供了很好的服务.具体可参看TerryLee的Castle 开发系列文章。 …

《评人工智能如何走向新阶段》后记(再续10)

本文由AI科技大本营下载自视觉中国106.百度自研的飞桨&#xff08;Paddle paddle&#xff09;框架是中国自研的首个开源产业极人工智能深度学习框架&#xff0c;目前飞桨已累计服务150多万开发者&#xff0c;在定制化训练平台上企业用户超过6.5万&#xff0c;发布了16.9万模型&…

水管工游戏 (深搜)

水管工游戏 本题依然是采用搜索&#xff0c;深搜&#xff0c;广搜都可以&#xff0c;本代码采用深搜&#xff0c;此题在搜索时需要增加一些判断条件以及下一步要搜索的位置即可。 代码如下&#xff1a; #include<stdio.h> int a[51][51]; int book[51][51],n,m,flag0,top…

PE文件和COFF文件格式分析——导出表的应用——一种插件模型

可能在很多人想想中&#xff0c;只有DLL才有导出表&#xff0c;而Exe不应该有导出表。而在《PE文件和COFF文件格式分析——导出表》中&#xff0c;我却避开了这个话题。我就是想在本文中讨论下载Exe中存在导出表的场景。&#xff08;转载请指明出于breaksoftware的csdn博客&…

IBatis.Net学习笔记九--动态选择Dao的设计分析

在IBatis.Net中可以通过配置文件动态选择数据库、动态选择Dao对象。Dao对象也就是操作数据库的类&#xff0c;通过配置文件我们可以选择DataMapper的方式、Ado的方式、NHibernet的方式以前其他第三方的方式来操作数据库。有利于系统的灵活性和可扩展性。通过分析动态选择Dao的设…

Pytorch和Tensorflow,谁会笑到最后?

作者 | 土豆变成泥来源 | 知秋路&#xff08;ID:gh_4a538bd95663&#xff09;【导读】作为谷歌tensorflow某项目的Contributor&#xff0c;已经迅速弃坑转向Pytorch。目前Tensorflow还没有被Pytorch比下去&#xff0c;但之后极大概率被比下去。01 在学术界Pytorch已经超越Tenso…

HTTP请求的过程

HTTP通信机制是在一次完整的HTTP通信过程中&#xff0c;Web浏览器与Web服务器之间将完成下列7个步骤&#xff1a; 1. 建立TCP连接在HTTP工作开始之前&#xff0c;Web浏览器首先要通过网络与Web服务器建立连接&#xff0c;该连接是通过TCP来完成的&#xff0c;该协议与IP协议共同…

JSTL+EL表达式方法获取Oracle的Clob字段内容

我们在页面获得数据的时候一般的类型还是很好获得的,但是一遇到Clob类型就比较麻烦,最常用的方法是用一个流将其读取出来.使用MVC框架的时候这些都是无所谓的事情,因为反正是写在java类中怎么写都行,可是不使用MVC框架,使用jsp页面JSTL的sql标签去读取数据库的数据这种方式就麻…

通向人工智能产业落地化的道路在哪?

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;世事浮云&#xff0c;白云苍狗&#xff0c;转眼间关于人工智能的研究已历经两个世纪。在研究者和践行者的不懈努力之下&#xff0c;如今人工智能应用已遍地可见&#xff0c;无论是繁华都市还是偏远小镇&…

PE文件和COFF文件格式分析——导出表的应用——通过导出表隐性加载DLL

通过导出表隐性加载DLL&#xff1f;导出表&#xff1f;加载DLL&#xff1f;还隐性&#xff1f;是的。如果觉得不可思议&#xff0c;可以先看《PE文件和COFF文件格式分析——导出表》中关于“导出地址表”的详细介绍。&#xff08;转载请指明出于breaksoftware的csdn博客&#x…

系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常...

现象&#xff1a;spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 beans 的声明r的异常信息。 造成该异常原因有两种&#xff1a;第一,配置文件头部配置的xsd版…

DllMain中不当操作导致死锁问题的分析--死锁介绍

最近在网上看到一些关于在DllMain中不当操作导致死锁的问题&#xff0c;也没找到比较确切的解答&#xff0c;这极大吸引了我研究这个问题的兴趣。我花了一点时间研究了下&#xff0c;正好也趁机研究了下进程对DllMain的调用规律。因为整个研究篇幅比较长&#xff0c;我觉得还是…

XGBoost缺失值引发的问题及其深度分析 | CSDN博文精选

作者 | 兆军&#xff08;美团配送事业部算法平台团队技术专家&#xff09;来源 | 美团技术团队&#xff08;*点击阅读原文&#xff0c;查看美团技术团队更多文章&#xff09;背景XGBoost模型作为机器学习中的一大“杀器”&#xff0c;被广泛应用于数据科学竞赛和工业领域&#…

什么是CPI指数和GDP

即消费者物价指数(Consumer Price Index)&#xff0c;英文缩写为CPI&#xff0c;是反映与居民生活有关的产品及劳务价格统计出来的物价变动指标&#xff0c;通常作为观察通货膨胀水平的重要指标。如果消费者物价指数升幅过大&#xff0c;表明通胀已经成为经济不稳定因素&#x…

The Ultimate Guide To iPhone Resolutions

2019独角兽企业重金招聘Python工程师标准>>> ios 屏幕尺寸 像素 等说明 转载于:https://my.oschina.net/starmier/blog/467271

DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析

不知道大家是否思考过一个过程&#xff1a;系统试图运行我们写的程序&#xff0c;它是怎么知道程序起始位置的&#xff1f;很多同学想到&#xff0c;我们在编写程序时有个函数&#xff0c;类似Main这样的名字。是的&#xff01;这就是系统给我们提供的控制程序最开始的地方&…

力挺Python!同是程序员,为啥同事年前就实现了财务自由?

人红是非多&#xff0c;最近Python就遇到了这样的问题。与技术社区上一片「形势大好」对比鲜明的是&#xff0c;国内技术圈却一直存在对Python&#xff0c;「力挺」和「吃瓜」两派阵营&#xff0c;针锋相对&#xff0c;那么&#xff0c;Python到底有没有用&#xff0c;真相究竟…

C# 判断远程文件是否存在

#region 判断远程文件是否存在/// <summary>/// 判断远程文件是否存在/// </summary>/// <param name"fileUrl"></param>/// <returns></returns>public static bool RemoteFileExists(string fileUrl){HttpWebRequest re null…

DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

有了前面两节的基础&#xff0c;我们现在切入正题&#xff1a;研究下DllMain为什么会因为不当操作导致死锁的问题。首先我们看一段比较经典的“DllMain中死锁”代码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; //主线程中 HMODULE h LoadLibraryA(strD…

性能超FPN!北大、阿里等提多层特征金字塔网络

作者 | Qijie Zhao等编译 | 李杰出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;特征金字塔网络具有处理不同物体尺度变化的能力&#xff0c;因此被广泛应用到one-stage目标检测网络&#xff08;如DSSD&#xff0c;RetinaNet&#xff0c;RefineDet&#xff09;和two-…

什么是WIFI

WIFI全称Wireless Fidelity&#xff0c;又称802.11b标准&#xff0c;它的最大优点就是传输速度较高&#xff0c;可以达到11Mbps&#xff0c;另外它的有效距离也很长&#xff0c;同时也与已有的各种802.11DSSS设备兼容。 WIFI是由AP(Access Point)和无线网卡组成的无线网络。…

Android入门——电话拨号器和4种点击事件

关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路。大体分为三步&#xff1a; 1.理解需求&#xff0c;理清思路 2.设计UI 3.代码实现 电话拨号器 1. 理解需求&#xff1a; *一个文本框——用来接收电话号码 *一个button——用来触发事…