From 1d985b790bb705256c7c6cba5cfed124d23e4e13 Mon Sep 17 00:00:00 2001 From: rgimad Date: Wed, 20 Mar 2024 17:29:28 +0300 Subject: [PATCH] refactoring + added obj library info --- kexview | Bin 1232 -> 1716 bytes kexview.c | 99 ++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 66 insertions(+), 33 deletions(-) diff --git a/kexview b/kexview index 00e6d25b9e34a6b6aafef7820ce3b3e518a06358..e569d2d532347e5e3a5eacfda5a88a3de26ef8c8 100644 GIT binary patch literal 1716 zcmZ`(ZD?Cn7(Q9kE@qK#xK_lkgDm((vvyADN*EP;i=ydnP16a&#!Yk5M$>!az30wU zm|D_e;w7-3`okYWf9%J8`s0>?q+4-J_aQ@Jg2)hs8#AQPDgm>__dU6hn`|C9_nth@ z^Sf3LdJpn47f|ZsKD{%WAIq5 z@O?IF(#xX|veU0%WH`aZyKDScgM^vO@sHYt1snEkzKAA1rMm1K6KKei>V-P# zU)>L+ecBI-=D-?e-t<@FZ~{we6zT{13y&cGc_;q@@YO*i4q$3X1?jKI&P}jd*bKEc zv@c>1;?04xB5?>eTzLuOgeCjR{T0H}kDXgqAPRH2ky~CC&hmq7H@#56l5WcO{$9_q z0Qy=+NS}lJ}g9A(7_$q{>3Z6`%&5$hdpbby1qe+cdJm})n67Za=ZclsxJ6Yq2gbk zfqqY0f$8SJInj9tg41E=MS>nT!Eqox*KVYpAONAx_jj93yo~$Ws2|b6I|3C2sRBb> zbI^Pew`_=+u@K7Yr35Mi>qt+RWA$m-c?Onnms`OX z`~?19v&XI2-qp+e0m}?orvr`cwUZ|xN;qh9gDvjJT^{;qx9^(o`qZ&I+iMM1DCxSU zkI{sxB(scijcPfj(sU-vBIF)UXG)4Lz=P>Dqoy@|QQ;X)jgXl832QG7wPRmXPbt|< ziW-@DRpF-2B0)0CbOWNsXgKnm5hQW0=$yWsO6kln#^`W9oDY&oFhJv(4;ZLSnq1-x zlrgrb=}YuY_MVy1S;|XEahc94SrhcF1hS$li;RQO`(>6DzR*p$XE;P=-iXr)g)7~H zNd-)$utr%8>X6MObwyu_kSUF(O?3_{VL(|Z%jYyW5yy%~NZ6n-!nq(x7|J{w3%<+p zr!wq)8imD4Ec8)2Lt{uj(vKcN5s literal 1232 zcmZuw-Afcv6u*A9+Jr?YL@Bq>hYI|{AWg!;k)qbF?P@|`%({1VVx6&>JEB2|tP8sg z3;hE@fe=9ty)`0)*pg+bAwCrJ5K%C;7J*a?S=+g@Yv{HY?wP~y`!WH&*Ucsu!n6$4kC zSZ>9}%UEA3ay;@mF*mphJyR!mXS*7N4YTJK+fuL+-_1&nhJImvPqgWdqjM&F+8zBg zvCgZSqAQflFN+<3+!6~ABB}B?_rwb=KHA!2h^8onW(!SMS4{jy?E8Rl+66S>NK8x; z`-_7LrkD&RQCZljr{}0Q;MCg;C9BIqRlMo#9HO%zTC3nJKM;YU(Bu`dgXt#e*47Mn zay(W3+!aJqGQ~H<5}^0LTLb7F zu?}ZJ?}^o#1$`uzI}5Uj71#k~#u(?|f9DMEhha@|omi2bCVWMnO}v+YKJ&; z5Q6Cz7Tcm?GTOa)72f_dr@LbAWEZiILK=z-Y4aRZh0mntis{}Pe!)siLojc-HaDiO z^?}W)y~S0ex#mAi7~hq*l(*b@>G#IeW=1G#nyR&6BC$ctR7^){zriG5km7(0K~WhV z*3=Q%PyMx}D5LIH90lmrVX8RFT%<-NKOTfYH7qLuRU49+tSTUNXMWwSq;aeAd1XWj z%6_cN1B%29je@v`YC70ja82zoy%c$vq%nNP@7JiVx8VBGn$c3!!H4z8Hz}wL>>Fbg zlx{ktYGe2^y3#{55YZB&;Wh90Fg9lh%%ToS7qmVvWUzX8j<&+2e(U1%60~2 iUw^IYyN-r6Sz!UBGfn9q8b #include #include +#include #include #define SIGNATURE_SIZE 8 typedef struct { char signature[SIGNATURE_SIZE]; - uint32_t startAddress; - uint32_t fileSize; - uint32_t memRequired; - uint32_t espValue; - uint32_t paramAddress; - uint32_t filePathAddress; - uint32_t tlsDataAddress; // Only for MENUET02 signature -} ExecutableHeader; + uint32_t start_address; + uint32_t file_size; + uint32_t memory_required; + uint32_t esp_value; + uint32_t param_address; + uint32_t file_path_address; + uint32_t tls_data_address; // This field is only for MENUET02 signature +} menuet_header_t; -int main(int argc, char *argv[]) { - if (argc < 2) { - printf("Error: Path to executable file not provided.\n"); - return 1; - } - - ksys_ufile_t file = _ksys_load_file(argv[1]); +void show_menuet_xx(const char *fpath) { + ksys_ufile_t file = _ksys_load_file(fpath); if (file.data == NULL) { - printf("Error: Unable to open file.\n"); - return 1; + printf("Error: Unable to open file."); + return; } - - ExecutableHeader header; - - if (file.size < sizeof(ExecutableHeader)) { - printf("Error: Unable to read header information.\n"); - return 1; + menuet_header_t header; + if (file.size < sizeof(menuet_header_t)) { + printf("Error: Unable to read header information."); + return; } else { - memcpy(&header, file.data, sizeof(ExecutableHeader)); + memcpy(&header, file.data, sizeof(menuet_header_t)); } if (strncmp(header.signature, "MENUET01", SIGNATURE_SIZE) != 0 && strncmp(header.signature, "MENUET02", SIGNATURE_SIZE) != 0) { printf("Error: Invalid signature.\n"); - return 1; + return; } - printf("Version: %.*s\n", SIGNATURE_SIZE, header.signature); - printf("Start Address: 0x%x\n", header.startAddress); - printf("File Size: %u bytes\n", header.fileSize); - printf("Memory Required: %u bytes\n", header.memRequired); - printf("ESP Value: 0x%x\n", header.espValue); - printf("Parameter Address: 0x%x\n", header.paramAddress); - printf("File Path Address: 0x%x\n", header.filePathAddress); + printf("Start Address: 0x%x\n", header.start_address); + printf("File Size: %u bytes\n", header.file_size); + printf("Memory Required: %u bytes\n", header.memory_required); + printf("ESP Value: 0x%x\n", header.esp_value); + printf("Parameter Address: 0x%x\n", header.param_address); + printf("File Path Address: 0x%x\n", header.file_path_address); if (strncmp(header.signature, "MENUET02", SIGNATURE_SIZE) == 0) { - printf("TLS Data Address: 0x%x\n", header.tlsDataAddress); + printf("TLS Data Address: 0x%x\n", header.tls_data_address); + } +} + +void show_library(const char *fpath) { + ksys_dll_t *table = _ksys_dlopen(fpath); + if (table == NULL) { + printf("Failed to load library."); + return; + } + size_t i = 0; + for (;;) { + char *func_name = (table + i)->func_name; + void *func_ptr = (table + i)->func_ptr; + if (func_name == NULL) { + if (i == 0) { + printf("No functions in export table."); + } + return; + } else { + printf("%s %p\n", func_name, func_ptr); + } + i++; + } +} + + +int main(int argc, char *argv[]) { + if (argc < 2) { + printf("Usage:\nkexview - view info about kex program\nkexview -l - view info about obj library"); + return; + } + + if (strcmp(argv[1], "-l") == 0) { + if (argc < 3) { + printf("Error: library expected after -l"); + return; + } + show_library(argv[2]); + } else { + show_menuet_xx(argv[1]); } return 0;