diff --git a/backend/Dockerfile b/backend/Dockerfile index 3e3c067..6574944 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -166,3 +166,27 @@ RUN pip install /mdec-base /mdec-snowman \ && rm -rf /mdec-base /mdec-snowman CMD ["python3", "-m", "mdecsnowman"] + +# +# r2dec +# +FROM base as r2dec + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update \ + && apt-get install -qy build-essential cmake git + +RUN cd /root \ + && git clone https://github.com/radareorg/radare2 \ + && cd radare2 \ + && ./sys/install.sh \ + && r2pm init \ + && ln -sf /usr/bin/python3 /usr/bin/python \ + && r2pm -ci r2dec + +COPY common/mdec-base /mdec-base +COPY r2dec/mdec-r2dec /mdec-r2dec +RUN pip install /mdec-base /mdec-r2dec \ + && rm -rf /mdec-base /mdec-r2dec + +CMD ["python3", "-m", "mdecr2dec"] diff --git a/backend/r2dec/mdec-r2dec/mdecr2dec/__init__.py b/backend/r2dec/mdec-r2dec/mdecr2dec/__init__.py new file mode 100644 index 0000000..1645b1d --- /dev/null +++ b/backend/r2dec/mdec-r2dec/mdecr2dec/__init__.py @@ -0,0 +1 @@ +from .service import R2decService diff --git a/backend/r2dec/mdec-r2dec/mdecr2dec/__main__.py b/backend/r2dec/mdec-r2dec/mdecr2dec/__main__.py new file mode 100644 index 0000000..af6e457 --- /dev/null +++ b/backend/r2dec/mdec-r2dec/mdecr2dec/__main__.py @@ -0,0 +1,6 @@ +from mdecr2dec import R2decService +from mdecbase import mdec_main + + +if __name__ == '__main__': + mdec_main(R2decService) diff --git a/backend/r2dec/mdec-r2dec/mdecr2dec/service.py b/backend/r2dec/mdec-r2dec/mdecr2dec/service.py new file mode 100644 index 0000000..39372d7 --- /dev/null +++ b/backend/r2dec/mdec-r2dec/mdecr2dec/service.py @@ -0,0 +1,34 @@ +import traceback +import r2pipe +import subprocess + +from mdecbase import Service + +class R2decService(Service): + """ + r2dec as a service + """ + + def decompile(self, path: str) -> str: + """ + Decompile all the function in the binary located at `path`. + """ + r2 = r2pipe.open(path, flags=['-e bin.cache=true']) + r2.cmd('a'*6) + funcs = [func['name'] for func in r2.cmdj('aflj')] + + out = [] + + for func in funcs: + try: + dec = r2.cmd(f'pdd @{func}') + out.append(dec) + except: + out.append(f'/* Decompilation of {func} failed:\n{traceback.format_exc()}\n*/') + + + return '\n'.join(out) + + def version(self) -> str: + return subprocess.run(['/usr/local/bin/r2', '-v'], stdout=subprocess.PIPE).stdout.splitlines()[0].split()[1].decode('utf-8', 'ignore') + diff --git a/backend/r2dec/mdec-r2dec/setup.py b/backend/r2dec/mdec-r2dec/setup.py new file mode 100644 index 0000000..1a0e5fb --- /dev/null +++ b/backend/r2dec/mdec-r2dec/setup.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +from setuptools import setup + +__version__ = '0.0.1' + + +setup(name='mdec-r2dec', + version=__version__, + description='mdec-r2dec', + packages=['mdecr2dec'], + install_requires=['mdec-base', 'r2pipe'], + python_requires='>=3.8' + ) diff --git a/docker-compose.yml b/docker-compose.yml index cb72ea2..04ab3dc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,5 +48,10 @@ services: context: backend target: snowman + r2dec: + build: + context: backend + target: r2dec + volumes: nginx_logs: diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 5691867..588044e 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -91,5 +91,13 @@ http { proxy_redirect off; proxy_set_header X-Forwarded-For $remote_addr; } + + location ~ ^/r2dec/(.*)$ { + set $service_host http://r2dec:8000; + limit_except GET HEAD POST { deny all; } + proxy_pass $service_host/$1; + proxy_redirect off; + proxy_set_header X-Forwarded-For $remote_addr; + } } } diff --git a/frontend/www/index.html b/frontend/www/index.html index c196f7a..2ebb3af 100644 --- a/frontend/www/index.html +++ b/frontend/www/index.html @@ -138,6 +138,12 @@

mdec

Snowman +
  • + + + r2dec + +
  • @@ -153,6 +159,7 @@

    mdec

    Reko

    RetDec

    Snowman

    +

    r2dec

    @@ -166,7 +173,7 @@

    mdec