支持资源表
This commit is contained in:
parent
a260c5b70a
commit
676b4e69a1
|
@ -6,3 +6,4 @@
|
|||
# https://dart.dev/guides/libraries/private-files#pubspeclock.
|
||||
pubspec.lock
|
||||
.vscode/
|
||||
test.sql
|
||||
|
|
|
@ -8,4 +8,6 @@ export 'src/pojo/image_doc_header.dart' show ImageDocHeader;
|
|||
export 'src/pojo/image_nt_header.dart' show ImageNtHeaders32;
|
||||
export 'src/pojo/reader_seeker.dart' show ReaderSeeker;
|
||||
export 'src/pojo/image_section_header.dart' show ImageSectionHeader;
|
||||
export 'src/pojo/resourse_section.dart' show IMAGE_RESOURCE_DIRECTORY,IMAGE_RESOURCE_DIRECTORY_ENTRY,FileEntry;
|
||||
export 'src/peparse_base.dart' show PeFile;
|
||||
// TODO: Export any libraries intended for clients of this package.
|
||||
|
|
|
@ -1,6 +1,35 @@
|
|||
// TODO: Put public facing types in this file.
|
||||
import 'dart:io';
|
||||
|
||||
/// Checks if you are awesome. Spoiler: you are.
|
||||
class Awesome {
|
||||
bool get isAwesome => true;
|
||||
import './pojo/image_doc_header.dart';
|
||||
import './pojo/image_nt_header.dart';
|
||||
import './pojo/image_section_header.dart';
|
||||
import './pojo/resourse_section.dart';
|
||||
import './pojo/reader_seeker.dart';
|
||||
|
||||
class PeFile {
|
||||
ImageDocHeader? imageDocHeader;
|
||||
ImageNtHeaders32? imageNtHeaders;
|
||||
List<ImageSectionHeader> imageSectionHeaders = [];
|
||||
IMAGE_RESOURCE_DIRECTORY? imageResourceDirectory;
|
||||
|
||||
PeFile.parseFile(String filepath) {
|
||||
File file = File(filepath);
|
||||
var data = ReaderSeeker(file.readAsBytesSync());
|
||||
imageDocHeader = ImageDocHeader(data);
|
||||
data.seek(imageDocHeader!.elfanew);
|
||||
imageNtHeaders = ImageNtHeaders32(data);
|
||||
imageSectionHeaders = <ImageSectionHeader>[];
|
||||
for (var i = 0; i < imageNtHeaders!.fileHeader.numberOfSections; i++) {
|
||||
imageSectionHeaders.add(ImageSectionHeader(data));
|
||||
}
|
||||
var resourse_section =
|
||||
imageSectionHeaders.firstWhere((element) => element.name == '.rsrc');
|
||||
imageResourceDirectory = IMAGE_RESOURCE_DIRECTORY(
|
||||
resourse_section.pointerToRawData, 0, resourse_section, data);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return '{"imageDocHeader":${imageDocHeader.toString()}, "imageNtHeaders":${imageNtHeaders.toString()}, "imageSectionHeaders":${imageSectionHeaders.toString()}, "imageResourceDirectory":${imageResourceDirectory.toString()}}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,7 +28,8 @@ class ImageSectionHeader {
|
|||
|
||||
ImageSectionHeader(ReaderSeeker readerSeeker){
|
||||
_name = readerSeeker.getByte(8);
|
||||
name = utf8.decode(_name,allowMalformed: true);
|
||||
_name.removeWhere((element) => element == 0);
|
||||
name = utf8.decode(_name,allowMalformed: false);
|
||||
var data = readerSeeker.getData(32);
|
||||
misc = data.getUint32(0,Endian.little);
|
||||
virtualAddress = data.getUint32(4,Endian.little);
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import './reader_seeker.dart';
|
||||
import './image_section_header.dart';
|
||||
|
||||
class IMAGE_RESOURCE_DIRECTORY{
|
||||
int Characteristics = 0;
|
||||
int TimeDateStamp = 0;
|
||||
int MajorVersion = 0;
|
||||
int MinorVersion = 0;
|
||||
int NumberOfNamedEntries = 0;
|
||||
int NumberOfIdEntries = 0;
|
||||
List<IMAGE_RESOURCE_DIRECTORY_ENTRY> Entries = [];
|
||||
IMAGE_RESOURCE_DIRECTORY(int startOffset,int offset,ImageSectionHeader section,ReaderSeeker readerSeeker){
|
||||
readerSeeker.seek(startOffset+offset);
|
||||
var data = readerSeeker.getData(16);
|
||||
Characteristics = data.getUint32(0,Endian.little);
|
||||
TimeDateStamp = data.getUint32(4,Endian.little);
|
||||
MajorVersion = data.getUint16(8,Endian.little);
|
||||
MinorVersion = data.getUint16(10,Endian.little);
|
||||
NumberOfNamedEntries = data.getUint16(12,Endian.little);
|
||||
NumberOfIdEntries = data.getUint16(14,Endian.little);
|
||||
|
||||
for (var i = 0; i < NumberOfNamedEntries + NumberOfIdEntries; i++) {
|
||||
Entries.add(IMAGE_RESOURCE_DIRECTORY_ENTRY(readerSeeker));
|
||||
}
|
||||
|
||||
for (var i = 0; i < NumberOfNamedEntries + NumberOfIdEntries; i++) {
|
||||
if (Entries[i].is_folder){
|
||||
Entries[i].children = IMAGE_RESOURCE_DIRECTORY(startOffset , Entries[i].OffsetToData,section,readerSeeker);
|
||||
}else{
|
||||
readerSeeker.seek(startOffset + Entries[i].OffsetToData);
|
||||
Entries[i].fileEntry = FileEntry(readerSeeker);
|
||||
Entries[i].fileEntry!.real_offset = Entries[i].fileEntry!.offsetToData - section.virtualAddress + section.pointerToRawData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String toString(){
|
||||
return '{"Characteristics":${Characteristics.toRadixString(16)}, "TimeDateStamp":${TimeDateStamp.toRadixString(16)}, "MajorVersion":${MajorVersion.toRadixString(16)}, "MinorVersion":${MinorVersion.toRadixString(16)}, "NumberOfNamedEntries":${NumberOfNamedEntries.toRadixString(16)}, "NumberOfIdEntries":${NumberOfIdEntries.toRadixString(16)}, "Entries":${Entries}}';
|
||||
}
|
||||
|
||||
String toJson(){
|
||||
return JsonEncoder().convert(this);
|
||||
}
|
||||
}
|
||||
|
||||
class IMAGE_RESOURCE_DIRECTORY_ENTRY{
|
||||
int Name = 0;
|
||||
int OffsetToData = 0;
|
||||
|
||||
bool is_folder = false;
|
||||
FileEntry? fileEntry = null;
|
||||
IMAGE_RESOURCE_DIRECTORY? children = null;
|
||||
IMAGE_RESOURCE_DIRECTORY_ENTRY(ReaderSeeker readerSeeker){
|
||||
var data = readerSeeker.getData(8);
|
||||
Name = data.getUint32(0,Endian.little);
|
||||
OffsetToData = data.getUint32(4,Endian.little);
|
||||
is_folder = ((OffsetToData >> 31) & 0x01) == 1;
|
||||
if (is_folder){
|
||||
OffsetToData = OffsetToData & 0x7FFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String toString(){
|
||||
return '{"Name":${Name.toRadixString(16)}, "OffsetToData":${OffsetToData.toRadixString(16)}, "is_folder":${is_folder}, "fileEntry":${fileEntry}, "children":${children}}';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class FileEntry{
|
||||
int offsetToData = 0;
|
||||
int size = 0;
|
||||
int codePage = 0 ;
|
||||
int reserved = 0 ;
|
||||
|
||||
int real_offset = 0;
|
||||
|
||||
FileEntry(ReaderSeeker readerSeeker){
|
||||
var data = readerSeeker.getData(16);
|
||||
offsetToData = data.getUint32(0,Endian.little);
|
||||
size = data.getUint32(4,Endian.little);
|
||||
codePage = data.getUint32(8,Endian.little);
|
||||
reserved = data.getUint32(12,Endian.little);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString(){
|
||||
return '{"offsetToData":${offsetToData.toRadixString(16)}, "real_offset":"${real_offset.toRadixString(16)}", "size":${size.toRadixString(16)}, "codePage":${codePage.toRadixString(16)}, "reserved":${reserved.toRadixString(16)}}';
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue