diff options
-rw-r--r-- | README.md | 27 | ||||
-rw-r--r-- | poetry.lock | 292 | ||||
-rw-r--r-- | pyproject.toml | 3 | ||||
-rwxr-xr-x | src/delf.py | 191 | ||||
-rw-r--r-- | test/compile_commands.json | 7 | ||||
-rw-r--r-- | test/makefile | 35 | ||||
-rw-r--r-- | test/test.c | 32 |
7 files changed, 372 insertions, 215 deletions
@@ -22,21 +22,18 @@ You can then run it with `poetry shell` or `poetry run`.<br/> ## Options -For a list of available options just run `delf -h`:<br/> +For a list of available options just run `delf --help`:<br/> ```txt -usage: delf [-h] [--dbg] [--obj OBJ] [--header] [--symboltable] [--phdrs] - [--shdrs] [--symbolindex] [--stentries] [--objcode] [--test] - [--test2] [--funcs] [--objs] [--dynsym] [--dlpath] [--phdynent] - [--section SECTION] [--dumpfunc DUMPFUNC] - [--dumpfuncasm DUMPFUNCASM] [--textasm] [--dynsecents] [--reladyn] - [--relaplt] [--rodata] [--disass DISASS] - -optional arguments: +$ delf --help +usage: delf [-h] [--dbg] [--obj OBJ] [--header] [--symboltable] [--phdrs] [--shdrs] [--symbolindex] [--stentries] [--objcode] [--test] [--test2] [--listdso] [--funcs] [--objs] [--dynsym] [--dlpath] [--phdynent] + [--section SECTION] [--dumpfunc DUMPFUNC] [--dumpfuncasm DUMPFUNCASM] [--textasm] [--dynsecents] [--reladyn] [--relaplt] [--rodata] [--disass DISASS] [--disassp DISASSP] [--got] [--gotplt] + [--noclor] + +options: -h, --help show this help message and exit --dbg debug - --obj OBJ path to the executbale, shared object or object you - want to load in bruiser + --obj OBJ path to the executbale, shared object or object you want to load in bruiser --header dump headers --symboltable dump symbol table --phdrs dump program haeders @@ -46,6 +43,7 @@ optional arguments: --objcode dump objects --test test switch --test2 test switch 2 + --listdso list DSOs --funcs dump functions --objs dump objects --dynsym dump dynamic symbol table @@ -60,8 +58,11 @@ optional arguments: --reladyn .rela.dyn entries --relaplt .rela.plt entries --rodata dump .rodata - --disass DISASS disassemblt a section - + --disass DISASS disassembls a section by name in section headers + --disassp DISASSP disassembls a section by index in program headers + --got dump .got section + --gotplt dump .got.plt section + --noclor dont use color ``` ## Example usage diff --git a/poetry.lock b/poetry.lock index 1f51b04..cdfbfa8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,37 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] name = "astroid" version = "3.2.2" description = "An abstract syntax tree for Python with inference support." @@ -94,6 +125,17 @@ files = [ ] [[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" @@ -134,6 +176,84 @@ graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] [[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." @@ -251,6 +371,29 @@ files = [ ] [[package]] +name = "openai" +version = "1.31.0" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.31.0-py3-none-any.whl", hash = "sha256:82044ee3122113f2a468a1f308a8882324d09556ba5348687c535d3655ee331c"}, + {file = "openai-1.31.0.tar.gz", hash = "sha256:54ae0625b005d6a3b895db2b8438dae1059cffff0cd262a26e9015c13a29ab06"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] name = "packaging" version = "24.0" description = "Core utilities for Python packages" @@ -300,6 +443,116 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- type = ["mypy (>=1.8)"] [[package]] +name = "pydantic" +version = "2.7.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.3-py3-none-any.whl", hash = "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"}, + {file = "pydantic-2.7.3.tar.gz", hash = "sha256:c46c76a40bb1296728d7a8b99aa73dd70a48c3510111ff290034f860c99c419e"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.4" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." @@ -458,6 +711,17 @@ testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] name = "stevedore" version = "5.2.0" description = "Manage dynamic plugins for Python applications" @@ -483,17 +747,37 @@ files = [ ] [[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.1" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"}, + {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"}, ] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "44f3792468ec77f2bcddb771ef4e0b2c764f563d303ede7e73b57f29dbd303c8" +content-hash = "d7d498122fe3199160c29d596705d07ef5f13c53082da671249ede114ca2b94f" diff --git a/pyproject.toml b/pyproject.toml index e46b8dd..6747372 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "delf" -version = "0.1.5" +version = "0.2.0" description = "yet another elf dump tool" authors = ["terminaldweller <devi@terminaldweller.com>"] license = "GPL-3.0" @@ -29,6 +29,7 @@ pylint = "^3.0.2" bandit = "^1.7.5" ruff = "^0.1.1" black = ">=23.10,<25.0" +openai = "^1.30.4" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/src/delf.py b/src/delf.py index c988098..f4b114b 100755 --- a/src/delf.py +++ b/src/delf.py @@ -19,10 +19,10 @@ # MA 02110-1301, USA.*/ # *****************************************************************************/ import argparse -import code import os import subprocess import sys +import typing from capstone import CS_ARCH_X86, CS_MODE_64, Cs @@ -30,6 +30,8 @@ from capstone import CS_ARCH_X86, CS_MODE_64, Cs class ELF_TYPE_SIZES: + """Const class that holds ELF type sizes in bytes""" + ELF32_HALF = 2 ELF64_HALF = 2 ELF32_WORD = 4 @@ -53,7 +55,7 @@ def SigHandler_SIGINT(signum, frame): sys.exit(0) -class CLIArgParser(object): +class CLIArgParser: def __init__(self): parser = argparse.ArgumentParser() parser.add_argument("--dbg", action="store_true", help="debug", default=False) @@ -194,6 +196,12 @@ class CLIArgParser(object): help="dump .got.plt section", default=False, ) + parser.add_argument( + "--nocolor", + action="store_true", + help="dont use color", + default=False, + ) self.args = parser.parse_args() if self.args.obj is None: raise Exception( @@ -273,16 +281,29 @@ class ELF_RELA: self.r_addend = r_addend -def ffs(offset, header_list, numbered, *args): +def ffs( + offset, + header_list, + numbered, + nocolor, + *args, +): # cn = Colors.green - ch = Colors.cyan - cd = Colors.blue - cb = Colors.BOLD - ci = Colors.red - ce = Colors.ENDC + if nocolor: + ch = "" + cd = "" + cb = "" + ci = "" + ce = "" + else: + ch = Colors.cyan + cd = Colors.blue + cb = Colors.BOLD + ci = Colors.red + ce = Colors.ENDC max_column_width = [] - lines = [] - numbers_f = [] + lines: typing.List[str] = [] + numbers_f: typing.List[int] = [] dummy = [] if numbered: @@ -1210,8 +1231,10 @@ class Symbol_Table_Entry64: self.st_type = st_type -class ELF(object): - def __init__(self, so): +class ELF: + """The ELF class that holds everything about the ELF file.""" + + def __init__(self, so, argparser): self.so = so self.so.seek(0, 0) self.elfhdr = ELFHDR(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) @@ -1240,6 +1263,7 @@ class ELF(object): self.plt_got_ents = [] self.got_ents = [] self.got_plt_ents = [] + self.argparser = argparser def init(self, size): self.size = size @@ -1420,7 +1444,7 @@ class ELF(object): header = ["d_tag", "d_un"] tag_list = [get_ph_dynamic_ent_tag_type(ph.d_tag) for ph in self.ph_dyn_ent] un_list = [ph.d_un for ph in self.ph_dyn_ent] - lines = ffs(2, header, True, tag_list, un_list) + lines = ffs(2, header, True, self.argparser.args.nocolor, tag_list, un_list) for line in lines: print(line) @@ -1473,7 +1497,7 @@ class ELF(object): self.dlpath = repr(obj) count = int() if dump: - strrep = [] + strrep: typing.List[str] = [] for byte in obj: if count % 16 == 0: for ch in strrep: @@ -1529,6 +1553,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocoor, name_list, size_list, value_list, @@ -1551,6 +1576,7 @@ class ELF(object): 2, header, True, + self.argparser.args.noclor, name_list, size_list, value_list, @@ -1609,6 +1635,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, mag_list, class_list, data_list, @@ -1661,6 +1688,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, type_list, flags_list, offset_list, @@ -1706,6 +1734,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, name_list, type_list, flag_list, @@ -1765,6 +1794,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, idx_list, name_list, value_list, @@ -1811,6 +1841,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, idx_list, name_list, value_list, @@ -1834,6 +1865,7 @@ class ELF(object): 2, header, True, + self.argparser.args.nocolor, tag_string_list, tag_list, value_list, @@ -1847,7 +1879,15 @@ class ELF(object): r_offset_list = [entry["r_offset"] for entry in to_dump] r_info_list = [entry["r_info"] for entry in to_dump] addend_list = [entry["r_addend"] for entry in to_dump] - lines = ffs(2, header, True, r_offset_list, r_info_list, addend_list) + lines = ffs( + 2, + header, + True, + self.argparser.args.nocolor, + r_offset_list, + r_info_list, + addend_list, + ) for line in lines: print(line) @@ -1855,7 +1895,9 @@ class ELF(object): header = ["r_offset", "r_info"] r_offset_list = [entry["r_offset"] for entry in to_dump] r_info_list = [entry["r_info"] for entry in to_dump] - lines = ffs(2, header, True, r_offset_list, r_info_list) + lines = ffs( + 2, header, True, self.argparser.args.nocolor, r_offset_list, r_info_list + ) for line in lines: print(line) @@ -2037,14 +2079,14 @@ class ELF(object): def dump_got(self): header = ["value"] value_list = [entry for entry in self.got_ents] - lines = ffs(2, header, True, value_list) + lines = ffs(2, header, True, self.argparser.args.nocolor, value_list) for line in lines: print(line) def dump_got_plt(self): header = ["value"] value_list = [entry for entry in self.got_plt_ents] - lines = ffs(2, header, True, value_list) + lines = ffs(2, header, True, self.argparser.args.nocolor, value_list) for line in lines: print(line) @@ -2074,109 +2116,11 @@ def ch_exe_to_so(path): so.close -def elf_init(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - - -def elf_get_func_names(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_symbol_string(ELF_ST_TYPE.STT_FUNC, False) - - -def elf_get_text_section(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_section(".text", False) - - -def elf_get_section(name): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_section(name, False) - - -def elf_get_rodata_section(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_section(".rodata", False) - - -# obj here means variables or what the C standard means by objects - - -def elf_get_obj_names(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_symbol_string(ELF_ST_TYPE.STT_OBJECT, False) - - -# obj here means variables or what the C standard means by objects - - -def elf_get_obj_sizes(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_obj_size(ELF_ST_TYPE.STT_OBJECT, False) - - -def elf_get_func_code(): - so = openSO_r(sys.argv[1]) - elf = ELF(so) - elf.init(64) - return elf.dump_funcs(False) - - -def elf_get_func_code_byname(): - so = openSO_r(sys.argv[1]) - arg = openSO_r(sys.argv[2]) - elf = ELF(so) - elf.init(64) - counter = 0 - # hit = False - for name in elf.dump_symbol_string(ELF_ST_TYPE.STT_FUNC, False): - if name == arg: - code = elf.dump_funcs(False)[counter] - # hit = True - counter += 1 - return code - - -class Call_Rewriter(object): - # def __init__(self, obj_code, arch, mode): - def __init__(self, obj_code): - self.obj_code = bytes(obj_code) - self.md = Cs(CS_ARCH_X86, CS_MODE_64) - # self.md = Cs(arch, mode) - - def dumpall(self): - for i in self.md.disasm(self.obj_code, 0x1): - print("0x%x:\t%s\t%s" % (i.address, i.mnemonic, i.op_str)) - - def run(self): - for i in self.md.disasm(self.obj_code, 0x1): - if i.mnemonic == "call": - print("0x%x:\t%s\t%s" % (i.address, i.mnemonic, i.op_str)) - print(i.bytes) - - -class Global_Rewriter(object): - def __init__(self): - pass - - -class Rewriter(object): - def __init__(self, path, new_name): +class Rewriter: + def __init__(self, path, new_name, argparser): so = openSO_r(path) - self.elf = ELF(so) + self.argparser = argparser + self.elf = ELF(so, argparser) self.elf.init(64) # shutil.copyfile(path, "/tmp/exe") self.magic_section_number = int() @@ -2223,9 +2167,10 @@ class Rewriter(object): def main() -> None: + """The entryp point.""" argparser = CLIArgParser() so = openSO_r(argparser.args.obj) - elf = ELF(so) + elf = ELF(so, argparser) elf.init(64) if argparser.args.header: elf.dump_header() @@ -2253,7 +2198,7 @@ def main() -> None: elif argparser.args.section: elf.dump_section(argparser.args.section, True) elif argparser.args.test2: - rewriter = Rewriter(argparser.args.obj, "new_exe") + rewriter = Rewriter(argparser.args.obj, "new_exe", argparser) new_text = bytes() rewriter.fix_section_offsets(".text", 1000, new_text) elif argparser.args.dumpfunc: @@ -2296,7 +2241,7 @@ def main() -> None: index = argparser.args.disassp # section not executable message if byte2int(elf.phdr[index].p_flags) & 0x1 != 1: - print("program header section is not " "executable but since you asked...") + print("program header section is not executable but since you asked...") header_offset = elf.phdr[index].p_offset header_size = elf.phdr[index].p_filesz elf.so.seek(byte2int(header_offset)) diff --git a/test/compile_commands.json b/test/compile_commands.json deleted file mode 100644 index ca764a6..0000000 --- a/test/compile_commands.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "command": "cc -c -fpic -O0 -g -v --debug -o test.o test.c", - "directory": "/home/bloodstalker/extra/delf/test", - "file": "/home/bloodstalker/extra/delf/test/test.c" - } -]
\ No newline at end of file diff --git a/test/makefile b/test/makefile deleted file mode 100644 index 9414f84..0000000 --- a/test/makefile +++ /dev/null @@ -1,35 +0,0 @@ - -##################################VARS################################# -CC?=gcc -CC=gcc -CC_FLAGS=-fpic -O0 -g -v --debug -#LD_FLAGS= -l bfd -LD_FLAGS= -TARGET=test -##################################RULES################################ -.DEFAULT:all - -.PHONY:all clean help - -all:$(TARGET) $(TARGET).so $(TARGET).asm - -.c.o: - $(CC) $(CC_FLAGS) -c $< -o $@ - -$(TARGET): $(TARGET).o - $(CC) $^ $(LD_FLAGS) -o $@ - -$(TARGET).asm: $(TARGET).o - objdump -r -d -M intel -S $(TARGET).o > $(TARGET).asm - -$(TARGET).so: $(TARGET).o - $(CC) $^ $(LD_FLAGS) -shared -o $@ - -clean: - rm -f *.o *~ $(TARGET) $(TARGET).so $(TARGET).asm - -help: - @echo 'all builds so and exe. all is the default.' - @echo 'clean runs clean.' - @echo 'help runs help.' - diff --git a/test/test.c b/test/test.c deleted file mode 100644 index 00f92ad..0000000 --- a/test/test.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "stdio.h" - -int myfunc1(void) {return 1;} -int myfunc2(void) {return 2;} -int myfunc3(void) {return 3;} -int myfunc4(void) {return 4;} -int myfunc5(void) {return 5;} -int myfunc6(void) {return 6;} -int add2(int a, int b) {return a + b;} -int sub2(int a, int b) {return a - b;} -double adddouble(double a, double b) {return a+b;} -double subdouble(double a, double b) {return a-b;} -double triple(double a, double b, double c) {return a+b+c;} -int quad(int a, int b, int c, int d) {return add2(a,b) + add2(c,d);} -const char* passthrough(const char* a) {return a;} -void ext_1(void) {printf("%s", "hey there sleepy-head.\n");} - -int myvar1 = 1; -int myvar2 = 2; -int myvar3 = 3; -int myvar4 = 4; - -int glob(void) {return myvar1+myvar2+myvar3+myvar4;} - -int main(int argc, char** argv) { - int sum; - sum = add2(10, 20); - printf("i live!\n"); - int res = sub2(20, 10); - ext_1(); - return quad(1,2,3,4); -} |