结合romimage来分析WINCE下的PE文件特点

ROMIMAGE工具解析(ARM平台) 一.wince6 OS 编译大体过程build (public code)->sysgen->build (BSP)->buildrel->makeimg, 其中makeimg 命令调用romimage.exe (运行该命令romimage.exe ce.bib )产生最终的nk.bin 。其中ce.bib 是merge 了系统中所有bib 文件( 当然包括config.bib 和platform.bib) 。 二.ce.bib 中的内容包含四大部分 1. MEMORY section划分内存块 格式:Na 阅读详情

一直以来都想深入学习PE结构,以达到能灵活运用的程度。最近因为在了解BINFS的细节,所以利用这个机会来研究,在学习的过程中通过针对具体一个文件coredll.dll并结合romimage的日志进行分析可以说达到了预期目标。
WINCE下PE结构和WINDOWS下的差不多,不同的只是加载有点不一样:在WINCE上EXE/DLL的PE头没有映射到内存,而是OS在加载阶段把导入/导出表读出来放到一个单独的结构中(关于此结构在后面会有介绍),跟WINDOWS上的处理不一样。
PE结构的文件由四部分组成:
一、DOS头部分
1、DOS MZ header:以MZ做为开始标志,大小一般为0x40
2、DOS stub:"program must be run under Microsoft Windows"信息,大小是0x30
二、加密数据,会有一个"Rich"的字符串。大小是0x60
三、PE头部分
1、Signature:PE头的标识。双字结构。为50h, 45h, 00h, 00h. 即“PE”。
2、FileHeader:20字节的数据。包含了文件的物理层信息及文件属性。
(1)NumberOfSections:定义PE文件Section的个数
(2)SizeOfOptionalHeader:定义OptionHeader(稍后具体描述)结构的大小
(3)Characteristics:一此标识位,主要用来标识当前的PE文件是执行文件还是DLL
3、OptionHeader:总共224个字节。最后128个字节为数据目录(Data Directory)
(1)AddressOfEntryPoint:程序入口点地址。但加载器要运行加载的PE文件时要执行的第一个指令的地址。它是一个RVA(相对虚拟地址)地址。一些对PE文件插入代码的程序就是修改此处的地址为要运行的代码,然后再跳转回此处原来的地址。
(2)ImageBase:PE文件被加载到内存的期望的基地址。对于EXE文件,通常加载后的地址就期望的地址。但是DLL却可能是其他的。因为如果这个地址被占,系统就会重新分配一块新的内存,同时会修改此处加载后的地址。EXE文件通常是400000h.
(3)SectionAlignment:每一个Section的内存对齐粒度。比如:此值为4096(1000h),那么每一个Section的起始地址都应该是4096(1000h)的整数倍。如果第一个Section的地址是401000h,大小为100个字节。那么下一个Section的起始地址为402000h.。两个Section之间的空间大部分是空的,未用的。
(4)FileAlignment:每一个Section的磁盘对齐粒度。比如,此值为512(200h),那么每一个Section在文件内的偏移位置都是512(200h)的整数倍。与SectionAlignment同理。
(5)SizeOfImage:PE文件在内存空间整个映像的大小。包含所有的头及按SectinAlignment对齐的所有的Section。
(6)SizeOfHeaders:所有的头加上Section表的大小。也就是文件大小减去文件中所有Section的大小。可以用这个值获取PE文件中第一Section的位置。
(7)DataDiretory:16个IMAGE_DATA_DIRECTORY结构的数组。每一个成员都对应一个重要的数据结构,比如输入表,输出表等。数据结构及宏定义如下:
数据结构如下
typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress; //数据项的RVA
    DWORD   Size;  //数据项的大小
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
//索引定义如下
#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_SECU,RITY        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   // (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
如果无此项,则IMAGE_DATA_DIRECTORY中的成员变量值为0
四、Section表,WINCE一般有.text、.data、.pdata、.rsrc、.reloc五个Section
由IMAGE_SECTION_HEADER数据结构组成的数组。每一个包含了对应Section在PE文件中的属性和偏移位置等信息。

针对具体的文件coredll.dll,它的大小为560640,romimage的日志信息如下:
MODULES Section
Module                 Section  Start     Length  psize   vsize   Filler
---------------------- -------- --------- ------- ------- ------- ------
。。。。。。
coredll.dll            .text    803ce000  495616  492544  492405 o32_rva=00001000
coredll.dll            .rsrc    80447000   28672   28160   28012 o32_rva=00082000
。。。。。。
coredll.dll            .data    8049a95c    1416    1416    4740 FILLER
coredll.dll            .pdata   804bb000    9361    9361   20568
。。。。。。
coredll.dll            E32      803caf30     112                 FILLER
coredll.dll            O32      803cafa0      96                 FILLER
。。。。。。
coredll.dll            FileName 8044dfec       12                 FILLER
。。。。。。
psize:是Section的长度(按PE头中FileAlignment对齐,可能存在padding数据),如果是压缩的数据则是压缩后的长度
vsize:是Section能正常工作需要的长度(去掉了padding数据),如果是压缩的数据则是解压后需要的长度
Length:psize和vsize中的最小数,对于压缩的Section一般是psize,但是对于非压缩的Section则是vsize按0x1000的页面对齐
从.text和.rsrc信息可以看出是没有压缩的,.pdata的数据进行了压缩,.data的数据也进行了压缩,和.pdata不同的是,压缩前实际大小为3224(不包括padding),压缩后为1416,visze刚好为两者之和,是不是指.data的压缩数据在内存中要保存一份拷贝?
而对coredll.dll根据PE的结构定义进行的分析,可以得出如下信息
1、DOS MZ header: 0x00 - 0x3F
DOS stub: 0x40 - 0x7F
2、加密数据: 0x80 - 0xDF
3、PE header: 0xE0 - 0x1D7
其中 Signature : 0xE0 - 0xE3
     FileHeader: 0xE4 - 0xF7
     OptionHeader: 0xF8 - 0x1D7
4、Sections: 0x1D8 - 0x29F    //共5个Sections,5*sizeof(section)=200
padding: 0x2A0 - 0x3FF     //应该是为更多的section预留,共352字节理论上可以加8个section
//到此处共0x400字节是PE文件的相关信息,下面开始则是具体的section数据了
//section的起始和终止位置根据section信息中的PointerToRawData和SizeOfRawData得出
//而模块名及导入/导出函数名位于.text内,用ImageRvaToVa获得其地址。
.text: 0x400 - 0x787FF,大小为0x78400
.data: 0x78800 - 0x795FF,大小为0xE00
.pdata: 0x79600 - 0x7E7FF,大小为0x5200
.rsrc: 0x7E800 - 0x855FF,大小为0x6E00
.reloc: 0x85600 - end,大小为0x3800
E32填充的数据结构定义如下,是将部分PE头的信息保存:
#define ROM_EXTRA 9
typedef struct e32_rom {
    unsigned short  e32_objcnt;     /* Number of memory objects            */
    unsigned short  e32_imageflags; /* Image flags                         */
    unsigned long   e32_entryrva;   /* Relative virt. addr. of entry point */
    unsigned long   e32_vbase;      /* Virtual base address of module      */
    unsigned short  e32_subsysmajor;/* The subsystem major version number  */
    unsigned short  e32_subsysminor;/* The subsystem minor version number  */
    unsigned long   e32_stackmax;   /* Maximum stack size                  */
    unsigned long   e32_vsize;      /* Virtual size of the entire image    */
    unsigned long   e32_sect14rva;  /* section 14 rva */
    unsigned long   e32_sect14size; /* section 14 size */
    unsigned long   e32_timestamp;  /* Time EXE/DLL was created/modified   */
    struct info     e32_unit[ROM_EXTRA]; /* Array of extra info units      */
    unsigned short  e32_subsys;     /* The subsystem type                  */
} e32_rom;
O32填充的数据结构定义如下,是将所有section的部分信息保存:
typedef struct o32_rom {
    unsigned long       o32_vsize;      /* Virtual memory size              */
    unsigned long       o32_rva;        /* Object relative virtual address  */
    unsigned long       o32_psize;      /* Physical file size of init. data */
    unsigned long       o32_dataptr;    /* Image pages offset               */
    unsigned long       o32_realaddr;   /* pointer to actual                */
    unsigned long       o32_flags;      /* Attribute flags for the object   */
} o32_rom;

 关于这个结构的使用,可能看loader.c中的代码,由此也可以看到对MODULES和非MODULES下的文件加载的时候处理是不一样的。

wince下IImage组件显示图片(wince) 上次发错了,对不住大家,下过的重新免分下载! IImage组件是在wince5.0新加入的,它可以调用公共接口来显示多种图片格式(jpg,png,gif,bmp),并且还可以扩展用以支持更多图片. 立即下载

相关推荐

wince启动过程及romimage如何生成image

绝对好文,对理解romimage, bootloader, oal, nk.exe, kernel.dll, 开发bootloader oal大有好处!!不限于简单的函数调用,对于romimage如何根据.bib加载和fix up各模块生成image,各个模块间如何协作启动,interlock api等有详细描述

PE中的import table/IAT 分析

本文将通过一个实例说明PE结构中的import table及import address table(IAT). 在data directory中有两项:IMAGE_DIRECTORY_ENTRY_IMPORT(1)和IMAGE_DIRECTORY_ENTRY_IAT(12),IMAGE_DIRECTORY_ENTRY_IMPORT指向了该PE文件中所有的输入信息,而IMAGE_DIRECTORY_ENTRY_IAT指向了该PE文件中的导入地址表。现在不必关心这两个表的关系,在之后的分析中将渐渐明朗。如果用

panda1987的专栏 1万+

block0.nb0 WinCE烧录ROM镜像的启动块

block0.nb0 WinCE烧录ROM镜像的启动块

(转)关于romimage

<br />1. romimage是什么?<br />romimage是wince编译过程中最后一步。在此之前,ce的编译系统已经调用自己的arm编译器,对每个模块完成了编译工作,并生成了.exe,.dll等文件;同时针对当前的环境设置,生成了.bib,.reg等文件。另外还有一些别的文件。最后编译系统将所有这些需要“打包”的文件,拷贝到_WINCEROOT/release目录下。而romimage的作用,就是根据ce.bib文件,来生成最后的nk.bin和nk.nb0。<br />2. romimage的

阿甘的嵌入式工作室——专注于嵌入式开发 1239

ROM image 合成工具

ROM image 合成工具

ABB机器人C#二次开发实战:从通信打通到数据读写的落地指南(附完整工程)

最近在做自动化产线升级项目时,遇到一个核心需求:用C#上位机实时读取ABB机器人的关节角度、IO信号,同时下发运动指令和参数配置。翻遍全网,要么是Robot Studio的基础操作教程,要么是C++/VC++的老旧案例,C#相关的实操内容要么只给片段代码,要么跳过通信配置、权限设置等关键步骤,导致刚上手时踩了无数坑——连接超时、数据读不到、写入无响应,甚至误触发机器人安全保护。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1394

PE文件结构详解(四)PE导入表

也许大家注意到过,在IMAGE_DATA_DIRECTORY中,有几项的名字都和导入表有关系,其中包括:IMAGE_DIRECTORY_ENTRY_IMPORT,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,IMAGE_DIRECTORY_ENTRY_IAT和IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT这几个导入都是用来干什么的,他们之间又是什么关系呢?听我慢慢道来。

evil.eagle的专栏 3万+

麦克斯韦电磁场理论

1)从知识先后上说:麦克斯韦方程组为理解光的传播、反射、折射等现象提供了理论基础。不理解基础,怎么能理解上层建筑。2)从如何学懂上说,把基础学习的越牢,越深刻,后续学习上层建筑就会水到渠成一些,不会越学越多疑问。而是越学越少疑问。

weixin_55255438的博客 2825

PE文件格式--------------导入表和IAT

pe文件导入表 1)提取导入表:在数据目录的中,索引为1的位置; 导入表起始RVA地址:IMAGE_NT_HEADER.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress 导入表大小:IMAGE_NT_HEADER.OptionalHeader.DataDirectory[IMAGE_DIRECT...

weixin_30692143的博客 408

Mac上VMware Fusion手动安装VMware Tools实现跨系统复制粘贴

本文详细指导了在Mac的VMware Fusion中手动安装VMware Tools的完整流程,以解决虚拟机与宿主机之间无法复制粘贴的常见问题。通过定位安装镜像、挂载、解压并运行安装脚本,最终实现跨系统无缝数据交换,提升工作效率。

orange的博客 699

软件测试面试题汇总

软件测试面试题汇总 测试技术面试题 ........................................................................................................................................................................ 5 1、什么是兼容

晴天的专栏 2万+

Image格式之BIN

转自:http://www.armce.cn/bbs/thread-21-1-2.html 引用需注明来源http://www.armce.cn今天探讨我们玩Wince的人一定见过的BIN文件,只要你在config.bib 里面设置了RAMIMAGE或是NANDIMAGE,你将会在romimage后得到对应名字的.bin文件。比如下面这段:    NK1      82500000  01

Carlward 的专栏 2969

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

Wince编译过程之扩展操作(2010-12-3)

The Make Binary Image tool (Makeimg.exe) calls a number of programs and batch files in the process of making the run-time p_w_picpath What you may not know is that makeimg checks for th...

weixin_33895695的博客 99

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

基于YOLOv5s的RK3588多线程部署16FPS暴涨到120FPS 轻量化深度学习部署实战教程(包括性能优化与加速)37

本文介绍了如何在RK3588平台上利用线程池优化YOLOv5模型的推理性能。RK3588内置3个NPU核心,支持多核并行处理。作者设计了一个线程池架构:1个线程负责数据读取,10个线程处理NPU运算,1个线程输出结果。该架构包含任务队列、线程管理和工作线程三个核心组件,通过合理设置线程数、任务队列大小等参数确保性能稳定。文章提供了详细的C++实现代码,包括线程池初始化、任务提交、结果获取等功能模块,并讨论了多线程同步和内存管理的关键技术要点。该方案可显著提升深度学习模型在嵌入式设备上的部署效率。

FJN110的博客 9230

winCE、WinPE、Win Embedded、Windows Mobile的区别

Windows PE Microsoft Windows Preinstallation Environment (Windows PE) 是具有有限服务的最小 Win32® 子系统,它基于在保护模式下运行的 Windows XP Professional。Windows PE 提供了执行下列操作所需的最低功能: • 运行 Windows 安装程序。 • 从网络共享中安装操作系统.

记事本 6082

127. 答网友疑问:ABAP Function Module 如何支持内表结构不确定的动态输入参数

ABAP RTTI 的全称是 Runtime Type Identification. 使用 RTTI,ABAP 开发人员可以在运行时获取关于数据对象的各种信息,包括其数据类型、字段列表(如果数据是Structure 或者内表的话)以及这些字段的技术属性,比如字段名称,字段数据类型,长度等等。对于这些字段信息,ABAP 提供了一组特殊的类和接口,包括 CL_ABAP_TYPEDESCR、CL_ABAP_STRUCTDESCR、CL_ABAP_TABLEDESCR 等等。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1763

WinCE6.0中Romimage.exe的BUG

     WinCE6.0的Romimage.exe依然存在BUG,跟WinCE5.0一样。当新建的工程和PB的安装目录不在同一分区时就不能正确生成nb0文件。本以为WinCE6.0已经解决这个问题,不想饱汉不知饿汉饥,他们似乎没有发现这个BUG,也就不可能修复了。        好在WinCE6.0开源,在Private的目录下找到了对应的源代码目录,打算修改代码,重新编译一个romimage...

weixin_34250709的博客 185

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

把wince设备的ram 文件系统换成rom 文件系统,实现cab 等安装文件的永久保存,和mobile 一样。

作者:gooogleman  日期:  试了一下感觉还不错,以后机器就这样出了,做个系统让她们测试个把星期就拿出去升级了。   在platform.reg 下面的 [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\S

gooogleman#foxmail.com 4835

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

4.ring0-遍历IAT(特例NTOS)

原NTOS的IAT只能通过IMAGE_DIRECTORY_ENTRY_IAT(12)来获得,因为NTOS加载完后,INIT方式加载,所以IMAGE_DIRECTORY_ENTRY_IMPORT对应的区域被释放了! 坑爹啊, 可以用windbg很直观的看到: X86: x64: 其他的IAT遍历代码如下: NTSTATUS EnumIATTable(ULO

hgy413的专栏 1803

揭秘Romimage生成的.nb0.bin文件(绝对原创,禁止转载)

   如果你想用微软的romimage工具生成image,那么你一定要在你的exe文件中定义下面这个全局变量:ROMHDR * volatile const pTOC = (ROMHDR *)-1;Romimage会帮你填充它的地址。因此这是一个编译链接后的处理。之后,生成的image被加载到内存时,你的代码中对pTOC的参考就会是有效的,而不是这里定义的-1。请不要尝试修改-

cpuwolf的成长笔记 4275

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 361
上一篇: ARM核心及体系结构的关系
下一篇: MVC开发模式下快捷地调试控制功能
alien75
博客等级 码龄25年 195粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值