Java 4 Java数组
数组的声明和创建
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
123dataType[] arrayRefVar; //首选的方法或dataType arrayRefVar[]; //效果相同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
1dataType[] arrayRefVar = new dataType[arraySize];
数组的元素是通过索引访问的,数组索引从0开始。
获取数组长度:
1arrays.length
Demo
123456789101112131415161718192021222324252627package com.zhang.array;public class Demo { //变量的类型 变量的名字 = 变量的值 //数组类型 public static void main(String[] args) { int[] nums; nums = new int[10]; nums[0] = 1; ...
Java 3 方法
什么是方法
Java方法是语句的集合,它们在一起执行一个功能
方法是解决一类问题的步骤的有序组合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样有利于我们后期的扩展。
12345678910111213141516171819202122package com.zhang.method;public class Demo { public static void main(String[] args) { int sum = add(1, 2); System.out.println(sum); test(); } public static int add(int a, int b) { return a + b; } public static void test() { ...
Java 2 Java流程控制
用户交互Scanner
之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。Java.util.Scanner是Java5的特征,我们可以通过Scanner类来获取用户的输入
基本语法:
1Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取之前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据
Demo1
12345678910111213141516171819package com.zhang.scanner;import java.util.Scanner;public class Demo { public static void main(String[] args) { //创建一个扫描器对象,用于接收键盘数据 Scanner scanner = new Scanner(System.in); Sy ...
Java 1 Java基础
注释Java中的注释有三种:
单行注释
多行注释
文档注释
1234567891011121314151617public class Demo { public static void main(String[] args) { //单行注释:只能注释一行文字 // //输出一个Hello,World! System.out.println("Hello,World!"); //多行注释:可以注释一段文字 /* 注释 */ /* 123 123 */ //JavaDoc:文档注释 /** */ /** * @Descrition HelloWorld * @Author */ }}
标识符和关键字Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符
所有的标识符都应该以字母(A-Z或者a-z ...
PE 6 文件数据目录与节表结构
数据目录(Data Directory)数据目录位于 IMAGE_OPTIONAL_HEADER 的末尾,是一个由 IMAGE_DATA_DIRECTORY 结构体数组构成的表。每个数据目录项描述了 PE 文件中某一特定数据结构的偏移和大小。常见的数据目录包括:
IMAGE_DIRECTORY_ENTRY_EXPORT(导出表)
作用:记录模块导出的函数和数据。对于 DLL 来说,这部分内容非常关键,系统及其他模块通过它来调用 DLL 中的接口。
IMAGE_DIRECTORY_ENTRY_IMPORT(导入表)
作用:记录模块依赖的外部函数和数据。通过导入表,操作系统能够在加载时将所需的外部函数地址填入模块的导入地址表。
IMAGE_DIRECTORY_ENTRY_IAT(导入地址表)
作用:保存导入函数的实际地址,加载器在加载时会根据导入表将相应地址写入 IAT,供程序调用时直接使用。
IMAGE_DIRECTORY_ENTRY_RESOURCE(资源表)
作用:存放程序所用的各种资源,如图标、对话框、字符串等。
IMAGE_DIRECTORY_ENTRY_BAS ...
PE 5 NT Optional Header 3
NT Optional Header 字段解析在 PE 文件(Portable Executable)的 IMAGE_OPTIONAL_HEADER 结构中,除了之前介绍的基地址、对齐、版本等字段外,还有一组与程序完整性、加载环境和内存资源管理相关的重要字段。下面依次对这些字段进行说明:
校验和(CheckSum)1DWORD CheckSum; //参考 校验和(驱动)
含义:
该字段存储 PE 文件的校验和,用于验证文件在存储或传输过程中的完整性。
作用:
对于大部分普通的 EXE 或 DLL 文件,校验和字段一般不影响加载过程,很多时候会被置为 0。
驱动程序(.sys 文件)要求校验和必须正确,系统在加载内核驱动时会验证该字段,确保文件未被破坏或篡改。
计算:
校验和通常由编译器或链接器计算,也可以通过专门工具(例如 CheckSumMappedFile API)重新计算校验值。
运行子系统(Subsystem)1WORD Subsystem; //重要 01(驱动) 02(窗口 ...
PE 4 NT Optional Header 2
NT Optional Header 重要字段解析在 NT 头中的 IMAGE_OPTIONAL_HEADER 结构中,包含了一些额外的重要字段(NT additional fields)。这些字段涉及 PE 文件的内存布局、对齐方式、版本信息以及镜像大小等内容,在 PE 文件的加载和运行过程中起着至关重要的作用。本文将详细解析这些字段的含义和用途。
代码与数据基地址12DWORD BaseOfCode; // 代码基地址(RVA)DWORD BaseOfData; // 数据基地址(仅适用于32位 PE)
BaseOfCode:
含义:该字段表示代码段(.text 节)在内存中的相对虚拟地址(RVA)。
作用:帮助加载器确定代码段的起始位置,以便正确映射和执行代码。
BaseOfData:
含义:表示数据段(.data 节)在内存中的相对虚拟地址(RVA)。
作用:用于确定全局变量和静态数据存放的位置,仅适用于 32 位 PE,在 64 位 PE 中该字段已被移除。
主模块基址(ImageBase) ...
PE 3 NT Optional Header 1
NT Optional Header 字段详解在 PE(Portable Executable)格式中,IMAGE_OPTIONAL_HEADER 扮演着非常重要的角色,它提供了操作系统加载程序时所需的关键信息。
Magic 字段123WORD Magic; IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
含义: Magic 字段用于标识可执行文件是32位还是64位。
对于32位 PE 文件,其值为 0x10b(IMAGE_NT_OPTIONAL_HDR32_MAGIC)。
对于64位 PE 文件,其值为 0x20b(IMAGE_NT_OPTIONAL_HDR64_MAGIC)。
作用: 加载器通过检测该字段来判断如何解析后续的可选头结构,从而选择正确的数据结构和加载方式。
链接器版本123//链接器的版本 参考使用的VS的版本BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;
含义: 这两个 ...
PE 2 NT头
在Windows操作系统中,可执行文件通常采用PE(Portable Executable)格式。PE格式不仅支持32位和64位系统,而且在文件结构上具有层次分明、信息丰富的特点。其中,NT头(IMAGE_NT_HEADERS) 是整个PE文件的核心部分,它起到了连接DOS兼容部分和实际执行数据之间的桥梁作用。
NT头的整体结构NT头一般包括以下几个部分:
Signature(签名)
描述:一个DWORD类型的值,通常为"PE\0\0",用于标识文件为合法的PE格式。
作用:通过检测这个魔数,操作系统和工具可以确认文件格式并继续解析后续内容。
IMAGE_FILE_HEADER(文件头) 这一部分包含了描述文件基本属性的重要信息,例如:
Machine(机器类型):一个WORD值,用于说明目标CPU平台(如x86、x64等)。
NumberOfSections(节区数量):一个WORD值,指出文件中节(section)的个数,每个节代表一个独立的数据区,如代码、数据、资源等。
TimeDateStamp(时间戳):一个DWORD值,记录文件生成的时间,可以用来 ...
PE 1 DOS头、NT头和节表
PE 文件格式简介
PE(Portable Executable)格式:这是 Windows 系统下常用的可执行文件格式。相比于 Linux 系统下的 ELF 格式,PE 格式在 Windows 平台上具有广泛应用。
结构概览
IMAGE_DOS_HEADER:文件最开始的 DOS 头(兼容16位),其中包含了一个跳转指令以及一个指向 NT 头的偏移量(e_lfanew)。
DOS Stub:一个 DOS 程序,当在 DOS 环境下执行时显示提示信息(通常提示“此程序只能在 Windows NT/2000/XP 等系统上运行”)。
IMAGE_NT_HEADERS
:紧接 DOS Stub 后面的 NT 头,其中包含:
Signature:魔数(通常是 “PE\0\0”)。
IMAGE_FILE_HEADER:描述文件信息,如目标机器类型、节数量等。
IMAGE_OPTIONAL_HEADER:描述程序加载信息(例如入口点、程序内存布局等),以及数据目录数组,用于指向如导入表、导出表、资源表等重要数据结构。
IMAGE_SECTION_HEADER:紧 ...