Files
sigmaker-ida/idasdk76/plugins/uunp/uunp.hpp
2021-10-31 21:20:46 +02:00

90 lines
2.0 KiB
C++

#include <idp.hpp>
#include <loader.hpp>
#define UUNP_NODE_NAME "$ uunp"
//----------------------------------------------------------------------
struct uunp_ctx_t;
DECLARE_LISTENER(dbg_listener_t, uunp_ctx_t, ctx);
struct uunp_ctx_t : public plugmod_t
{
dbg_listener_t dbg_listener = dbg_listener_t(*this);
ea_t bp_gpa = BADADDR; // address of GetProcAddress()
range_t curmod; // current module range
bool wait_box_visible = false;
range_t oep_range; // original entry point range
qstring resfile; // resource file name
ea_t an_imported_func = BADADDR; // an imported function
bool success = false;
bool is_9x = false;
ea_t bpt_ea = BADADDR; // our bpt address
// win9x.cpp
typedef std::map<ea_t, ea_t> thunks_t;
thunks_t thunks;
// resext.cpp
FILE *fr = NULL;
ea_t ResBase = 0;
uint32 ResTop = 0;
asize_t ImgSize = 0;
struct
{
union
{
wchar_t *name = nullptr;
uint16 Id;
};
uint32 len = 0;
} Names[3];
#pragma pack(push, 1)
struct rhdr_end_t
{
uint32 DataVersion;
uint16 MemoryFlags;
uint16 LanguageId;
uint32 Version;
uint32 Characteristrics;
};
union rhdr_name_t
{
struct
{
uint16 prefix; // = 0xFFFF if number entry
uint16 Id; // for number entry
};
wchar_t Name[1]; // zero terminated
};
#pragma pack()
rhdr_end_t re = { 0 };
rhdr_name_t zname = { { 0xFFFF } };
// on_event()
int stage = 0;
bool is_dll = false;
char needed_file[QMAXPATH] = "";
uunp_ctx_t();
~uunp_ctx_t();
virtual bool idaapi run(size_t) override;
ssize_t idaapi on_dbg_event(ssize_t code, va_list va);
inline void set_wait_box(const char *mesg);
inline void _hide_wait_box();
// Windows9x specific functions
void win9x_resolve_gpa_thunk();
ea_t win9x_find_thunk(ea_t ea);
void find_thunked_imports();
// Resource extractor function
void extract_resource(const char *fname);
void store(const void *Data, uint32 size);
};
extern int data_id;