小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件


 

小甲鱼视频讲解:
https://www.bilibili.com/video/av6889190?p=6
https://www.bilibili.com/video/av6889190?p=7

从一个简单的实例来了解PE文件:https://www.freebuf.com/articles/system/86596.html
https://blog.csdn.net/billvsme/article/details/38340937

RegisterMe 下载地址:https://pan.baidu.com/s/11rtj1oVEX4wnXDw8D9PJqw    提取码:l209 

 

 

打开这个RegisterMe.exe程序,会出现如下烦人的消息框:

 

 

 

1. 引入

 

目标:去掉烦人的消息框
工具:Ollydbg

 

1. 载入程序,由图可以看出调用了两个MessageBox,当程序执行到这里的时候分别会有上述消息框弹出。 

2. 观察 cmp eax, 0×0

这里判断 eax 是否等于0

je(如果相等就跳转 – ZF=1  

由于 eax 等于 40000

所以这一个跳转永远不会成立,所以一定会执行这个烦人的MessageBox。

那么我们就可以想办法使它跳转。

 

3. 我们尝试改变ZF标记值(je跳转根据ZF标记判断)

如图,此时 ZF 标记为 0,我们 双击 这个0,使其标记为 1

再观察:

跳转实现了,我们成功跳过了消息窗口!!

不过这样每次要改变ZF标记很麻烦,我们可不可以让它直接跳转不进行判断呢?所以我们可以双击编辑je short 00401024为jmp short 00401024

成功跳过了MessageBox!!

我们想使用一种更加完美的方法来跳过这个消息框。。。。

假如我们把程序入口设置成00401024不就直接跳过了MessageBox了吗?在这之前,我需要解释一些PE的知识(请耐心地阅读,这才是本文所要讲的重点,而不是如何破解这个程序!!) 

下面标有红色的代表重点,如果你时间紧迫,可以只看有下划线的文字

 

 

 

深入的必经之路:

 

PE(Portable Executable)文件简介

PE(Portable Executable)文件是Windows操作系统下使用的可执行文件格式。它是微软在UNIX平台的COFF(通用对象文件格式)基础上制作而成。最初设计用来提高程序在不同操作系统上的移植性,但实际上这种文件格式仅用在Windows系列操作系统下。

PE文件是指32位可执行文件,也称为PE32。64位的可执行文件称为PE+或PE32+,是PE(PE32)的一种扩展形式(请注意不是PE64)。

PE文件结构一般如上图所示。

当一个PE文件被执行时,PE装载器首先检查DOS header里的PE header的偏移量。如果找到,则直接跳转到PE header的位置。

当PE装载器跳转到PE header后,第二步要做的就是检查PE header是否有效。如果该PE header有效,就跳转到PE header的尾部。

紧跟PE header尾部的是节表。PE装载器执行完第二步后开始读取节表中的节段信息,并采用文件映射(在执行一个PE文件的时候,Windows并不在一开始就将整个文件读入内存,而是采用与内存映射的机制,也就是说,Windows装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或者访问某一页中的数据时,这个页面才会被从磁盘提交到物理内存,这种机制使文件装入的速度和文件大小没有太大的关系)的方法将这些节段映射到内存,同时附上节表里指定节段的读写属性。

PE文件映射入内存后,PE装载器将继续处理PE文件中类似 import table (输入表)的逻辑部分

这四个步骤便是PE文件的执行顺序,具体细节读者可以参考相关文档。

(以上四个步骤摘自《黑客破解精通》) 

下面用我们要破解程序进行简单说明:

首先用 WinHex 打开破解程序。上图是程序的起始部分,也是PE文件的头部分。文件运行需要的所有信息就储存在这个PE头文件中。所以,学习PE文件格式就是学习PE头中的结构体。

也可以使用 UltraEdit 、010edit 打开( 推荐使用 010edit 打开,这是一个专门查看 16进制的工具,最好用的16进制查看工具,没有之一   )

使用 010edit 打开文件:

 

事情根本没有这么简单:

上图描述了文件加载到内存的情形,包含了许多内容,我们逐一学习。

文件中使用偏移(offset),内存中使用VA(Virtual Address,虚拟地址)来表示位置。

VA指进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)是指从某基准位置(ImageBase)开始的相对地址。VA与RVA满足下面的换算关系:

RVA + ImageBase = VA

PE头内部信息大多是RVA形式存在。原因在于(主要是DLL)加载到进程虚拟内存的特定位置时,该位置可能已经加载了其他的PE文件(DLL)。此时必须通过重定向(Relocation)将其加载到其他空白的位置,若PE头信息使用的是VA,则无法正常访问。因此使用RVA来重定向信息,即使发生了重定向,只要相对于基准位置的相对位置没有变化,就能正常访问到指定信息,不会出现任何问题。

当PE文件被执行时,PE装载器会为进程分配4CG的虚拟地址空间,然后把程序所占用的磁盘空间作为虚拟内存映射到这个4GB的虚拟地址空间中。一般情况下,会映射到虚拟地址空间中的0X400000的位置。

 

 

PE头

 

DOS头

typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部USHORT e_magic; // DOS签名“MZ-->Mark Zbikowski(设计了DOS的工程师)”USHORT e_cblp; // 文件最后页的字节数USHORT e_cp; // 文件页数USHORT e_crlc; // 重定义元素个数USHORT e_cparhdr; // 头部尺寸,以段落为单位USHORT e_minalloc; // 所需的最小附加段USHORT e_maxalloc; // 所需的最大附加段USHORT e_ss; // 初始的SS值(相对偏移量)USHORT e_sp; // 初始的SP值USHORT e_csum; // 校验和USHORT e_ip; // 初始的IP值USHORT e_cs; // 初始的CS值(相对偏移量)USHORT e_lfarlc; // 重分配表文件地址USHORT e_ovno; // 覆盖号USHORT e_res[4]; // 保留字USHORT e_oemid; // OEM标识符(相对e_oeminfo)USHORT e_oeminfo; // OEM信息USHORT e_res2[10]; // 保留字LONG e_lfanew; // 指示NT头的偏移(根据不同文件拥有可变值)
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

其中比较重要的有e_magic和e_lfanew,由图可知

e_magic的值为4D5A,e_lfanew的值为000000C0(注意不是C0000000,详见我的上一篇文章)

WORD占2个字节,LONG占4个字节,刚好是30个WORD和1个LONG,从00000000到0000003F 

 

DOS存根:

 

即使没有DOS存根,文件也能正常执行

 

 

NT头(PE最重要的头)

其定义如下:

typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; 
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;  Signature:类似于DOS头中的e_magic,其高16位是0,低16是0x4550,用字符表示是'PE‘(00004550)。
IMAGE_FILE_HEADER:IMAGE_FILE_HEADER是PE文件头,定义如下:typedef struct _IMAGE_FILE_HEADER { WORD    Machine; WORD    NumberOfSections; DWORD   TimeDateStamp; DWORD   PointerToSymbolTable; DWORD   NumberOfSymbols; WORD    SizeOfOptionalHeader; WORD    Characteristics; 
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

其中有4个重要的成员(若设置不正确,将会导致文件无法正常运行)

#1.Machine

每个CPU拥有唯一的Machine码,兼容32位Intel X86芯片的Machine码为14C(如图)。以下是定义在winnt.h文件中的Machine码:

#define IMAGE_FILE_MACHINE_UNKNOWN           0 
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386. 
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian 
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian 
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian 
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2 
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP 
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian 
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3 
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian 
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian 
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5 
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian 
#define IMAGE_FILE_MACHINE_THUMB             0x01c2 
#define IMAGE_FILE_MACHINE_AM33              0x01d3 
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian 
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1 
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64 
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS 
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64 
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS 
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS 
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64 
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon 
#define IMAGE_FILE_MACHINE_CEF               0x0CEF 
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code 
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8) 
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE

#2.NumberOfEsctions

PE文件把代码,数据,资源等依据属性分类到各节中储存。

NumberOfEsctions指文件中存在的节段(又称节区)数量,也就是节表中的项数。该值一定要大于0,且当定义的节段数与实际不符时,将发生运行错误。

#3.SizeOfOptionalHeader

IMAGE_NT_HEADERS结构最后一个成员IMAGE_OPTIONAL_HEADER32。

SizeOfOptionalHeader用来指出IMAGE_OPTIONAL_HEADER32结构体的长度。PE装载器需要查看SizeOfOptionalHeader的值,从而识别IMAGE_OPTIONAL_HEADER32结构体的大小。

PE32+格式文件中使用的是IMAGE_OPTIONAL_HEADER64结构体,这两个结构体尺寸是不相同的,所以需要在SizeOfOptionalHeader中指明大小。

#4.Characteristics

该段用于标识文件的属性,文件是否是可运行的状态,是否为DLL文件等信息。

#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file. 
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references). 
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file. 
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file. 
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set 
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses 
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed. 
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine. 
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file 
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file. 
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file. 
#define IMAGE_FILE_SYSTEM                    0x1000  // System File. 
#define IMAGE_FILE_DLL                       0x2000  // File is a DLL. 
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine 
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.

为方便理解,上述程序的NT头内容如下:

(成员功能概述)

NumberOfSections:该PE文件中有多少个节段,也就是节表中的项数。
TimeDateStamp:PE文件的创建时间,一般有连接器填写。
PointerToSymbolTable:COFF文件符号表在文件中的偏移。
NumberOfSymbols:符号表的数量。
SizeOfOptionalHeader:紧随其后的可选头的大小。
Characteristics:可执行文件的属性。

IMAGE_OPTIONAL_HEADER32:

其定义如下: 

typedef struct _IMAGE_OPTIONAL_HEADER { WORD    Magic; BYTE    MajorLinkerVersion; BYTE    MinorLinkerVersion; DWORD   SizeOfCode; DWORD   SizeOfInitializedData; DWORD   SizeOfUninitializedData; DWORD   AddressOfEntryPoint; DWORD   BaseOfCode; DWORD   BaseOfData; DWORD   ImageBase; DWORD   SectionAlignment; DWORD   FileAlignment; WORD    MajorOperatingSystemVersion; WORD    MinorOperatingSystemVersion; WORD    MajorImageVersion; WORD    MinorImageVersion; WORD    MajorSubsystemVersion; WORD    MinorSubsystemVersion; DWORD   Win32VersionValue; DWORD   SizeOfImage; DWORD   SizeOfHeaders; DWORD   CheckSum; WORD    Subsystem; WORD    DllCharacteristics; DWORD   SizeOfStackReserve; DWORD   SizeOfStackCommit; DWORD   SizeOfHeapReserve; DWORD   SizeOfHeapCommit; DWORD   LoaderFlags; DWORD   NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

我们需要关注下列成员,这些事运行程序必需的,设置错误将导致程序无法正常运行。

#1.Magic

为IMAGE_OPTIONAL_HEADER32时,magic码为10B,为IMAGE_OPTIONAL_HEADER64时,magic码为20B

#2.AddressOfEntryPoint

AddressOfEntryPoint持有EP的RVA值。该值指出程序最先执行的代码起始地址,相当重要。

#3.ImageBase

一般来说,使用开发工具(VB/VC++/Delphi)创建好EXE文件后,其ImageBase值为00400000,DLL文件的ImageBase值为10000000(当然也可以指定其他值)。

执行PE文件时,PE装载器先创建进程,再将文件载入内存,然后把EIP寄存器的值设置为ImageBase+AddressOfEntryPoint

#4.SectionAlignment,FileAlignment

PE文件的Body部分被划分成若干节段,这些节段储存着不同类别的数据。FileAlignment指定了节段在磁盘文件中的最小单位,而SectionAlignment则指定了节区在内存中的最小单位(SectionAlignment必须大于或者等于FileAlignment)

#5.SizeOfImage

当PE文件加载到内存时,SizeOfImage指定了PE Image在虚拟内存中所占用的空间大小,一般文件大小与加载到内存中的大小是不同的(节段头中定义了各节装载的位置与占有内存的大小,后面会讲到)

#6.SizeOfHeader

SizeOfHeader用来指出整个PE头大小。该值必须是FileAlignment的整数倍。第一节段所在位置与SizeOfHeader距文件开始偏移的量相同。

#7.Subsystem

Subsystem值用来区分系统驱动文件(*.sys)与普通可执行文件(*.exe,*.dll)。

Subsystem成员可拥有值如下:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.  
#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.   系统驱动
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.  窗口应用程序
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.  控制台应用程序
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.  
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image runs in the Posix character subsystem.  
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.  
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.  
#define IMAGE_SUBSYSTEM_EFI_APPLICATION      10  //  
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  11   //  
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER   12  //  
#define IMAGE_SUBSYSTEM_EFI_ROM              13  
#define IMAGE_SUBSYSTEM_XBOX                 14  
#define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16

#8.DataDirectory

数据目录,定义如下:

·  typedef struct _IMAGE_DATA_DIRECTORY {  
·      DWORD   VirtualAddress;  
·      DWORD   Size;  
·  } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

可以看出,有地址(VirtualAddress)有大小(Size),数组定义的一定是一个区域,数组每项都有被定义的值,不同项对应不同数据结构,比如导入表,导出表等,定义如下:

#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 
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage) 
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data 
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of 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 
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors 
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor

各位重点关注标红的IMPORT和EXPORT,它们是PE头中的非常重要的部分,其它部分不怎么重要,大致了解下即可。 

#9.NumberOfRvaAndSizes

NumberOfRvaAndSizes用来指定DataDirectory的数组个数,虽然结构体定义中明确指出了数组个数为16,但也有可能不是16,PE装载器需要通过这个值来识别。

各成员代表的值和偏移量就不一一写出了,累死咯。。。 

(成员功能概述)

Magic:表示可选头的类型。
MajorLinkerVersion和MinorLinkerVersion:链接器的版本号。
SizeOfCode:代码段的长度,如果有多个代码段,则是代码段长度的总和。
SizeOfInitializedData:初始化的数据长度。
SizeOfUninitializedData:未初始化的数据长度。
AddressOfEntryPoint:程序入口的RVA,对于exe这个地址可以理解为WinMain的RVA。对于DLL,这个地址可以理解为DllMain的RVA,如果是驱动程序,可以理解为DriverEntry的RVA。当然,实际上入口点并非是WinMain,DllMain和DriverEntry,在这些函数之前还有一系列初始化要完成,当然,这些不是本文的重点。
BaseOfCode:代码段起始地址的RVA。
BaseOfData:数据段起始地址的RVA。
ImageBase:映象(加载到内存中的PE文件)的基地址,这个基地址是建议,对于DLL来说,如果无法加载到这个地址,系统会自动为其选择地址。
SectionAlignment:节对齐,PE中的节被加载到内存时会按照这个域指定的值来对齐,比如这个值是0x1000,那么每个节的起始地址的低12位都为0。
FileAlignment:节在文件中按此值对齐,SectionAlignment必须大于或等于FileAlignment。
MajorOperatingSystemVersion、MinorOperatingSystemVersion:所需操作系统的版本号,随着操作系统版本越来越多,这个好像不是那么重要了。
MajorImageVersion、MinorImageVersion:映象的版本号,这个是开发者自己指定的,由连接器填写。
MajorSubsystemVersion、MinorSubsystemVersion:所需子系统版本号。
Win32VersionValue:保留,必须为0。
SizeOfImage:映象的大小,PE文件加载到内存中空间是连续的,这个值指定占用虚拟空间的大小。
SizeOfHeaders:所有文件头(包括节表)的大小,这个值是以FileAlignment对齐的。
CheckSum:映象文件的校验和。
Subsystem:运行该PE文件所需的子系统。

DllCharacteristics:DLL的文件属性,只对DLL文件有效,可以是下面定义中某些的组合:

SizeOfStackReserve:运行时为每个线程栈保留内存的大小。
SizeOfStackCommit:运行时每个线程栈初始占用内存大小。
SizeOfHeapReserve:运行时为进程堆保留内存大小。
SizeOfHeapCommit:运行时进程堆初始占用内存大小。
LoaderFlags:保留,必须为0。
NumberOfRvaAndSizes:数据目录的项数,即下面这个数组的项数。
DataDirectory:数据目录,这是一个数组。

 

节段(区)头:

PE文件有不同的节段:code(代码),data(数据),resource(资源),这样设计避免了很多安全问题,比如向data写数据,由于某原因导致溢出,其下的code就会被覆盖,程序就会崩溃。

code/data/resource都有不同的权限,如下:

节段头是由IMAGE_SECTION_HEADER结构体组成的数组,每个结构体对应一个节段。

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;

下表列出了需要了解的重要成员:

VirtualAddress与PointerToRawData不带有任何值,分别由(定义在IMAGE_OPTIONAL_HEADER32中的)SectionAlignment和FileAlignment确定。

上述程序有4个节段。

 

 

 

如何运用我们上面学习到的PE知识?

 

了解了PE知识,继续我们的破解工作!!

我们在 数据窗口(dump)右键 —>  转到( 或者直接快捷键 Ctrl +G)跳转到起始位置(400000)。

注意是在数据窗口 !!!!!

跳转到 400000H 位置 ( PE 文件的 基址 位置 )

 

点击右上方 l(小写L)、e、m、t、w 的 m 查看内存情况。

 

双击该处进入,看到 DOS HEADER 已经载入了,直接向下翻,查找DOS头的 e_lfanew 成员:

查看到偏移量是000000C0,记住我们载入内存时,基准位置(ImageBase)是400000,相对虚拟地址(RVA)是:

VA(虚拟地址) = ImageBase(PE基址) + RVA(相对虚拟地址)

所以此时PE头位置是 004000C0 ( 00400000 + 000000C0 ),我们向下翻到该处(或者 Ctrl + G,输入 004000C0)。

找最重要的的 AddressOfEntryPoint ( 程序入口字段 )。

找到 AddressOfEntryPoint=0×1000,我么需要让它跳转到 401024,为啥是 0040 1024 这个地址,通过 Ollydbg 调试,这个地址就是注册地址,注册完之后,跳出注册成功窗口。

修改 AddressOfEntryPoint 的值,双击 004000E8(00 10 00 00 –>00001000)的值进行修改,修改为24 10 00 00 (00001024):

然后 右键 -> 保存到可执行文件 ( 在数据区域,右键 ->  ):

保存完成后,用OD载入刚保存的RegisterMe1.0,发现入口已经变成了我们修改的00401024,成果跳过了第一个烦人的消息框!

我们再向下执行:

执行到call Register.00401052时弹出了“我们需要注册的信息”

我们再向下执行:

再第二个MessageBox处又弹出了消息框,我们这次采用NOP(No operation)填充:

填充完成后,我们保存为可执行文件RegisterMe2.0。双击执行,再也没有可恶地消息框咯!

 

 

 

方法 2:

使用 jmp 直接跳转:

 

方法 3:

使用 nop指令( 空白指令,什么都不做 ) 填充并覆盖 注册 部分的汇编代码:

填充后效果:

 

方法4:

 

小结:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495638.shtml

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

相关文章

一键解决 go get golang.org/x 包失败

From:https://segmentfault.com/a/1190000018264719 问题描述 在 ubuntu 上用 sudo apt install golang-go 安装 go 的 sdk,之后使用 go get、go install、go mod 等命令时 (会自动下载相应的包或依赖包) 时,但由于众所周知的原因(墙)&#x…

「对抗深度强化学习」是如何解决自动驾驶汽车系统中的「安全性」问题的?...

原文来源:arXiv作者:Aidin Ferdowsi、 Ursula Challita、Walid Saad、Narayan B. Mandayam「雷克世界」编译:嗯~是阿童木呀、KABUDA对于自动驾驶汽车(AV)而言,要想在未来的智能交通系统中以真正自主的方式运…

小甲鱼 OllyDbg 教程系列 (五) : 破解 PC Surgeon 之 查找字符串

https://www.bilibili.com/video/av6889190/?p11 https://www.bilibili.com/video/av6889190/?p12 程序下载地址:https://pan.baidu.com/s/1eVTLQ_AatLrmrz3FLwM5ww 提取码:wny9 修复 OllyDBG 右键 -> 复制到可执行文件 -> 所有修改 中 所…

深度概览卷积神经网络全景图,没有比这更全的了

来源: 人工智能头条 翻译 | 林椿眄摘要:深度卷积神经网络是这一波 AI 浪潮背后的大功臣。虽然很多人可能都已经听说过这个名词,但是对于这个领域的相关从业者或者科研学者来说,浅显的了解并不足够。通过这篇文章,我们…

小甲鱼 OllyDbg 教程系列 (四) : 逆向 VisualSite Designer 之 硬件断点

去掉程序开始之前的界面:https://www.bilibili.com/video/av6889190?p9 去掉关闭程序后的广告:https://www.bilibili.com/video/av6889190?p10 VisualSite Designer.exe 下载地址:https://pan.baidu.com/s/1i-fi1wW-m0Cp72yyB_SBFw 提取码…

复杂人机智能系统功能分配方法综述

本文来源:人机与认知实验室摘要:功能分配是复杂人机智能系统设计进程中的重要内容, 它需要应用系统的分析方法, 合理地进行人、机两者的任务分配和科学地设计两者的功能结合。本文分析了国内外功能分配的研究现状和存在的问题。针对复杂人机智能系统的设计需求, 指出…

生物学将是下一代计算平台:DNA是代码,CRISPR是编程语言

来源:36氪每一个行业都在向Crispr投入大量的资金——制药、农业、能源、材料制造。甚至连那些大麻贩子都想砸钱进去。机器里面,运行的并不是由0和1组成的互联网编码,而是能重写生命密码的分子。日前,《连线》杂志发表了一篇文章&a…

Python 中使用 jsonpath

JSONPath 解析 JSON 内容详解(翻译自 github):https://blog.csdn.net/freeking101/article/details/103048514 JSONPath Online Evaluator:http://jsonpath.com Python 处理 JSON 我选择 ujson 和 orjson:https://bl…

【重磅】吴恩达宣布 Drive.ai 自动驾驶汽车服务落地 理想就这样成了现实!

来源: 网易智能美国当地时间5月7日,硅谷无人车创业公司 Drive.ai 宣布将于2018年7月在德克萨斯州弗里斯科市提供自动驾驶汽车服务。这或许会成为美国第一个真正落地的自动驾驶汽车载人服务,也标志着公众第一次有机会在公共道路上使用按需定制…

小甲鱼 OllyDbg 教程系列 (八) :fjproducer 逆向 之 困境

小甲鱼 OllyDBG 教程:https://www.bilibili.com/video/av30969642?p15 程序下载地址: https://pan.baidu.com/s/1xTBrvuAx6hsyHQ2RsYiCoA 提取码: 11sd 打开程序显示如下: 可以看到标题栏的 Flash Jigsaw Produce (unregistered),可以根…

在sharepoint中添加视频播放

年初的时候想把公司举办的春晚发布在sharepoint中供大家观看,但是视频文件太大了,放到文档库中存储到数据库中是一个不切实际的办法,后来就搁置了。 其实也一直在想优酷等视频网站的发布方式,但没能得到解答。最近无意中发现了网页…

打破国外垄断,我国拿下一项“制芯”关键技术

来源:科技日报“PM2.5,是大家很熟悉的微小颗粒物,直径小于或等于2.5微米。但我们研制这种制造芯片的关键材料,在过程中如果进入了哪怕PM1.0的粉尘,这个材料就是废品,就不能被应用到芯片当中。”唐一林唐一林…

西电焦李成教授解读《高等学校人工智能创新行动计划》

来源:砍柴网不久之前,教育部公布了《高等学校人工智能创新行动计划》(以下简称计划),计划在人工智能人才培养、产学研等方面有哪些亮点?人工智能领域学科建设前景如何?针对公众关注的问题&#…

Git 和 Github 秘籍

GitHub秘籍 Git 和 Github 秘籍,灵感来自于 Zach Holman 在 2012 年 Aloha Ruby Conference 和 2013 年 WDCNZ 上所做的演讲:Git and GitHub Secrets(slides) 和 More Git and GitHub Secrets(slides)。 其他语言版本: English, 한국어, 日本語, 简体中…

为什么人类大脑与众不同?这种模式动物或揭开大脑体积演化之谜

来源 | HOWARD HUGHES MEDICAL INSTITUTE翻译 | 周盈宵审校 | 常玮导语:通过使一个与人类小头畸形相关的基因失活,研究人员得到第一只神经系统变异的雪貂。霍华德休斯医学研究所(HHMI)的研究者Christopher Walsh说,尽管…

小甲鱼 OllyDbg 教程系列 (七) :VB 程序逆向分析

小甲鱼视频:https://www.bilibili.com/video/av6889190?p14 VB程序逆向反汇编常见的函数:https://www.cnblogs.com/bbdxf/p/3780187.html 程序下载地址:链接:https://pan.baidu.com/s/18igiL-YWn9wnIrJfKT8gBA 提取码&…

一文尽揽2018 Google I/O:谷歌让你感受到AI科技的魅力

来源:智者无疆摘要:今年的主角依然是AI人工智能,它已经融入谷歌产品与软件系统中,但这次,谷歌在讲解AI或产品功能时候从理解人类和人性的角度举例,把AI带到了科技与人文的十字路口上。5月9日凌晨消息&#…

小甲鱼 OllyDbg 教程系列 (六) :PJ 软件功能限制(不修改jnz的非爆破方法)

小甲鱼视频地址:https://www.bilibili.com/video/av6889190?p13 小甲鱼OD学习第9讲:https://www.bbsmax.com/A/x9J23xEM56/ 程序下载地址:https://pan.baidu.com/s/1JTQ32xIBV6XiPtuXsOIgiw 提取码: r5t4 这次我们的任务是 pj 去掉注册软…

HTTP 和 HTTPS 协议

HTTP协议是什么? 简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。 HTTP协议能做什么? 很多人首先一定会想到:浏览网页。没错,浏…

卡耐基梅隆大学提出新型「自适应」技术,可提高「个性化神经机器翻译」质量...

原文来源:arXiv作者:Paul Michel、Graham Neubig「雷克世界」编译:嗯~是阿童木呀导语:现如今,随着人工智能的发展,机器翻译在一定程度上取得了很大的进展,但是大家都知道,语言的产生…