滴水三期:day01.1-初识逆向

本文介绍了计算机中的二进制表示和数据宽度概念,重点讲解了PE文件结构在Windows操作系统中的应用,包括程序执行起点、数据存储以及PE分析工具的使用。此外,还探讨了硬编码在理解二进制函数意义中的作用,以及逆向工程的基本流程:从二进制到汇编再到C语言。最后,提到了逆向分析项目如反汇编引擎和PE分析器的重要性,并提及了可能涉及的游戏逆向分析和安全防护技术。

一、进制与0,1

  • 计算机上都是以0,1来存储的
  • 一位十六进制数用四位二进制数表示,8位二进制表示一个字节,字节是计算机管理的最小单元,所以2位十六进制数表示一个字节,我们平时用工具打开二进制文件,都是用十六进制显示,2位就是一个字节
  • 计算机存储一个数据可以有不同的数据宽度
    • 数据宽度:一般常用有Byte(字),Word(字)、Dword(双字)、DDword(四字)。分别为8位、16位,32位,64位
  • 八进制的2-3等于多少,详见day02.3-逻辑运算

二、PE文件结构

  • PE文件结构只限于windows操作系统,windows上运行的任何一个可执行的程序都应该遵循的结构。所以PE结构适用于windows上任何可执行程序

  • 如果想分析知道别人写的程序,至少应该知道三件事:1.程序从哪里开始执行;2.数据藏在哪里;3.程序藏在哪里

  • 如何分析一个PE文件:

    • 一堆密密麻麻的十六进制数,从哪位开始的多少长度表示的数值是文件的某些信息,下面举一个例子初步分析一下

    • 文件的起始位置:在PE文件的0x3c处开始往后的4字节。注意:windows系统中数据存储方式是低位在前、高位在后,比如一个文件用二进制的方式打开,如果找到表示文件起始位置的数显示为e8 00 00 00,这个显示的格式是按照windows存储方式,但是现实中我们写、读书是从高位到低位,所以这里应该读作00 00 00 e8,即文件的起始位置在0xe8。(由于计算机存储最小单位是1个字节,即2位十六进制,所以每两位十六进制当做一个整体读

1讲:2015-01-12(进制01) 第2讲:2015-01-13(进制02) 第3讲:2015-01-14(数据宽度-逻辑运算03) 第4讲:2015-01-15(通用寄存器-内存读写04) 第5讲:2015-01-16(内存寻址-堆栈05) 第6讲:2015-01-19(EFLAGS寄存器06) 第7讲:2015-01-20(JCC) 第8讲:2015-01-21(堆栈图) 第8讲:2015-01-21(宝马问题) 第9讲:2015-01-22(堆栈图2) 第10讲:2015-01-23(C语言01_后半段) 第10讲:2015-01-23(C语言完整版) 第11讲:2015-01-26(C语言02_数据类型) 第12讲:2015-01-27(C语言03_数据类型_IF语句) 第13讲:2015-01-28(C语言04_IF语句逆向分析上) 第14讲:2015-01-28(C语言04_IF语句逆向分析下) 第15讲:2015-01-29(C语言04_正向基础) 第16讲:2015-01-30(C语言05_循环语句) 第17讲:2015-02-02(C语言06_参数_返回值_局部变量_数组反汇编) 第18讲:2015-02-02(2015-01-30课后练习) 第19讲:2015-02-03(C语言07_多维数组) 第20讲:2015-02-03(2015-02-02课后练习) 第21讲:2015-02-04(C语言08_结构体) 第22讲:2015-02-05(C语言09_字节对齐_结构体数组) 第23讲:2015-02-06(C语言10_Switch语句反汇编) 第24讲:2015-02-26(C语言11_指针1) 第25讲:2015-02-27(C语言11_指针2) 第26讲:2015-02-28(C语言11_指针3) 第27讲:2015-02-28(C语言11_指针4) 第28讲:2015-03-02(C语言11_指针5) 第29讲:2015-03-03(C语言11_指针6) 第30讲:2015-03-04(C语言11_指针7) 第31讲:2015-03-06(C语言11_指针8) 第32讲:2015-03-09(位运算) 第33讲:2015-03-10(内存分配_文件读写) 第34讲:2015-03-11(PE头解析_手动) 第35讲:2015-03-12(PE头字段说明) 第36讲:2015-03-13(PE节表) 第37讲:2015-03-16(FileBuffer转ImageBuffer) 第38讲:2015-03-17(代码节空白区添加代码) 第39讲:2015-03-18(任意节空白区添加代码) 第40讲:2015-03-19(新增节添加代码) 第41讲:2015-03-20(扩大节-合并节-数据目录) 第42讲:2015-03-23(静态连接库-动态链接库) 第43讲:2015-03-24(导出表) 第44讲:2015-03-25(重定位表) 第45讲:2015-03-26(移动导出表-重定位表) 第46讲:2015-03-27(IAT表) 第47讲:2015-03-27(导入表) 第48讲:2015-03-30(绑定导入表) 第49讲:2015-03-31(导入表注入) 第50讲:2015-04-01(C++ this指针 类 上) 第51讲:2015-04-01(C++ this指针 类 下) 第52讲:2015-04-02(C++ 构造-析构函数 继承) 第53讲:2015-04-03(C++ 权限控制) 第54讲:2015-04-07(C++ 虚函数表) 第55讲:2015-04-08(C++ 动态绑定-多态-上) 第56讲:2015-04-08(C++ 动态绑定-多态-下) 第57讲:2015-04-09(C++ 模版) 第58讲:2015-04-10(C++ 引用-友元-运算符重载) 第59讲:2015-04-13(C++ new-delete-Vector) 第60讲:2015-04-14(C++Vector实现) 第61讲:2015-04-15(C++链表) 第62讲:2015-04-16(C++链表实现) 第63讲:2015-04-16(C++二叉树) 第64讲:2015-04-17(C++二叉树实现) 第65讲:2015-04-20(Win32 宽字符) 第66讲:2015-04-21(Win32 事件-消息-消息处理函数) 第67讲:2015-04-22(Win32 ESP寻址-定位回调函数-条件断点) 第68讲:2015-04-23(Win32 子窗口-消息处理函数定位) 第69讲:2015-04-24(Win32 资源文件-消息断点) 第70讲:2015-04-27(Win32 提取图标-修改标题) 第71讲:2015-04-28(Win32 通用控件-VM_NOTIFY) 第72讲:2015-04-29(Win32 PE查看器-项目要求) 项目一:PE查看器 开发周期(5天) 需求文档 第73讲:2015-05-07(Win32 创建线程) 第74讲:2015-05-08(Win32 线程控制_CONTEXT) 第75讲:2015-05-11(Win32 临界区) 第76讲:2015-05-12(Win32 互斥体) 第77讲:2015-05-13(Win32 事件) 第78讲:2015-05-14(Win32 信号量) 第79讲:2015-05-15(Win32 线程同步与线程互斥) 第80讲:2015-05-18(Win32 进程创建_句柄表) 第81讲:2015-05-20(Win32 以挂起形式创建进程) 第82讲:2015-05-21(Win32 加密壳_项目说明) 项目二:加密壳 开发周期(5天) 需求文档 第83讲:2015-05-28(Win32 枚举窗口_鼠标键盘事件) 第84讲:2015-05-29(Win32 CE练习) 第85讲:2015-06-01(Win32 OD练习) 第86讲:2015-06-03(Win32 ShellCode_远程线程注入) 第87讲:2015-06-04(Win32 加载EXE_模块隐藏) 第88讲:2015-06-09(Win32 IAT_HOOK) 第89讲:2015-06-10(Win32 InlineHook) 第90讲:2015-06-11(Win32 进程通信) 第91讲:2015-06-11(Win32 进程监控_项目说明) 项目三:进程监控 开发周期(5天) 需求文档 第92讲:2015-06-15(硬编码_01) 第93讲:2015-06-16(硬编码_02) 第94讲:2015-06-17(硬编码_03) 第95讲:2015-06-18(硬编码_04) 第96讲:2015-06-19(硬编码_05)
<think>我们被要求解释以下命令: x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 1-4 -n 4 -a 0000:1f:01.0,cap=dcf,representor=[1,2] -a 0000:1f:01.1 -a 0000:1f:01.2 --file-prefix=dpdk_5576_20251218232627 -- -i 这个命令是运行DPDK的testpmd应用程序,用于测试和开发DPDK的数据包转发能力。下面我们分解每个参数: 1. **可执行文件路径**:`x86_64-native-linuxapp-gcc/app/dpdk-testpmd` - 这是编译生成的testpmd应用程序,位于DPDK编译输出目录的`app`子目录下。DPDK编译时,会根据目标平台(这里是`x86_64-native-linuxapp-gcc`)生成相应的可执行文件。 2. **核心绑定参数**:`-l 1-4` - 指定DPDK应用使用的CPU核心列表。这里`1-4`表示使用逻辑核心1、2、3、4(包括1和4,即连续的4个核心)。 3. **内存通道数**:`-n 4` - 指定内存通道数(number of memory channels)。通常设置为物理内存通道的数量,这里设置为4。 4. **设备白名单参数**:`-a 0000:1f:01.0,cap=dcf,representor=[1,2]` - `-a` 用于添加一个PCI设备到DPDK应用。 - `0000:1f:01.0` 是PCI设备的地址(domain:bus:slot.function)。 - `cap=dcf`:指定设备的capability(能力)为DCF(Device Configuration Function),这是Intel® Ethernet 800系列网卡的一个特性,用于支持设备配置功能。 - `representor=[1,2]`:指定该物理设备的representor(代表端口)的索引,用于SR-IOV虚拟功能(VF)的管理。这里表示使用索引1和2的representor(通常用于Open vSwitch等场景)。 5. **附加设备**:`-a 0000:1f:01.1` 和 `-a 0000:1f:01.2` - 继续添加另外两个PCI设备(可能是同一个网卡的其他功能或其他网卡)。 6. **文件前缀**:`--file-prefix=dpdk_5576_20251218232627` - 设置DPDK使用的共享数据文件的唯一前缀。当多个DPDK进程在同一台机器上运行时,通过不同的文件前缀来隔离它们使用的共享内存区域。这里的前缀包含时间戳和进程ID(5576)信息。 7. **分隔符**:`--` - 分隔DPDK的EAL(环境抽象层)参数和应用程序(testpmd)的参数。 8. **testpmd应用程序参数**:`-i` - 这是传递给testpmd的参数,表示以交互模式启动。在交互模式下,用户可以在控制台输入命令来控制testpmd的行为(如启动/停止转发、显示统计信息等)。 ### 命令总结 该命令的作用是:使用DPDK的testpmd工具,绑定4个CPU核心(1到4),设置4个内存通道,添加三个PCI设备(其中第一个设备启用了DCF能力并指定了两个representor),并设置文件前缀以及以交互模式运行。 ### 注意事项 - 运行DPDK应用需要提前设置大页内存(参考引用[3]和[5])并加载相应的内核模块(如uio_pci_generic, igb_uio等,引用[2]和[4])。 - 在运行此命令前,需要将网卡绑定到DPDK兼容的驱动(如vfio-pci或igb_uio),否则可能无法捕获网卡。 ### 附加说明:DCF(Device Configuration Function) DCF是Intel Ethernet 800系列网卡提供的一种功能,允许在虚拟化环境中通过一个VF(虚拟功能)来配置整个物理设备。这样,虚拟机可以通过这个VF来管理设备的全局配置,而不需要宿主机的介入。 ### 附加说明:Representor 在SR-IOV场景中,每个VF在主机端(如OVS)会有一个对应的representor接口。通过操作representor接口,可以监控和控制对应的VF的数据流。 ### 运行环境 - 该命令运行在Linux系统上,且已经成功编译了DPDK(目标平台为x86_64-native-linuxapp-gcc)。 - 需要以root权限运行(因为DPDK需要访问硬件设备)。 ### 流程示意图 ```mermaid graph LR A[启动testpmd] --> B[绑定核心1-4] A --> C[设置4个内存通道] A --> D[添加PCI设备0000:1f:01.0并设置DCF和representor] A --> E[添加PCI设备0000:1f:01.1] A --> F[添加PCI设备0000:1f:01.2] A --> G[设置文件前缀] A --> H[以交互模式运行] ``` §§相关问题§§ 1. 如何编译DPDK的testpmd应用程序? 2. 在DPDK中如何绑定网卡到用户态驱动? 3. testpmd交互模式下有哪些常用命令? 4. 如何配置大页内存以支持DPDK? </think> ### 命令解析:DPDK testpmd 运行参数详解 以下是您提供的命令的逐部分解释: ```bash x86_64-native-linuxapp-gcc/app/dpdk-testpmd \ -l 1-4 \ # CPU核心绑定 -n 4 \ # 内存通道数 -a 0000:1f:01.0,cap=dcf,representor=[1,2] \ # 设备1带高级参数 -a 0000:1f:01.1 \ # 设备2 -a 0000:1f:01.2 \ # 设备3 --file-prefix=dpdk_5576_20251218232627 \ # 共享内存标识 -- \ # 参数分隔符 -i # 交互模式 ``` #### 1. **可执行文件路径** - `x86_64-native-linuxapp-gcc/app/dpdk-testpmd` - DPDK 的 testpmd 测试工具,位于编译后的目录结构中 - `x86_64-native-linuxapp-gcc` 是 DPDK 的编译目标平台[^1] #### 2. **EAL 参数 (Environment Abstraction Layer)** - `-l 1-4` - 指定使用的 CPU 核心范围:核心 1 到核心 4 - 格式支持:单个核心 `-l 3`,列表 `-l 1,3,5`,范围 `-l 2-6` - `-n 4` - 内存通道数,必须与硬件配置匹配(通常为 2/4/6) - 可通过 `dmidecode -t memory` 查看物理内存通道数 - `-a` **设备绑定参数** ```bash -a 0000:1f:01.0,cap=dcf,representor=[1,2] ``` - `0000:1f:01.0`:PCIe 设备地址(域:总线:设备.功能) - `cap=dcf`:启用设备配置功能(Device Configuration Function),用于高级网卡管理 - `representor=[1,2]`:指定虚拟功能代表端口,用于 SR-IOV 场景管理 VF - 其他两个 `-a` 参数绑定额外设备(未启用特殊功能) - `--file-prefix=dpdk_5576_20251218232627` - 共享内存的唯一标识符(包含时间戳和进程ID 5576) - 允许多个 DPDK 进程共存(每个需唯一前缀)[^3] #### 3. **testpmd 专用参数** - `--`:分隔符,之前是 EAL 参数,之后是应用参数 - `-i`:启动交互式命令行模式 - 支持动态命令如: ```bash > start # 开始包转发 > show port stats all # 查看统计 > set fwd mac # 设置转发模式 ``` #### 4. **依赖的底层配置** - **大页内存配置**(需提前设置)[^5] ```bash echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages mkdir -p /mnt/huge mount -t hugetlbfs nodev /mnt/huge ``` - **驱动绑定**(如 igb_uio)[^2][^4] ```bash modprobe uio insmod igb_uio.ko ./dpdk-devbind.py --bind=igb_uio 0000:1f:01.0 ``` #### 命令执行流程图 ```mermaid graph LR A[加载大页内存] --> B[绑定网卡到用户态驱动] B --> C[执行testpmd命令] C --> D[解析EAL参数] D --> E[初始化设备] E --> F[进入交互模式] F --> G[执行转发测试] ``` #### 典型应用场景 1. 网卡性能基准测试 2. 自定义转发逻辑验证 3. DPDK 功能开发调试 4. 网络设备兼容性测试
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值