Files
sigmaker-ida/idasdk76/ldr/javaldr/javaldr.cpp
2021-10-31 21:20:46 +02:00

109 lines
2.5 KiB
C++

/*
* Interactive disassembler (IDA)
* Copyright (c) 1990-98 by Ilfak Guilfanov.
* E-mail: ig@datarescue.com
*
* Java Virtual Machine pseudo-loader.
* Copyright (c) 1995-2006 by Iouri Kharon.
* E-mail: yjh@styx.cabel.net
*
* ALL RIGHTS RESERVED.
*
*/
/*
L O A D E R for Java-classFile
*/
#include "../idaldr.h"
#include "../../module/java/classfil.hpp"
#include "../../module/java/notify_codes.hpp"
//--------------------------------------------------------------------------
//
// check input file format. if recognized, then return 1
// and fill 'fileformatname'.
// otherwise return 0
//
static int idaapi accept_file(
qstring *fileformatname,
qstring *processor,
linput_t *li,
const char *)
{
uint32 magic;
uint16 min_ver, maj_ver;
if ( lread4bytes(li, &magic, 1) != 0
|| magic != MAGICNUMBER
|| lread2bytes(li, &min_ver, 1) != 0
|| lread2bytes(li, &maj_ver, 1) != 0 )
{
goto BADFMT;
}
uchar jdk;
if ( maj_ver <= JDK_MIN_MAJOR )
{
if ( maj_ver < JDK_MIN_MAJOR )
goto BADFMT;
jdk = maj_ver >= JDK_1_1_MINOR; //-V547 'maj_ver >= 3' is always true
}
else if ( maj_ver > JDK_MAX_MAJOR )
{
BADFMT:
return 0;
}
else
{
jdk = (uchar)(maj_ver - (JDK_MIN_MAJOR-1));
}
fileformatname->sprnt("JavaVM Class File (JDK 1.%u%s)",
jdk,
jdk == 3 ? "/CLDC" : "");
*processor = "java";
return f_LOADER;
}
//--------------------------------------------------------------------------
//
// load file into the database.
//
static void idaapi load_file(linput_t *li, ushort neflag, const char * /*fileformatname*/)
{
set_processor_type("java", SETPROC_LOADER);
if ( !java_module_t::load_file(li, (neflag & NEF_LOPT) != 0) )
INTERR(20047);
}
//----------------------------------------------------------------------
//
// LOADER DESCRIPTION BLOCK
//
//----------------------------------------------------------------------
loader_t LDSC =
{
IDP_INTERFACE_VERSION,
0, // loader flags
//
// check input file format. if recognized, then return 1
// and fill 'fileformatname'.
// otherwise return 0
//
accept_file,
//
// load file into the database.
//
load_file,
//
// create output file from the database.
// this function may be absent.
//
NULL,
// take care of a moved segment (fix up relocations, for example)
NULL,
NULL,
};