系统安全绕不开PE文件,PE文件又与恶意样本检测及分析紧密相关。前文作者带领大家逆向分析两个CrackMe程序,包括逆向分析和源码还原。这篇文章主要介绍了PE文件基础知识及恶意样本检测的三种处理知识,手动编写代码实现了提取IAT表、二进制转字符串及获取PE文件时间戳,这是恶意样本分析和溯源至关重要的基础,并且网络上还没见到同时涵盖这三个功能且详细的文章,希望对您有所帮助。术路上哪有享乐,为了提升安全能力,别抱怨,干就对了~

同时,PE文件基础知识推荐作者另一个安全系列:

  • [网络安全自学篇] PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改
  • [网络安全自学篇] PE文件逆向之数字签名解析及Signcode、PEView、010Editor等工具用法
  • [网络安全自学篇] Windows PE病毒原理、分类及感染方式详解

从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

接下来我将开启新的安全系列,叫“安全攻防进阶篇”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

  • 推荐前文:网络安全自学篇系列-100篇

话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好或侵权的地方,可以联系我删除。基础性文章,希望对您有所帮助,作者目的是与安全人共同进步,也强烈推荐大家去看看钱老师的视频,加油~

文章目录

  • 一.PE文件
    • 1.PE文件基础
    • 2.PE文件格式解析
  • 二.编写代码提取IAT表
  • 三.二进制PE文件转字符串
  • 四.自动提取PE文件时间戳
  • 五.总结

作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
Windows-Hacker:https://github.com/eastmountyxz/PE-InfoGet


声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)

前文回顾:
[安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向 (1)
[安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例 (2)
[安全攻防进阶篇] 三.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏 (3)
[安全攻防进阶篇] 四.逆向分析之条件语句和循环语句源码还原及流程控制逆向 (4)
[安全攻防进阶篇] 五.逆向分析之Win32 API获取及加解密目录文件、OllyDbg逆向其原理 (5)
[安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断 (6)



一.PE文件

1.PE文件基础

什么是PE文件?
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。

EXE文件格式:

  • DOS:MZ格式
  • WIndows 3.0/3.1:NE(New Executable)、16位Windows可执行文件格式

为什么要重点学习这种文件格式呢?

  • PE文件是可移植、可执行、跨Win32平台的文件格式
  • 所有Win32执行体(exe、dll、kernel mode drivers)
  • 知道PE文件本质后,能更好进行恶意样本分析、APT攻击分析、勒索病毒分析
  • 了解软件加密和加壳的思想,能够PJ相关的PE文件
  • 它是您熟悉Windows操作系统的第一步,包括EXE程序怎么映射到内存,DLL怎么导入等
  • 软件逆向工程的基本思想与PE文件格式息息相关
  • 如果您想成为一名黑客、系统安全工程师,那么精通PE文件是非常必要的

可执行程序是具有不同的形态的,比如用户眼中的QQ如下图所示。

在这里插入图片描述

本质上,QQ如下图所示。

在这里插入图片描述


PE文件格式总体结构
接着让我们来欣赏下PE文件格式总体结构图,包括:MZ头部、DOS stub、PE文件头、可选文件头、节表、节等。

在这里插入图片描述

本文的第二部分我们将对PE文件格式进行详细解析。比如,MZ头文件是定位PE文件头开始位置,用于PE文件合法性检测。DOS下运行该程序时,会提示用户“This Program cannot be run in DOS mode”。

在这里插入图片描述

PE文件格式与恶意软件的关系

  • 何为文件感染或控制权获取?
    使目标PE文件具备或启动病毒功能(或目标程序)
    不破坏目标PE文件原有功能和外在形态(如图标)等
  • 病毒代码如何与目标PE文件融为一体呢?
    代码植入
    控制权获取
    图标更改
    Hook

PE文件解析常用工具包括:

  • PEView:可按照PE文件格式对目标文件的各字段进行详细解析。
  • Stud_PE:可按照PE文件格式对目标文件的各字段进行详细解析。
  • Ollydbg:可跟踪目标程序的执行过程,属于用户态调试工具。
  • UltraEdit \ 010Editor:可对目标文件进行16进制查看和修改。


2.PE文件格式解析

我们通过010Editor观察PE文件例子程序hello-2.5.exe的16进制数据,详细讲解PE文件格式。PE文件结构如下图所示,推荐大家使用010Editor工具及其模板来进行PE文件分析。

MZ头部+DOS stub+PE文件头+可选文件头+节表+节

在这里插入图片描述


(1) 使用010Editor工具打开PE文件,并运行模板。
该PE文件可分为若干结构,如下图所示。

在这里插入图片描述


(2) MZ文件头(000h-03fh)。
下图为hello-2.5.exe的MZ文件头,该部分固定大小为40H个字节。偏移3cH处字段Offset to New EXE Header,指示“NT映象头的偏移地址”,其中000000B0是NT映象头的文件偏移地址,定位PE文件头开始位置,用于PE文件合法性检验。

在这里插入图片描述

000000B0指向PE文件头开始位置。

在这里插入图片描述


(3) DOS插桩程序(040h-0afh)
DOS Stub部分大小不固定,位于MZ文件头和NT映象头之间,可由MZ文件头中的Offset to New EXE Header字段确定。下图为hello-2.5.exe中的该部分内容。

在这里插入图片描述


(4) PE文件头(0b0h-1a7h)
该部分包括PE标识、映像文件头、可选文件头。

  • Signature:字串“PE\0\0”,4个字节(0b0H~0b4H)
  • 映象文件头File Header:14H个字节(0b5H~0c7H)
    偏移2H处,字段Number of Section 给出节的个数(2个字节):0003
    偏移10H处,字段Size of Optional Header 给出可选映象头的大小(2个字节):00E0
  • 可选映象头Optional Header:0c8H~1a7H

在这里插入图片描述

对应解析如下图所示,包括PE标识、X86架构、3个节、文件生成时间、COFF便宜、可选头大小、文件信息标记等。

在这里插入图片描述

010Editor使用模板定位PE文件各节点信息。

在这里插入图片描述

PE文件可选文件头224字节,其对应的字段信息如下所示:

typedef struct _IMAGE_OPTIONAL_HEADER {WORD    Magic;                  /*机器型号,判断是PE是32位还是64位*/BYTE    MajorLinkerVersion;          /*连接器版本号高版本*/BYTE    MinorLinkerVersion;          /*连接器版本号低版本,组合起来就是 5.12 其中5是高版本,C是低版本*/DWORD   SizeOfCode;               /*代码节的总大小(512为一个磁盘扇区)*/DWORD   SizeOfInitializedData;        /*初始化数据的节的总大小,也就是.data*/DWORD   SizeOfUninitializedData;       /*未初始化数据的节的大小,也就是 .data ? */DWORD   AddressOfEntryPoint;          /*程序执行入口(OEP) RVA(相对偏移)*/DWORD   BaseOfCode;               /*代码的节的起始RVA(相对偏移)也就是代码区的偏移,偏移+模块首地址定位代码区*/DWORD   BaseOfData;               /*数据结的起始偏移(RVA),同上*/DWORD   ImageBase;               /*程序的建议模块基址(意思就是说作参考用的,模块地址在哪里)*/DWORD   SectionAlignment;           /*内存中的节对齐*/DWORD   FileAlignment;             /*文件中的节对齐*/WORD    MajorOperatingSystemVersion;    /*操作系统版本号高位*/WORD    MinorOperatingSystemVersion;    /*操作系统版本号低位*/WORD    MajorImageVersion;          /*PE版本号高位*/WORD    MinorImageVersion;          /*PE版本号低位*/WORD    MajorSubsystemVersion;        /*子系统版本号高位*/WORD    MinorSubsystemVersion;        /*子系统版本号低位*/DWORD   Win32VersionValue;          /*32位系统版本号值,注意只能修改为4 5 6表示操作系统支持nt4.0 以上,5的话依次类推*/DWORD   SizeOfImage;               /*整个程序在内存中占用的空间(PE映尺寸)*/DWORD   SizeOfHeaders;            /*所有头(头的结构体大小)+节表的大小*/DWORD   CheckSum;               /*校验和,对于驱动程序,可能会使用*/WORD    Subsystem;              /*文件的子系统 :重要*/WORD    DllCharacteristics;         /*DLL文件属性,也可以成为特性,可能DLL文件可以当做驱动程序使用*/DWORD   SizeOfStackReserve;         /*预留的栈的大小*/DWORD   SizeOfStackCommit;          /*立即申请的栈的大小(分页为单位)*/DWORD   SizeOfHeapReserve;          /*预留的堆空间大小*/DWORD   SizeOfHeapCommit;           /*立即申请的堆的空间的大小*/DWORD   LoaderFlags;             /*与调试有关*/DWORD   NumberOfRvaAndSizes;         /*下面的成员,数据目录结构的项目数量*/IMAGE_DATA_DIRECTORY DataDirectory[16];  /*数据目录,默认16个,16是宏,这里方便直接写成16*/
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

(5) 节表(1a8h-21fh)

  • 表项大小固定,28H个字节;表项个数由映象文件头的字段Number of Section 给出。
  • 每个表项的起始位置起(8个字节),字段Name给出对应节的名称。
  • 每个表项的偏移14H处(4个字节),字段Offset to Raw Data给出对应节的起始文件偏移。

在这里插入图片描述

该结构包括3个节,对应上图的3个struct IMAGE_SECTION_HEADER,即“.test”、“.rdata”、“.data”节,其偏移地址对应下图紫色区域,分别是400、600、800的位置。

在这里插入图片描述


(6) 3个节

  • 400H-5ffH:代码节
  • 600H-7ffH:引入函数节
  • 800H-9ffH:数据节

在这里插入图片描述

注意,代码节“.text”前46H为数据,后面全是0位填充值,为了实现文件的200H对齐,所以代码节是400H到5ffH。

在这里插入图片描述


(7) 引入函数节
⽤来从其他DLL中引⼊函数,引入了kernel32.dll和user32.dll,这个节一般名为“.rdata”。引入函数是被某模块调用的但又不在调用者模块中的函数,用来从其他(系统或第三方写的)DLL中引入函数,例如kernel32.dll、gdi32.dll等。

在这里插入图片描述

010Editor打开如下图所示:

在这里插入图片描述

详细标注信息如下图所示:(图引自HYQ同学,再此感谢)

在这里插入图片描述


(8) 数据节
数据节实际大小58h,对齐后大小200h,地址为800h-9ffh,包括对话框弹出的具体内容。

在这里插入图片描述



二.编写代码提取IAT表

IAT的全称是Import Address Table,导入地址表。 IAT表是执行程序或者DLL为了实现动态加载和重定位函数地址,用到的一个导入函数地址表,这里面记录了每个导入函数的名字和所在的DLL名称。在PE加载的时候系统会加载这些DLL到用户的地址空间然后把函数地址覆盖这个表里的函数地址,然后重构所有用到这个表的代码,让其调用直接指向实际函数地址,PE的IAT表会留在内存,其中导入地址表就指示函数实际地址。


首先,我们通过Stud_PE软件打开我们的hello-2.5.exe,发现它调用了两个DLL和两个函数。

  • kernel32.dll:ExitProcess
  • user32.dll:MessageBoxA

在这里插入图片描述

同样的方法我们打开恶意样本就可以发现它加载的DLL文件及IAT表内容,如下图所示的网络函数及进程、文件操作,包括对应的地址和名称。

在这里插入图片描述

在这里插入图片描述


第二步,我们打开VS或VC++,新建工程添加main.cpp函数。编写代码如下,它将实现一个自动提取IAT表名称的功能。

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <Dbghelp.h>void ReadNTPEInfo(PIMAGE_NT_HEADERS pImageNtPE);
ULONG RvaToOffset(IMAGE_NT_HEADERS* pNtHeader, ULONG Rva);#define pNtHeaders pImageNtHeadersint main()
{//PE文件名称char file[] = "hello-2.5.exe";char name[] = "test";//DOS头PIMAGE_DOS_HEADER pImageDosHeader;//NT头(包括PE标识+Image_File_Header+OptionHeader)PIMAGE_NT_HEADERS pImageNtHeaders;//标准PE头、PIMAGE_FILE_HEADER pImageFileHeader;//扩展PE头IMAGE_OPTIONAL_HEADER32 pImageOptionHeaders;HANDLE hFile;HANDLE hMapObject;//DOS头PUCHAR uFileMap;hFile = CreateFile(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);if (hFile == NULL){printf("打开文件失败\n");system("pause");return 0;}hMapObject = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);if (hMapObject == NULL){printf("创建文件映射内核对对象失败\n");system("pause");return 0;}//PE基址uFileMap = (PUCHAR)MapViewOfFile(hMapObject, FILE_MAP_READ, 0, 0, 0);if (uFileMap == NULL){printf("映射到进程地址空间失败\n");system("pause");return 0;}pImageDosHeader = (PIMAGE_DOS_HEADER)uFileMap;if (pImageDosHeader->e_magic != IMAGE_DOS_SIGNATURE){printf("不是PE结构\n");system("pause");return 0;}//定位到NT PE头pImageNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)uFileMap + pImageDosHeader->e_lfanew);//导入表的相对虚拟地址(RVA)ULONG rva_ofimporttable = pImageNtHeaders->OptionalHeader.DataDirectory[1].VirtualAddress;//根据相对虚拟(rva)地址计算偏移地址(offset)ULONG offset_importtable = RvaToOffset(pImageNtHeaders, rva_ofimporttable);if (!offset_importtable){printf("获取导入表偏移地址失败\n");system("pause");return 0;}PIMAGE_THUNK_DATA s;//取得导入表的地址IMAGE_IMPORT_DESCRIPTOR* pImportTable = (IMAGE_IMPORT_DESCRIPTOR*)((char*)uFileMap + offset_importtable);IMAGE_IMPORT_DESCRIPTOR null_iid;IMAGE_THUNK_DATA null_thunk;memset(&null_iid, 0, sizeof(null_iid));memset(&null_thunk, 0, sizeof(null_thunk));//每个元素代表了一个引入的DLL。for (int i = 0; memcmp(pImportTable + i, &null_iid, sizeof(null_iid)) != 0; i++){//获取DLL名称char* dllName = (char*)(uFileMap + RvaToOffset(pImageNtHeaders, pImportTable[i].Name));printf("模块[%d]: %s\n", i, (char*)dllName);printf("%s\n", (char*)dllName);PIMAGE_THUNK_DATA32 pThunk = (PIMAGE_THUNK_DATA32)(uFileMap + RvaToOffset(pImageNtHeaders, pImportTable[i].FirstThunk));while (pThunk->u1.Ordinal != NULL){PIMAGE_IMPORT_BY_NAME pname = (PIMAGE_IMPORT_BY_NAME)(uFileMap + RvaToOffset(pImageNtHeaders, pThunk->u1.AddressOfData));printf("函数编号: %d 名称: %s\n", pname->Hint, pname->Name);//文件名称 DLL名称 函数名称 组织名称//printf("%s,%s,%s,%s\n", file, (char*)dllName, pname->Name, name);pThunk++;}printf("\n");}system("pause");return 0;
}//读取PE文件信息
void ReadNTPEInfo(PIMAGE_NT_HEADERS pImageNtPE)
{printf("运行平台:   0x%04X\n", pImageNtPE->FileHeader.Machine);printf("节数量:   %d\n", pImageNtPE->FileHeader.NumberOfSections);printf("PE属性:   0x%04X\n", pImageNtPE->FileHeader.Characteristics);
}//计算Offset
ULONG RvaToOffset(IMAGE_NT_HEADERS* pNtHeader, ULONG Rva)
{//PE节IMAGE_SECTION_HEADER* p_section_header;ULONG sNum, i;//取得节表项数目sNum = pNtHeader->FileHeader.NumberOfSections;//取得第一个节表项p_section_header = (IMAGE_SECTION_HEADER*)((BYTE*)pNtHeader + sizeof(IMAGE_NT_HEADERS));for (i = 0; i < sNum; i++){//printf("PE 节名称: %s\n",p_section_header->Name);if ((p_section_header->VirtualAddress <= Rva) && Rva < (p_section_header->VirtualAddress + p_section_header->SizeOfRawData)){return Rva - p_section_header->VirtualAddress + p_section_header->PointerToRawData;}p_section_header++;}return 0;
}

输出结果如下图所示:

在这里插入图片描述


同样的方法我们可以获取恶意样本的IAT表,如下图所示:

模块[0]: msvcrt.dll
msvcrt.dll
函数编号: 221 名称: _controlfp
函数编号: 158 名称: __set_app_type
函数编号: 746 名称: memcpy
函数编号: 138 名称: __p__fmode
函数编号: 133 名称: __p__commode
函数编号: 189 名称: _adjust_fdiv
函数编号: 160 名称: __setusermatherr
函数编号: 322 名称: _initterm
函数编号: 170 名称: __wgetmainargs
函数编号: 560 名称: _wcmdln
函数编号: 668 名称: exit
函数编号: 207 名称: _cexit
函数编号: 79 名称: _XcptFilter
函数编号: 253 名称: _exit
函数编号: 204 名称: _c_exit
函数编号: 740 名称: malloc
函数编号: 244 名称: _except_handler3
函数编号: 748 名称: memset模块[1]: urlmon.dll
urlmon.dll
函数编号: 113 名称: UrlMkGetSessionOption模块[2]: WININET.dll
WININET.dll
函数编号: 154 名称: InternetOpenW
函数编号: 105 名称: InternetCheckConnectionW
函数编号: 159 名称: InternetReadFile
函数编号: 107 名称: InternetCloseHandle
函数编号: 153 名称: InternetOpenUrlW模块[3]: KERNEL32.dll
KERNEL32.dll
函数编号: 449 名称: GetCurrentProcessId
函数编号: 453 名称: GetCurrentThreadId
函数编号: 659 名称: GetTickCount
函数编号: 935 名称: QueryPerformanceCounter
函数编号: 1189 名称: SetUnhandledExceptionFilter
函数编号: 1235 名称: UnhandledExceptionFilter
函数编号: 1216 名称: TerminateProcess
函数编号: 611 名称: GetStartupInfoW
函数编号: 1273 名称: WaitForSingleObject
函数编号: 181 名称: CreateThread
函数编号: 448 名称: GetCurrentProcess
函数编号: 1258 名称: VirtualAllocEx
函数编号: 1202 名称: Sleep
函数编号: 633 名称: GetSystemTimeAsFileTime.

该部分代码参考看雪SuperProgram师傅文章,非常感谢。

  • https://www.52pojie.cn/thread-549840-1-1.html

第三步,为什么要实现这个功能呢?其它工具不是都有类似的功能了。
首先,在线沙箱在分析恶意代码时,它们也会从IAT表这个角度进行分析。其操作比较简单,就是将恶意样本上传至指定在想网址即可。

  • virustotal沙箱:https://www.virustotal.com/
  • 360沙箱:https://ti.qianxin.com/
  • Cuckoo沙箱:https://cuckoo.cert.ee/
  • 微步沙箱:https://s.threatbook.cn/

我们以 virustotal沙箱为例,打开主页如下图所示,点击“choose file”,上传我们的勒索exe文件。

在这里插入图片描述

结果从72个在线引擎中扫描出4个是恶意样本的引擎,如下图所示:

在这里插入图片描述

我们可以看到该样本的基本信息,包括MD5、SHA-1、文件历史信息、PE文件节点信息。其中关注的重点是该文件的导入函数信息,在Imports中显示,主要包括:

  • KERNEL32.dll
  • VCRUNTIME140D.dll
  • ucrtbased.dll

在这里插入图片描述

ucrtbased.dll主要包括的文件操作如下图所示,比如fopen、fputc、system、rename等函数。

在这里插入图片描述

其次,当我们要分析海量样本,从中提取其关联性时,是需要编写代码实现自动提取特征,再进行分析的,所以本部分实现了一个C++代码提取IAT表的技术,希望对您有所帮助。当获取各个APT组织的函数调用信息,才能进一步挖掘它们的特征及习惯。

在这里插入图片描述



三.二进制PE文件转字符串

下面分享如何将二进制文件转换成十六进制,再转换成字符串的过程。这里作者真心请教大家两个问题:

  • 如果自动获取PE文件中定义的字符串呢?
  • 如果自动转换成对应的源代码呢?
  • 如何自动提取每部分功能对应的核心代码呢?

在这里插入图片描述

代码如下:

import os
import binascii#-----------------------------------定义转换函数-----------------------------------
def str_to_hex(s):return r"\x"+r'\x'.join([hex(ord(c)).replace('0x', '') for c in s])def hex_to_str(s):return ''.join([chr(i) for i in [int(b, 16) for b in s.split(r'\x')[1:]]])def str_to_bin(s):return ' '.join([bin(ord(c)).replace('0b', '') for c in s])def bin_to_str(s):return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])#--------------------------------二进制转字节码---------------------------------
fileIn = 'hello-2.5.exe'
fileOut = 'hex-hello'
inp = open(fileIn,'rb')
outp = open(fileOut,'w')i = 0
for c in inp.read():outp.write('\\%#04x' %(c))i += 1if i >= 16:outp.write('\n')i = 0
inp.close()
outp.close()
print('二进制换十六进制成功\n')"""
a="abcdefg"
x=str_to_hex(a)
print(x)
print(hex_to_str(x))
"""#--------------------------------字节码转换字符串--------------------------------
#decode():bytes编码转为str
#encode():str编码转为bytes
f = open('hex-hello', 'r')
outp = open("result-hello.txt",'w', encoding="utf-8")
for n in f.readlines():n = n.strip()txt = n.replace('\\0x','\\x')res = hex_to_str(txt)outp.write(res + '\n')
outp.close()
print('十六进制转字符串成功\n')

如果我们直接打开一个EXE文件,发现它显示如下图所示的内容:

在这里插入图片描述

当我们转换成16进制和字符串后,它变成了如下图所示的内容。字符串勉强还能进行下一步和自然语言处理结合的分析,但更详细的分析需要和PE文件结构结合。

在这里插入图片描述

在这里插入图片描述

如果我们使用IDA、010editor类似软件打开,它能够更清晰地对比各部分内容。

在这里插入图片描述


四.自动提取PE文件时间戳

接着我们尝试通过Python来获取时间戳,python的PE库是pefile,它是用来专门解析PE文件的,可静态分析PE文件。

第一步,我们通过010Editor分析PE文件。
其时间戳的输出结果如下:

  • 06/19/2020 10:46:21

我们希望通过Python写代码实现自动化提取,为后续自动化溯源提供帮助。

在这里插入图片描述

第二步,撰写Python代码实现简单分析。

import pefile
import os,string,shutil,rePEfile_Path = "MFCApplication.exe"pe = pefile.PE(PEfile_Path)
print(type(pe))
print(pe)

输出如下图所示结果,这是Python包自定义的PE结构。

在这里插入图片描述

squeezed text表示python的一种编程规范要求,简称pep8,你只需要将鼠标放到Squeezed上,右键Copy即可查看内容,显示的是该PE文件的基本结构。如下所示,与010Editor分析的结果前后是一致的。

----------DOS_HEADER----------[IMAGE_DOS_HEADER]
0x0        0x0   e_magic:                       0x5A4D    
0x2        0x2   e_cblp:                        0x90      
0x4        0x4   e_cp:                          0x3       
0x6        0x6   e_crlc:                        0x0       
0x8        0x8   e_cparhdr:                     0x4       
0xA        0xA   e_minalloc:                    0x0       
0xC        0xC   e_maxalloc:                    0xFFFF    
0xE        0xE   e_ss:                          0x0       
0x10       0x10  e_sp:                          0xB8      
0x12       0x12  e_csum:                        0x0       
0x14       0x14  e_ip:                          0x0       
0x16       0x16  e_cs:                          0x0       
0x18       0x18  e_lfarlc:                      0x40      
0x1A       0x1A  e_ovno:                        0x0       
0x1C       0x1C  e_res:                         
0x24       0x24  e_oemid:                       0x0       
0x26       0x26  e_oeminfo:                     0x0       
0x28       0x28  e_res2:                        
0x3C       0x3C  e_lfanew:                      0x108     ----------NT_HEADERS----------[IMAGE_NT_HEADERS]
0x108      0x0   Signature:                     0x4550    ----------FILE_HEADER----------[IMAGE_FILE_HEADER]
0x10C      0x0   Machine:                       0x14C     
0x10E      0x2   NumberOfSections:              0xA       
0x110      0x4   TimeDateStamp:                 0x5EEC977D [Fri Jun 19 10:46:21 2020 UTC]
0x114      0x8   PointerToSymbolTable:          0x0       
0x118      0xC   NumberOfSymbols:               0x0       
0x11C      0x10  SizeOfOptionalHeader:          0xE0      
0x11E      0x12  Characteristics:               0x102     
Flags: IMAGE_FILE_32BIT_MACHINE, IMAGE_FILE_EXECUTABLE_IMAGE----------OPTIONAL_HEADER----------[IMAGE_OPTIONAL_HEADER]
0x120      0x0   Magic:                         0x10B     
0x122      0x2   MajorLinkerVersion:            0xE       
0x123      0x3   MinorLinkerVersion:            0x1A      
0x124      0x4   SizeOfCode:                    0x700C00  
0x128      0x8   SizeOfInitializedData:         0x2F1E00  
0x12C      0xC   SizeOfUninitializedData:       0x0       
0x130      0x10  AddressOfEntryPoint:           0x36CE65  
0x134      0x14  BaseOfCode:                    0x1000    
0x138      0x18  BaseOfData:                    0x1000    
0x13C      0x1C  ImageBase:                     0x400000  
....----------PE Sections----------[IMAGE_SECTION_HEADER]
0x200      0x0   Name:                          .textbss
0x208      0x8   Misc:                          0x35B30B  
0x208      0x8   Misc_PhysicalAddress:          0x35B30B  
0x208      0x8   Misc_VirtualSize:              0x35B30B  
0x20C      0xC   VirtualAddress:                0x1000    
0x210      0x10  SizeOfRawData:                 0x0       
....

第三步,注意这里同样可以通过Python获取IAT表相关信息。

import pefile
import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件
pe = pefile.PE(PEfile_Path)
print(type(pe))
print(pe)#获取导入表信息
for item in pe.DIRECTORY_ENTRY_IMPORT:print(item.dll)for con in item.imports:print(con.name)print("") #换行

输出如下所示的结果,包括KERNEL32.dll、USER32.dll等。

b'KERNEL32.dll'
b'RtlUnwind'
b'GetModuleHandleExW'
b'GetCommandLineA'
b'GetSystemInfo'
b'CreateThread'
...b'USER32.dll'
b'DlgDirSelectExA'
b'FindWindowExA'
b'FindWindowA'
b'SetParent'
b'ChildWindowFromPointEx'
...

对应010editor的PE软件分析结果如下:

在这里插入图片描述


第四步,获取PE时间。通过pe.DOS_HEADER、pe.FILE_HEADER和正则表达式等方法获取对应的内容。

import pefile
import os,string,shutil,rePEfile_Path = "MFCApplication.exe"#解析PE文件
pe = pefile.PE(PEfile_Path, fast_load=True)
print(type(pe))
print(pe)
print(pe.get_imphash())#显示DOS_HEADER
dh = pe.DOS_HEADER#显示NT_HEADERS
nh = pe.NT_HEADERS#显示FILE_HEADER
fh = pe.FILE_HEADER#显示OPTIONAL_HEADER
oh = pe.OPTIONAL_HEADERprint(type(fh)) #<class 'pefile.Structure'>
print(str(fh))#通过正则表达式获取时间
p = re.compile(r'[[](.*?)[]]', re.I|re.S|re.M)   #最小匹配
res = re.findall(p, str(fh))
print(res[1])                                    #第一个值是IMAGE_FILE_HEADER
# Fri Jun 19 10:46:21 2020 UTC

最终输出结果如下所示,这样我们就完成了Python自动化提取PE软件的时间戳过程。任何一个PE软件都能进行提取,该时间戳也记录了软件的编译时间。

<class 'pefile.PE'>
Squeezed text(347 lines).<class 'pefile.Structure'>
[IMAGE_FILE_HEADER]
0x10C      0x0   Machine:                       0x14C     
0x10E      0x2   NumberOfSections:              0xA       
0x110      0x4   TimeDateStamp:                 0x5EEC977D [Fri Jun 19 10:46:21 2020 UTC]
0x114      0x8   PointerToSymbolTable:          0x0       
0x118      0xC   NumberOfSymbols:               0x0       
0x11C      0x10  SizeOfOptionalHeader:          0xE0      
0x11E      0x12  Characteristics:               0x102     Fri Jun 19 10:46:21 2020 UTC

为什么要进行这样的时间戳分析呢?
在过去的四年中,安天的工程师们关注到了中国的机构和用户反复遭遇来自“西南方向”的网络入侵尝试。这些攻击虽进行了一些掩盖和伪装,我们依然可以将其推理回原点——来自南亚次大陆的某个国家。他们是怎么做的呢?

安天通过对样本集的时间戳、时区分析进行分析,发现其来自南亚。样本时间戳是一个十六进制的数据,存储在PE文件头里,该值一般由编译器在开发者创建可执行文件时自动生成,时间单位细化到秒,通常可以认为该值为样本生成时间(GMT时间)。

在这里插入图片描述

时间戳的分析需要收集所有可用的可执行文件时间戳,并剔除过早的和明显人为修改的时间,再将其根据特定标准分组统计,如每周的天或小时,并以图形的形式体现,下图是通过小时分组统计结果:

在这里插入图片描述

从上图的统计结果来看,如果假设攻击者的工作时间是早上八九点至下午五六点的话,那么将工作时间匹配到一个来自UTC+4或UTC+5时区的攻击者的工作时间。根据我们匹配的攻击者所在时区(UTC+4 或UTC+5),再对照世界时区分布图,就可以来推断攻击者所在的区域或国家。

在这里插入图片描述

所以当我们受到持续攻击,并且样本存在相似性的时候,就可以通过这种方法简单溯源其攻击地区来源。当然该方法比较粗,您需要进一步结合样本特征深入分析。

最终代码:

import pefile
import time
import warnings
import datetime
import os,string,shutil,re#忽略警告
warnings.filterwarnings("ignore")PEfile_Path = "MFCApplication.exe"#----------------------------------第一步 解析PE文件-------------------------------
pe = pefile.PE(PEfile_Path, fast_load=True)
print(type(pe))
print(pe)
print(pe.get_imphash())#显示DOS_HEADER
dh = pe.DOS_HEADER#显示NT_HEADERS
nh = pe.NT_HEADERS#显示FILE_HEADER
fh = pe.FILE_HEADER#显示OPTIONAL_HEADER
oh = pe.OPTIONAL_HEADERprint(type(fh)) #<class 'pefile.Structure'>
print(str(fh))#----------------------------------第二步 获取UTC时间-------------------------------
#通过正则表达式获取时间
p = re.compile(r'[[](.*?)[]]', re.I|re.S|re.M)   #最小匹配
res = re.findall(p, str(fh))
print(res[1])                                    #第一个值是IMAGE_FILE_HEADER
res_time = res[1].replace(" UTC","")
# Fri Jun 19 10:46:21 2020 UTC#获取当前时间
t = time.ctime()
print(t,"\n")                                    # Thu Jul 16 20:42:18 2020
utc_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y')
print("UTC Time:", utc_time)
# 2020-06-19 10:46:21#----------------------------------第三步 全球时区转换-------------------------------
#http://zh.thetimenow.com/india
#UTC时间比北京时间晚八个小时 故用timedelta方法加上八个小时
china_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=8)
print("China Time:",china_time)#美国 UTC-5
america_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') - datetime.timedelta(hours=5)
print("America Time:",america_time)#印度 UTC+5
india_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=5)
print("India Time:",india_time)#澳大利亚 UTC+10
australia_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=10)
print("Australia Time",australia_time)#俄罗斯 UTC+3
russia_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=3)
print("Russia Time",russia_time)#英国 UTC+0
england_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y')
print("England Time",england_time)#日本 UTC+9
japan_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=9)
print("Japan Time",england_time)#德国 UTC+1
germany_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=1)
print("Germany Time",germany_time)#法国 UTC+1
france_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=1)
print("France Time",france_time)#加拿大 UTC-5
canada_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') - datetime.timedelta(hours=5)
print("Canada Time:",canada_time)#越南 UTC+7 
vietnam_time = datetime.datetime.strptime(res_time, '%a %b %d %H:%M:%S %Y') + datetime.timedelta(hours=7)
print("Vietnam Time:",vietnam_time)

输出结果如下图所示,不同地区有对应的时间分布,如果正常作息是早上9点到12点、下午2点到5点,从结果看更像是来自India、England、Japan等地区。当然,只有恶意样本很多、持续攻击的时候,单个样本意义并不大,我们才能进行更好的溯源,哈哈~

在这里插入图片描述



五.总结

写到这里,这篇文章就介绍完毕,这三个技术在恶意代码溯源和分析中都非常普遍,希望对您有所帮助,最后进行简单的总结下。

  • PE文件
    PE文件基础
    PE文件格式解析
  • 编写代码提取IAT表
  • 二进制PE文件转字符串
  • 自动提取PE文件时间戳

学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。

有点想家和女神了!月是故乡圆啊~接着加油。

编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。

(By:Eastmount 2020-08-12 星期三 中午2点写于武汉 http://blog.csdn.net/eastmount/ )



查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 团队管理小结一

    简单点说,研发眼里的三条线。产品,研发,测试。 理想中的团队 产品:负责产品需求的确定。 研发:负责需求的实现。 测试:产品质量的把控。 现实中的团队产品: 自己:功能不错,交互也不错。看起来高大上,竞品也不过如此。 研发眼中的产品:需求天天变,逻辑不通,逻辑混乱…...

    2024/4/29 14:25:38
  2. 强烈推荐!15 个 Github 顶级 Java 教程类开源项目推荐!

    B站在线观看地址:https://www.bilibili.com/video/av90155402 ,来个三连和关注啊!大家好,我是 Guide 哥!今天给大家推荐 15 个新手也能看懂的 Java 教程方向的开源项目。这些项目无论是对于你学习 Java 还是准备 Java 方向的面试都非常有帮助。正如我第一个要推荐的开源项…...

    2024/4/29 14:25:34
  3. ImportError: numpy.core.multiarray failed to import

    总结一下自己在安装pytorch的时候 出现这个问题的原因 先说一下自己的情况:anaconda 创建虚拟环境 pytorch2. 使用官网的方法 conda install pytorch torchvision cudatoolkit=10.2 -c pytorch 来进行安装出现 ImportError: numpy.core.multiarray failed to import 这…...

    2024/4/29 14:25:33
  4. 腾讯位置服务点聚合应用之地图找房

    链家实现的效果分析 地图找房功能使用点聚合来实现的。官网示例如下:https://lbs.qq.com/javascript_v2/sample/overlay-markercluster.html链家的地图找房主要分为三层。第一层为市区层,比如南山、罗湖等;第二层为片区,比如南头、科技园等;第三层则为小区。 因为第一层,…...

    2024/4/29 14:25:28
  5. 【好用的工具】加密解密工具 commons-codec

    一、Base641.1 什么是Base64Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法1.2 小思考什么是可打印字符串?为什么要用它来传输8Bit字节码呢? 回答这两个问题之前我们有必要思考什么情况下需要使用到Base6…...

    2024/4/29 14:25:22
  6. 从佳能被勒索10GB数据事件,谈企业如何做好数据全生命周期保护

    近日,著名数码摄像机厂商佳能被曝疑似遭受Maze团伙勒索攻击,其中影响包含电子邮件、微软团队、美国网站以及其他内部应用程序。据外媒报道称,佳能image.canon云照片和视频存储服务的可疑中断,导致其免费10GB存储功能的用户数据丢失。由BleepingComputer消息称,佳能正在经历…...

    2024/5/1 5:15:42
  7. 小成本创造高回报?这家企业的创新培训模式有点牛

    组织发展,人才先行。在日新月异的市场环境下,企业想要在竞争中占领高地,离不开对人才的能力培养。对于员工分布广且正在不断发展壮大的南京天加环境科技有限公司来说更是如此。作为中国中央空调四大品牌之一的天加,在国内拥有五大运营基地,八大工厂,在全球拥有70多个分支…...

    2024/4/29 14:25:14
  8. 华为“天才少年”的200万年薪里,藏着人力资源管理的下一个10年

    作者:朱结焰 (GHR原创作者 前百亿企业OD总监)来源:环球人力资源智库(ID:HRBP-007) 华为200 万年薪招聘“天才少年”再次引起热议。据长江日报8 月3 日报道,华中科技大学今年计算机专业毕业的博士生张霁和姚婷入选华为“天才少年”。其中,张霁拿到华为“天才少年”最高…...

    2024/4/29 14:25:10
  9. 2020.4-2020.5面试问题总结

    说一下http和https的区别 io流子节流字符流的区别 说一下分布式事务的理解 poi导入导出,怎么指定格式 freemaker静态化怎么静态成html文件 elaticsearch如何使用 工作中有没有遇到什么挑战。 页面发布怎么实现 说几个sql常用函数 spring中bean特性,说一下单例,多例 说一下线…...

    2024/4/29 14:25:07
  10. 很全很详细的FIFO Generator IP核的使用规则

    ** FIFO Generator IP核的使用 ** 1 概述 (1)最大支持500M (2)支持三种接口:Native interface FIFOs、 AXI Memory Mapped interface FIFOs、 AXI4-Stream interface FIFOs (3)读写数据时,在数据上升沿采样 2 FIFO规则 2.1 empty/full信号 实际上即使有数据写入到fifo中…...

    2024/5/2 10:15:12
  11. 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)

    最近我出了一本书,《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Python爬虫、数据分析和机器学习的技术,大家看了我的书,不仅能很快用比较热门的案例学好Python,更能了解些股票知识,不至于一…...

    2024/4/29 0:58:56
  12. 互联网金融“断代史”

    从被追捧到被讨伐,从野蛮生长到行业肃清,不过三五载,这潭浑水已经开始冷静。 截取几个片段,聊一下互联网金融的昨天、今天和明天。 一、起源:支付宝的诞生和第三方支付的兴起 互联网对金融的需求,源于电商对交易的需求。 2003年初,淘宝推出“担保交易”的模式,来解决电…...

    2024/4/29 14:24:54
  13. 如何在家访问数字图书馆|文献(图书、期刊、论文等)免费检索、获途径取方法

    点击上方“独孤九剑 笑傲中学物理题海 ”可以关注 ​ 之前有老师、同学问小鬆君,公众号内「文献资料」是怎么获取的,今天就讲讲这件事。 免费学习资源合辑|假期没事做不如学习 说明一下,小鬆君大学期间,做过校图书馆馆员,对书籍、图书馆、信息检索等很有兴趣。初二办了一张…...

    2024/4/29 14:24:51
  14. mac idea注册码invalid&重装打不开

    网上下载了idea破解的jar,输入注册码后提醒注册码invalid,卸载了重装后发现idea打不开了,最后发现两个问题都是同一个问题,idea没卸载干净导致有多个idea.vmoptions执行:sudo find / -name idea.vmoptions搜索下有没有多个idea.vmoptions,有多个就把没用的那个删了,如果…...

    2024/4/29 14:24:45
  15. Linux 系统不记录信息日志 解决service syslog restart 错误

    前些天服务器被不断尝试暴力破解,禁止了root远程登录以及修改登录端口,然后删除了所有的/var/log/secure* 日志文件。 今天再来查看日志的时候,发现/var/log/secure竟然没有记录,上网看了之后才知道才直接删除日志文件的时候,对应的服务需要重启。 运行命令:service sshd…...

    2024/5/2 7:29:45
  16. Apache搭建与相关配置优化(内含访问控制,日志分割,分析,web虚拟主机)

    文章目录前言一:Apache配置详解1.1:Apache连接保持1.1.1:为什么要保持连接1.1.2:保持连接的方式1.2:Apache访问控制1.2.1:Apache访问控制概述1.2.2:基于客户端地址的访问控制1.2.3:用户授权限制–创建用户认证数据库1.2.4:用户授权限制–添加用户授权配置二:Apache日…...

    2024/5/1 3:09:03
  17. 2020年国内外值得关注的15家PaaS平台与SaaS厂商!

    随着云计算技术的发展,IaaS、PaaS和SaaS越来越受到众多企业和开发者的青睐,平台供应商也如雨后春笋般出现…传统IT企业、通信运营商、互联网型企业、工业方案提供商、新型创业公司等多股势力纷纷涌入赛道,在经过井喷期的热闹,各平台沉淀进入下半场盘整。 那么何为PaaS和Saa…...

    2024/4/29 2:07:29
  18. LNMP(Nginx+MySQL+PHP)搭建Discuz论坛

    文章目录一、Nginx简介二、详细搭建步骤 一、Nginx简介Nginx是一款高性能、轻量级Web服务软件,特点如下: 稳定性高 系统资源消耗低 对HTTP并发连接的处理能力高(单台物理服务器可支持30000-50000个并发请求)二、详细搭建步骤实验环境:VMware Workstation 15.5、Centos 7.6…...

    2024/4/29 14:24:41
  19. java医院his系统源码+安装教程

    java医院his系统源码+安装教程 运行环境:jdk8+mysql+IntelliJ IDEA+maven 技术:springboot+shiro+layui+jquery+thymeleaf 该项目是用springboot+layui+shiro写的医院管理系统,该系统的业务比较复杂, 数据库一共有36张表。项目的视频+业务参考文档,都在百度云盘中。可以先…...

    2024/4/29 14:24:38
  20. java + selenium无头浏览器使用及网站破解、逆向步骤

    网站破解方法(三种) 说实在的,其实就是一种方法嘛第一种:找到登录触发或者加密入口,直接在console控制台,直接执行这个函数把响应的参数传进去。 第二种:同上找出对应签名加密的方法,把对应的JS抽取出来,封装一个入口函数。 第三种:直接把混淆的JS全部按照自己的java…...

    2024/4/29 14:24:34

最新文章

  1. 21世纪世界十大名人颜廷利:真正的幸福是快乐, 真正的理想是远航

    真正的财富是分享, 真正的情感是珍藏; 真正的人生是奋斗, 真正的自由是飞翔; 真正的幸福是快乐, 真正的理想是远航… &#xff08;升命学说&#xff09; 21世纪东方哲学家思想家、科学家、当代中国教育界知名教授、专业周易起名改名字、易经姓名学专家、目前比较有影响力的人…...

    2024/5/4 13:19:21
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 加盟正宗馅饼加盟费是多少,利润怎么样?

    麦多和(原麦多馅饼)&#xff0c;以其独特的口感和精致的制作工艺&#xff0c;赢得了广大消费者的喜爱。作为正宗麦多馅饼的原创品牌&#xff0c;它不仅提供了高品质的产品和优质的服务&#xff0c;还为加盟商提供了全程的帮扶与支持。加盟麦多馅饼&#xff0c;您将获得一个具有…...

    2024/4/13 22:18:02
  4. 蓝桥杯第十五届抱佛脚(十)贪心算法

    蓝桥杯第十五届抱佛脚&#xff08;十&#xff09;贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法&#xff0c;它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是最好或最优的算法。 贪…...

    2024/5/2 2:39:45
  5. linuxday05

    1、makedile原理&#xff08;增量编译生成代码&#xff09; # &#xff08;注释符&#xff09; 目标------依赖 目标不存在//目标比依赖旧才会执行命令&#xff1b; makefile的实现 1、命名要求&#xff08;Makefile/makefile&#xff09; 2、规则的集合 目标文件&#…...

    2024/5/4 6:30:26
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/4 12:05:22
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/4 11:23:32
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/3 16:00:51
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/4 12:10:13
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/3 21:22:01
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/3 23:17:01
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/3 13:26:06
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/4 2:14:16
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/3 16:23:03
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/4 12:39:12
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/4 13:16:06
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/3 14:57:24
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/4 2:00:16
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/3 22:03:11
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/4 9:07:39
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57