mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-08 19:33:31 +00:00
xbe loader
This commit is contained in:
parent
a576fc85d5
commit
90df6195e1
@ -9,6 +9,7 @@ OBJS += p/bin_any.c ;
|
||||
OBJS += p/bin_ningb.c ;
|
||||
OBJS += p/bin_bios.c ;
|
||||
OBJS += p/bin_rar.c ;
|
||||
OBJS += p/bin_xbe.c ;
|
||||
|
||||
# Plan9
|
||||
OBJS += p/bin_p9.c format/p9/p9bin.c ;
|
||||
|
365
libr/bin/format/xbe/kernel.h
Normal file
365
libr/bin/format/xbe/kernel.h
Normal file
@ -0,0 +1,365 @@
|
||||
"AvGetSavedDataAddress",
|
||||
"AvSendTVEncoderOption",
|
||||
"AvSetDisplayMode",
|
||||
"AvSetSavedDataAddress",
|
||||
"DbgBreakPoint",
|
||||
"DbgBreakPointWithStatus",
|
||||
"DbgLoadImageSymbols",
|
||||
"DbgPrint",
|
||||
"HalReadSMCTrayState",
|
||||
"DbgPrompt",
|
||||
"DbgUnLoadImageSymbols",
|
||||
"ExAcquireReadWriteLockExclusive",
|
||||
"ExAcquireReadWriteLockShared",
|
||||
"ExAllocatePool",
|
||||
"ExAllocatePoolWithTag",
|
||||
"ExEventObjectType",
|
||||
"ExFreePool",
|
||||
"ExInitializeReadWriteLock",
|
||||
"ExInterlockedAddLargeInteger",
|
||||
"ExInterlockedAddLargeStatistic",
|
||||
"ExInterlockedCompareExchange64",
|
||||
"ExMutantObjectType",
|
||||
"ExQueryPoolBlockSize",
|
||||
"ExQueryNonVolatileSetting",
|
||||
"ExReadWriteRefurbInfo",
|
||||
"ExRaiseException",
|
||||
"ExRaiseStatus",
|
||||
"ExReleaseReadWriteLock",
|
||||
"ExSaveNonVolatileSetting",
|
||||
"ExSemaphoreObjectType",
|
||||
"ExTimerObjectType",
|
||||
"ExfInterlockedInsertHeadList",
|
||||
"ExfInterlockedInsertTailList",
|
||||
"ExfInterlockedRemoveHeadList",
|
||||
"FscGetCacheSize",
|
||||
"FscInvalidateIdleBlocks",
|
||||
"FscSetCacheSize",
|
||||
"HalClearSoftwareInterrupt",
|
||||
"HalDisableSystemInterrupt",
|
||||
"HalDiskCachePartitionCount",
|
||||
"HalDiskModelNumber",
|
||||
"HalDiskSerialNumber",
|
||||
"HalEnableSystemInterrupt",
|
||||
"HalGetInterruptVector",
|
||||
"HalReadSMBusValue",
|
||||
"HalReadWritePCISpace",
|
||||
"HalRegisterShutdownNotification",
|
||||
"HalRequestSoftwareInterrupt",
|
||||
"HalReturnToFirmware",
|
||||
"HalWriteSMBusValue",
|
||||
"InterlockedCompareExchange",
|
||||
"InterlockedDecrement",
|
||||
"InterlockedIncrement",
|
||||
"InterlockedExchange",
|
||||
"InterlockedExchangeAdd",
|
||||
"InterlockedFlushSList",
|
||||
"InterlockedPopEntrySList",
|
||||
"InterlockedPushEntrySList",
|
||||
"IoAllocateIrp",
|
||||
"IoBuildAsynchronousFsdRequest",
|
||||
"IoBuildDeviceIoControlRequest",
|
||||
"IoBuildSynchronousFsdRequest",
|
||||
"IoCheckShareAccess",
|
||||
"IoCompletionObjectType",
|
||||
"IoCreateDevice",
|
||||
"IoCreateFile",
|
||||
"IoCreateSymbolicLink",
|
||||
"IoDeleteDevice",
|
||||
"IoDeleteSymbolicLink",
|
||||
"IoDeviceObjectType",
|
||||
"IoFileObjectType",
|
||||
"IoFreeIrp",
|
||||
"IoInitializeIrp",
|
||||
"IoInvalidDeviceRequest",
|
||||
"IoQueryFileInformation",
|
||||
"IoQueryVolumeInformation",
|
||||
"IoQueueThreadIrp",
|
||||
"IoRemoveShareAccess",
|
||||
"IoSetIoCompletion",
|
||||
"IoSetShareAccess",
|
||||
"IoStartNextPacket",
|
||||
"IoStartNextPacketByKey",
|
||||
"IoStartPacket",
|
||||
"IoSynchronousDeviceIoControlRequest",
|
||||
"IoSynchronousFsdRequest",
|
||||
"IofCallDriver",
|
||||
"IofCompleteRequest",
|
||||
"KdDebuggerEnabled",
|
||||
"KdDebuggerNotPresent",
|
||||
"IoDismountVolume",
|
||||
"IoDismountVolumeByName",
|
||||
"KeAlertResumeThread",
|
||||
"KeAlertThread",
|
||||
"KeBoostPriorityThread",
|
||||
"KeBugCheck",
|
||||
"KeBugCheckEx",
|
||||
"KeCancelTimer",
|
||||
"KeConnectInterrupt",
|
||||
"KeDelayExecutionThread",
|
||||
"KeDisconnectInterrupt",
|
||||
"KeEnterCriticalRegion",
|
||||
"MmGlobalData",
|
||||
"KeGetCurrentIrql",
|
||||
"KeGetCurrentThread",
|
||||
"KeInitializeApc",
|
||||
"KeInitializeDeviceQueue",
|
||||
"KeInitializeDpc",
|
||||
"KeInitializeEvent",
|
||||
"KeInitializeInterrupt",
|
||||
"KeInitializeMutant",
|
||||
"KeInitializeQueue",
|
||||
"KeInitializeSemaphore",
|
||||
"KeInitializeTimerEx",
|
||||
"KeInsertByKeyDeviceQueue",
|
||||
"KeInsertDeviceQueue",
|
||||
"KeInsertHeadQueue",
|
||||
"KeInsertQueue",
|
||||
"KeInsertQueueApc",
|
||||
"KeInsertQueueDpc",
|
||||
"KeInterruptTime",
|
||||
"KeIsExecutingDpc",
|
||||
"KeLeaveCriticalRegion",
|
||||
"KePulseEvent",
|
||||
"KeQueryBasePriorityThread",
|
||||
"KeQueryInterruptTime",
|
||||
"KeQueryPerformanceCounter",
|
||||
"KeQueryPerformanceFrequency",
|
||||
"KeQuerySystemTime",
|
||||
"KeRaiseIrqlToDpcLevel",
|
||||
"KeRaiseIrqlToSynchLevel",
|
||||
"KeReleaseMutant",
|
||||
"KeReleaseSemaphore",
|
||||
"KeRemoveByKeyDeviceQueue",
|
||||
"KeRemoveDeviceQueue",
|
||||
"KeRemoveEntryDeviceQueue",
|
||||
"KeRemoveQueue",
|
||||
"KeRemoveQueueDpc",
|
||||
"KeResetEvent",
|
||||
"KeRestoreFloatingPointState",
|
||||
"KeResumeThread",
|
||||
"KeRundownQueue",
|
||||
"KeSaveFloatingPointState",
|
||||
"KeSetBasePriorityThread",
|
||||
"KeSetDisableBoostThread",
|
||||
"KeSetEvent",
|
||||
"KeSetEventBoostPriority",
|
||||
"KeSetPriorityProcess",
|
||||
"KeSetPriorityThread",
|
||||
"KeSetTimer",
|
||||
"KeSetTimerEx",
|
||||
"KeStallExecutionProcessor",
|
||||
"KeSuspendThread",
|
||||
"KeSynchronizeExecution",
|
||||
"KeSystemTime",
|
||||
"KeTestAlertThread",
|
||||
"KeTickCount",
|
||||
"KeTimeIncrement",
|
||||
"KeWaitForMultipleObjects",
|
||||
"KeWaitForSingleObject",
|
||||
"KfRaiseIrql",
|
||||
"KfLowerIrql",
|
||||
"KiBugCheckData",
|
||||
"KiUnlockDispatcherDatabase",
|
||||
"LaunchDataPage",
|
||||
"MmAllocateContiguousMemory",
|
||||
"MmAllocateContiguousMemoryEx",
|
||||
"MmAllocateSystemMemory",
|
||||
"MmClaimGpuInstanceMemory",
|
||||
"MmCreateKernelStack",
|
||||
"MmDeleteKernelStack",
|
||||
"MmFreeContiguousMemory",
|
||||
"MmFreeSystemMemory",
|
||||
"MmGetPhysicalAddress",
|
||||
"MmIsAddressValid",
|
||||
"MmLockUnlockBufferPages",
|
||||
"MmLockUnlockPhysicalPage",
|
||||
"MmMapIoSpace",
|
||||
"MmPersistContiguousMemory",
|
||||
"MmQueryAddressProtect",
|
||||
"MmQueryAllocationSize",
|
||||
"MmQueryStatistics",
|
||||
"MmSetAddressProtect",
|
||||
"MmUnmapIoSpace",
|
||||
"NtAllocateVirtualMemory",
|
||||
"NtCancelTimer",
|
||||
"NtClearEvent",
|
||||
"NtClose",
|
||||
"NtCreateDirectoryObject",
|
||||
"NtCreateEvent",
|
||||
"NtCreateFile",
|
||||
"NtCreateIoCompletion",
|
||||
"NtCreateMutant",
|
||||
"NtCreateSemaphore",
|
||||
"NtCreateTimer",
|
||||
"NtDeleteFile",
|
||||
"NtDeviceIoControlFile",
|
||||
"NtDuplicateObject",
|
||||
"NtFlushBuffersFile",
|
||||
"NtFreeVirtualMemory",
|
||||
"NtFsControlFile",
|
||||
"NtOpenDirectoryObject",
|
||||
"NtOpenFile",
|
||||
"NtOpenSymbolicLinkObject",
|
||||
"NtProtectVirtualMemory",
|
||||
"NtPulseEvent",
|
||||
"NtQueueApcThread",
|
||||
"NtQueryDirectoryFile",
|
||||
"NtQueryDirectoryObject",
|
||||
"NtQueryEvent",
|
||||
"NtQueryFullAttributesFile",
|
||||
"NtQueryInformationFile",
|
||||
"NtQueryIoCompletion",
|
||||
"NtQueryMutant",
|
||||
"NtQuerySemaphore",
|
||||
"NtQuerySymbolicLinkObject",
|
||||
"NtQueryTimer",
|
||||
"NtQueryVirtualMemory",
|
||||
"NtQueryVolumeInformationFile",
|
||||
"NtReadFile",
|
||||
"NtReadFileScatter",
|
||||
"NtReleaseMutant",
|
||||
"NtReleaseSemaphore",
|
||||
"NtRemoveIoCompletion",
|
||||
"NtResumeThread",
|
||||
"NtSetEvent",
|
||||
"NtSetInformationFile",
|
||||
"NtSetIoCompletion",
|
||||
"NtSetSystemTime",
|
||||
"NtSetTimerEx",
|
||||
"NtSignalAndWaitForSingleObjectEx",
|
||||
"NtSuspendThread",
|
||||
"NtUserIoApcDispatcher",
|
||||
"NtWaitForSingleObject",
|
||||
"NtWaitForSingleObjectEx",
|
||||
"NtWaitForMultipleObjectsEx",
|
||||
"NtWriteFile",
|
||||
"NtWriteFileGather",
|
||||
"NtYieldExecution",
|
||||
"ObCreateObject",
|
||||
"ObDirectoryObjectType",
|
||||
"ObInsertObject",
|
||||
"ObMakeTemporaryObject",
|
||||
"ObOpenObjectByName",
|
||||
"ObOpenObjectByPointer",
|
||||
"ObpObjectHandleTable",
|
||||
"ObReferenceObjectByHandle",
|
||||
"ObReferenceObjectByName",
|
||||
"ObReferenceObjectByPointer",
|
||||
"ObSymbolicLinkObjectType",
|
||||
"ObfDereferenceObject",
|
||||
"ObfReferenceObject",
|
||||
"PhyGetLinkState",
|
||||
"PhyInitialize",
|
||||
"PsCreateSystemThread",
|
||||
"PsCreateSystemThreadEx",
|
||||
"PsQueryStatistics",
|
||||
"PsSetCreateThreadNotifyRoutine",
|
||||
"PsTerminateSystemThread",
|
||||
"PsThreadObjectType",
|
||||
"RtlAnsiStringToUnicodeString",
|
||||
"RtlAppendStringToString",
|
||||
"RtlAppendUnicodeStringToString",
|
||||
"RtlAppendUnicodeToString",
|
||||
"RtlAssert",
|
||||
"RtlCaptureContext",
|
||||
"RtlCaptureStackBackTrace",
|
||||
"RtlCharToInteger",
|
||||
"RtlCompareMemory",
|
||||
"RtlCompareMemoryUlong",
|
||||
"RtlCompareString",
|
||||
"RtlCompareUnicodeString",
|
||||
"RtlCopyString",
|
||||
"RtlCopyUnicodeString",
|
||||
"RtlCreateUnicodeString",
|
||||
"RtlDowncaseUnicodeChar",
|
||||
"RtlDowncaseUnicodeString",
|
||||
"RtlEnterCriticalSection",
|
||||
"RtlEnterCriticalSectionAndRegion",
|
||||
"RtlEqualString",
|
||||
"RtlEqualUnicodeString",
|
||||
"RtlExtendedIntegerMultiply",
|
||||
"RtlExtendedLargeIntegerDivide",
|
||||
"RtlExtendedMagicDivide",
|
||||
"RtlFillMemory",
|
||||
"RtlFillMemoryUlong",
|
||||
"RtlFreeAnsiString",
|
||||
"RtlFreeUnicodeString",
|
||||
"RtlGetCallersAddress",
|
||||
"RtlInitAnsiString",
|
||||
"RtlInitUnicodeString",
|
||||
"RtlInitializeCriticalSection",
|
||||
"RtlIntegerToChar",
|
||||
"RtlIntegerToUnicodeString",
|
||||
"RtlLeaveCriticalSection",
|
||||
"RtlLeaveCriticalSectionAndRegion",
|
||||
"RtlLowerChar",
|
||||
"RtlMapGenericMask",
|
||||
"RtlMoveMemory",
|
||||
"RtlMultiByteToUnicodeN",
|
||||
"RtlMultiByteToUnicodeSize",
|
||||
"RtlNtStatusToDosError",
|
||||
"RtlRaiseException",
|
||||
"RtlRaiseStatus",
|
||||
"RtlTimeFieldsToTime",
|
||||
"RtlTimeToTimeFields",
|
||||
"RtlTryEnterCriticalSection",
|
||||
"RtlUlongByteSwap",
|
||||
"RtlUnicodeStringToAnsiString",
|
||||
"RtlUnicodeStringToInteger",
|
||||
"RtlUnicodeToMultiByteN",
|
||||
"RtlUnicodeToMultiByteSize",
|
||||
"RtlUnwind",
|
||||
"RtlUpcaseUnicodeChar",
|
||||
"RtlUpcaseUnicodeString",
|
||||
"RtlUpcaseUnicodeToMultiByteN",
|
||||
"RtlUpperChar",
|
||||
"RtlUpperString",
|
||||
"RtlUshortByteSwap",
|
||||
"RtlWalkFrameChain",
|
||||
"RtlZeroMemory",
|
||||
"XboxEEPROMKey",
|
||||
"XboxHardwareInfo",
|
||||
"XboxHDKey",
|
||||
"XboxKrnlVersion",
|
||||
"XboxSignatureKey",
|
||||
"XeImageFileName",
|
||||
"XeLoadSection",
|
||||
"XeUnloadSection",
|
||||
"READ_PORT_BUFFER_UCHAR",
|
||||
"READ_PORT_BUFFER_USHORT",
|
||||
"READ_PORT_BUFFER_ULONG",
|
||||
"WRITE_PORT_BUFFER_UCHAR",
|
||||
"WRITE_PORT_BUFFER_USHORT",
|
||||
"WRITE_PORT_BUFFER_ULONG",
|
||||
"XcSHAInit",
|
||||
"XcSHAUpdate",
|
||||
"XcSHAFinal",
|
||||
"XcRC4Key",
|
||||
"XcRC4Crypt",
|
||||
"XcHMAC",
|
||||
"XcPKEncPublic",
|
||||
"XcPKDecPrivate",
|
||||
"XcPKGetKeyLen",
|
||||
"XcVerifyPKCS1Signature",
|
||||
"XcModExp",
|
||||
"XcDESKeyParity",
|
||||
"XcKeyTable",
|
||||
"XcBlockCrypt",
|
||||
"XcBlockCryptCBC",
|
||||
"XcCryptService",
|
||||
"XcUpdateCrypto",
|
||||
"RtlRip",
|
||||
"XboxLANKey",
|
||||
"XboxAlternateSignatureKeys",
|
||||
"XePublicKeyData",
|
||||
"HalBootSMCVideoMode",
|
||||
"IdexChannelObject",
|
||||
"HalIsResetOrShutdownPending",
|
||||
"IoMarkIrpMustComplete",
|
||||
"HalInitiateShutdown",
|
||||
"snprintf",
|
||||
"sprintf",
|
||||
"vsnprintf",
|
||||
"vsprintf",
|
||||
"HalEnableSecureTrayEject",
|
67
libr/bin/format/xbe/xbe.h
Normal file
67
libr/bin/format/xbe/xbe.h
Normal file
@ -0,0 +1,67 @@
|
||||
|
||||
#define XBE_MAGIC 0x48454258
|
||||
|
||||
#define XBE_EP_RETAIL 0xA8FC57AB
|
||||
#define XBE_EP_DEBUG 0x94859D4B
|
||||
|
||||
#define XBE_KP_RETAIL 0x5b6d40b6
|
||||
#define XBE_KP_DEBUG 0xefb1f152
|
||||
|
||||
#define XBE_EP_CHIHIRO 0x40B5C16E
|
||||
#define XBE_KP_CHIHIRO 0x2290059D
|
||||
|
||||
typedef struct {
|
||||
ut32 magic;
|
||||
ut8 signature[0x100];
|
||||
ut32 base;
|
||||
ut32 headers_size;
|
||||
ut32 image_size;
|
||||
ut32 image_header_size;
|
||||
ut32 timestamp;
|
||||
ut32 cert_addr;
|
||||
ut32 sections;
|
||||
ut32 sechdr_addr;
|
||||
ut32 init_flags;
|
||||
ut32 ep;
|
||||
ut32 tls_addr;
|
||||
ut32 pe_shit[7];
|
||||
ut32 debug_path_addr;
|
||||
ut32 debug_name_addr;
|
||||
ut32 debug_uname_addr;
|
||||
ut32 kernel_thunk_addr;
|
||||
ut32 nonkernel_import_dir_addr;
|
||||
ut32 lib_versions;
|
||||
ut32 lib_versions_addr;
|
||||
ut32 kernel_lib_addr;
|
||||
ut32 xapi_lib_addr;
|
||||
ut32 shit[2];
|
||||
} __attribute__((packed)) xbe_header;
|
||||
|
||||
#define SECT_FLAG_X 0x00000004
|
||||
#define SECT_FLAG_W 0x00000001
|
||||
|
||||
typedef struct {
|
||||
ut32 flags;
|
||||
ut32 vaddr;
|
||||
ut32 vsize;
|
||||
ut32 offset;
|
||||
ut32 size;
|
||||
ut32 name_addr;
|
||||
ut32 refcount;
|
||||
ut32 shit[2];
|
||||
ut8 digest[20];
|
||||
} __attribute__((packed)) xbe_section;
|
||||
|
||||
typedef struct {
|
||||
char name[8];
|
||||
ut16 major, minor, build;
|
||||
ut16 flags;
|
||||
} __attribute__((packed)) xbe_lib;
|
||||
|
||||
typedef struct {
|
||||
xbe_header *header;
|
||||
int kt_key;
|
||||
int ep_key;
|
||||
} r_bin_xbe_obj_t;
|
||||
|
||||
|
@ -10,7 +10,7 @@ foo: all
|
||||
ALL_TARGETS=
|
||||
FORMATS=any.mk elf.mk elf64.mk pe.mk pe64.mk te.mk mach0.mk
|
||||
FORMATS+=bios.mk mach064.mk fatmach0.mk dyldcache.mk java.mk
|
||||
FORMATS+=dex.mk fs.mk ningb.mk coff.mk ningba.mk
|
||||
FORMATS+=dex.mk fs.mk ningb.mk coff.mk ningba.mk xbe.mk
|
||||
include $(FORMATS)
|
||||
|
||||
all: ${ALL_TARGETS}
|
||||
|
312
libr/bin/p/bin_xbe.c
Normal file
312
libr/bin/p/bin_xbe.c
Normal file
@ -0,0 +1,312 @@
|
||||
/* radare - LGPL - 2014 - thatlemon@gmail.com */
|
||||
|
||||
#include <r_types.h>
|
||||
#include <r_util.h>
|
||||
#include <r_lib.h>
|
||||
#include <r_bin.h>
|
||||
#include <string.h>
|
||||
#include "../format/xbe/xbe.h"
|
||||
|
||||
static const char *kt_name[] = {
|
||||
#include "../format/xbe/kernel.h"
|
||||
};
|
||||
|
||||
static Sdb* get_sdb (RBinObject *o) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int check_bytes(const ut8 *buf, ut64 size)
|
||||
{
|
||||
xbe_header *header = (xbe_header *)buf;
|
||||
return (size > sizeof(xbe_header) && header->magic == XBE_MAGIC);
|
||||
}
|
||||
|
||||
static int check(RBinFile *arch)
|
||||
{
|
||||
const ut8 *bytes = arch ? r_buf_buffer (arch->buf) : NULL;
|
||||
const ut64 size = arch ? r_buf_size (arch->buf) : 0;
|
||||
|
||||
if (!arch || !arch->o)
|
||||
return R_FALSE;
|
||||
|
||||
return check_bytes(bytes, size);
|
||||
}
|
||||
|
||||
static int load(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = NULL;
|
||||
const ut8 *bytes = arch ? r_buf_buffer (arch->buf) : NULL;
|
||||
|
||||
if (!arch || !arch->o)
|
||||
return R_FALSE;
|
||||
|
||||
arch->o->bin_obj = malloc(sizeof(r_bin_plugin_xbe));
|
||||
obj = arch->o->bin_obj;
|
||||
|
||||
if (obj) {
|
||||
obj->header = (xbe_header *)bytes;
|
||||
|
||||
// Sega Chihiro xbe
|
||||
if ((obj->header->ep&0xf0000000) == 0x40000000) {
|
||||
obj->ep_key = XBE_EP_CHIHIRO;
|
||||
obj->kt_key = XBE_KP_CHIHIRO;
|
||||
}
|
||||
// Debug xbe
|
||||
else if ((obj->header->ep ^ XBE_EP_RETAIL) > 0x1000000) {
|
||||
obj->ep_key = XBE_EP_DEBUG;
|
||||
obj->kt_key = XBE_KP_DEBUG;
|
||||
}
|
||||
// Retail xbe
|
||||
else {
|
||||
obj->ep_key = XBE_EP_RETAIL;
|
||||
obj->kt_key = XBE_KP_RETAIL;
|
||||
}
|
||||
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
static int destroy(RBinFile *arch)
|
||||
{
|
||||
free(arch->o->bin_obj);
|
||||
r_buf_free (arch->buf);
|
||||
arch->buf = NULL;
|
||||
arch->o->bin_obj = NULL;
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
static RBinAddr* binsym(RBinFile *arch, int type)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
|
||||
if (!arch || !arch->buf || type != R_BIN_SYM_MAIN)
|
||||
return NULL;
|
||||
|
||||
RBinAddr *ret = R_NEW0 (RBinAddr);
|
||||
if (!ret)
|
||||
return NULL;
|
||||
|
||||
ret->vaddr = obj->header->ep ^ obj->ep_key;
|
||||
ret->paddr = ret->vaddr - obj->header->base;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static RList* entries(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
RList *ret = r_list_new ();
|
||||
RBinAddr *ptr = R_NEW(RBinAddr);
|
||||
|
||||
if (!arch || !arch->buf || !ret || !ptr)
|
||||
return NULL;
|
||||
|
||||
ret->free = free;
|
||||
|
||||
ptr->vaddr = obj->header->ep ^ obj->ep_key;
|
||||
ptr->paddr = ptr->vaddr - obj->header->base;
|
||||
|
||||
r_list_append (ret, ptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static RList* sections(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
RList *ret;
|
||||
int i;
|
||||
|
||||
if (!arch)
|
||||
return NULL;
|
||||
|
||||
ret = r_list_new();
|
||||
if (!ret )
|
||||
return NULL;
|
||||
|
||||
if (!arch->buf) {
|
||||
free (ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->free = free;
|
||||
|
||||
xbe_section sect[obj->header->sections];
|
||||
|
||||
r_buf_read_at (arch->buf, obj->header->sechdr_addr - obj->header->base, (ut8 *)sect, sizeof(sect));
|
||||
|
||||
for (i = 0; i < obj->header->sections; i++) {
|
||||
RBinSection *item = R_NEW0(RBinSection);
|
||||
char tmp[0x100];
|
||||
|
||||
r_buf_read_at (arch->buf, sect[i].name_addr - obj->header->base, (ut8 *)tmp, sizeof(tmp));
|
||||
|
||||
strncpy(item->name, tmp, sizeof(tmp));
|
||||
item->paddr = sect[i].offset;
|
||||
item->vaddr = sect[i].vaddr;
|
||||
item->size = sect[i].size;
|
||||
item->vsize = sect[i].vsize;
|
||||
|
||||
item->srwx |= 4;
|
||||
if (sect[i].flags & SECT_FLAG_X)
|
||||
item->srwx |= 1;
|
||||
if (sect[i].flags & SECT_FLAG_W)
|
||||
item->srwx |= 2;
|
||||
|
||||
r_list_append (ret, item);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static RList* libs(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
RList *ret = r_list_new();
|
||||
xbe_lib lib;
|
||||
char *s;
|
||||
int i;
|
||||
|
||||
if (!arch || !ret)
|
||||
return NULL;
|
||||
|
||||
ret->free = free;
|
||||
|
||||
r_buf_read_at (arch->buf, obj->header->kernel_lib_addr - obj->header->base, (ut8 *)&lib, sizeof(xbe_lib));
|
||||
s = r_str_newf("%s %i.%i.%i", lib.name, lib.major, lib.minor, lib.build);
|
||||
if (s) r_list_append(ret, s);
|
||||
|
||||
r_buf_read_at (arch->buf, obj->header->xapi_lib_addr - obj->header->base, (ut8 *)&lib, sizeof(xbe_lib));
|
||||
s = r_str_newf("%s %i.%i.%i", lib.name, lib.major, lib.minor, lib.build);
|
||||
if (s) r_list_append(ret, s);
|
||||
|
||||
for (i = 0; i < obj->header->lib_versions; i++)
|
||||
{
|
||||
r_buf_read_at (arch->buf, obj->header->lib_versions_addr - obj->header->base + (i * sizeof(xbe_lib)), (ut8 *)&lib, sizeof(xbe_lib));
|
||||
s = r_str_newf("%s %i.%i.%i", lib.name, lib.major, lib.minor, lib.build);
|
||||
if (s) r_list_append(ret, s);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static RList* symbols(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
RList *ret = r_list_new();
|
||||
int i, found = R_FALSE;
|
||||
ut32 thunk_addr[366];
|
||||
ut32 kt_addr = obj->header->kernel_thunk_addr ^ obj->kt_key;
|
||||
xbe_section sect;
|
||||
|
||||
if (!ret)
|
||||
return NULL;
|
||||
ret->free = free;
|
||||
|
||||
// PA -> VA translation
|
||||
for (i = 0; found == R_FALSE && i < obj->header->sections; i++) {
|
||||
r_buf_read_at (arch->buf, obj->header->sechdr_addr - obj->header->base + (sizeof(xbe_section) * i), (ut8 *)§, sizeof(sect));
|
||||
if (kt_addr >= sect.vaddr && kt_addr <= sect.vaddr + sect.vsize)
|
||||
found = R_TRUE;
|
||||
}
|
||||
|
||||
if (found == R_FALSE) {
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
r_buf_read_at (arch->buf, sect.offset + (kt_addr - sect.vaddr), (ut8 *)&thunk_addr, sizeof(thunk_addr));
|
||||
|
||||
for (i = 0; thunk_addr[i]; i++) {
|
||||
RBinSymbol *sym = R_NEW0(RBinSymbol);
|
||||
if (!sym) {
|
||||
ret->free(sym);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
snprintf(sym->name, R_BIN_SIZEOF_STRINGS, "kt.%s\n", kt_name[thunk_addr[i] ^ 0x80000000]);
|
||||
sym->vaddr = (obj->header->kernel_thunk_addr ^ obj->kt_key) + (4 * i);
|
||||
sym->paddr = sym->vaddr - obj->header->base;
|
||||
sym->size = 4;
|
||||
sym->ordinal = i;
|
||||
|
||||
r_list_append(ret, sym);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static RBinInfo* info(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
RBinInfo *ret = R_NEW (RBinInfo);
|
||||
ut8 dbg_name[256];
|
||||
|
||||
if (!ret)
|
||||
return NULL;
|
||||
|
||||
if (!arch || !arch->buf) {
|
||||
free (ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset (ret, '\0', sizeof (RBinInfo));
|
||||
r_buf_read_at (arch->buf, obj->header->debug_name_addr - obj->header->base, dbg_name, sizeof(dbg_name));
|
||||
|
||||
strncpy (ret->file, (const char*)dbg_name, R_BIN_SIZEOF_STRINGS);
|
||||
strncpy (ret->bclass, "program", R_BIN_SIZEOF_STRINGS);
|
||||
strncpy (ret->machine, "Microsoft Xbox", R_BIN_SIZEOF_STRINGS);
|
||||
strncpy (ret->os, "xbox", R_BIN_SIZEOF_STRINGS);
|
||||
strncpy (ret->type, "Microsoft Xbox executable", R_BIN_SIZEOF_STRINGS);
|
||||
strncpy (ret->arch, "x86", R_BIN_SIZEOF_STRINGS);
|
||||
ret->has_va = 1;
|
||||
ret->bits = 32;
|
||||
ret->big_endian = 0;
|
||||
ret->dbg_info = 0;
|
||||
ret->lang = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ut64 baddr(RBinFile *arch)
|
||||
{
|
||||
r_bin_xbe_obj_t *obj = arch->o->bin_obj;
|
||||
return obj->header->base;
|
||||
}
|
||||
|
||||
struct r_bin_plugin_t r_bin_plugin_xbe = {
|
||||
.name = "xbe",
|
||||
.desc = "Microsoft Xbox xbe format r_bin plugin",
|
||||
.license = "LGPL3",
|
||||
.init = NULL,
|
||||
.fini = NULL,
|
||||
.get_sdb = &get_sdb,
|
||||
.load = &load,
|
||||
.load_bytes = NULL,
|
||||
.destroy = &destroy,
|
||||
.check = &check,
|
||||
.check_bytes = &check_bytes,
|
||||
.baddr = &baddr,
|
||||
.boffset = NULL,
|
||||
.binsym = &binsym,
|
||||
.entries = &entries,
|
||||
.sections = §ions,
|
||||
.symbols = &symbols,
|
||||
.imports = NULL,
|
||||
.strings = NULL,
|
||||
.info = &info,
|
||||
.fields = NULL,
|
||||
.libs = &libs,
|
||||
.relocs = NULL,
|
||||
.dbginfo = NULL,
|
||||
.create = NULL,
|
||||
.write = NULL,
|
||||
};
|
||||
|
||||
#ifndef CORELIB
|
||||
struct r_lib_struct_t radare_plugin = {
|
||||
.type = R_LIB_TYPE_BIN,
|
||||
.data = &r_bin_plugin_xbe
|
||||
};
|
||||
#endif
|
10
libr/bin/p/xbe.mk
Normal file
10
libr/bin/p/xbe.mk
Normal file
@ -0,0 +1,10 @@
|
||||
OBJ_XBE=bin_xbe.o
|
||||
|
||||
STATIC_OBJ+=${OBJ_XBE}
|
||||
TARGET_XBE=bin_xbe.${EXT_SO}
|
||||
|
||||
ALL_TARGETS+=${TARGET_XBE}
|
||||
|
||||
${TARGET_XBE}: ${OBJ_XBE}
|
||||
${CC} $(call libname,bin_xbe) -shared ${CFLAGS} \
|
||||
-o ${TARGET_XBE} ${OBJ_XBE} ${LDFLAGS}
|
@ -463,6 +463,7 @@ extern RBinPlugin r_bin_plugin_rar;
|
||||
extern RBinPlugin r_bin_plugin_ningb;
|
||||
extern RBinPlugin r_bin_plugin_coff;
|
||||
extern RBinPlugin r_bin_plugin_ningba;
|
||||
extern RBinPlugin r_bin_plugin_xbe;
|
||||
extern RBinXtrPlugin r_bin_xtr_plugin_fatmach0;
|
||||
extern RBinXtrPlugin r_bin_xtr_plugin_dyldcache;
|
||||
|
||||
|
@ -93,6 +93,7 @@ bin.mach0
|
||||
bin.mach064
|
||||
bin.ningb
|
||||
bin.ningba
|
||||
bin.xbe
|
||||
bin_xtr.fatmach0
|
||||
bin_xtr.dyldcache
|
||||
bp.arm
|
||||
|
Loading…
Reference in New Issue
Block a user