From c0a4639643affa64254706ecd64e814866d3dc81 Mon Sep 17 00:00:00 2001 From: Horde Nicolas Date: Sat, 3 Jul 2021 15:29:13 +0200 Subject: [PATCH] Premiers fichiers --- Dockerfile | 46 ++++++++++++++++++++++++ Makefile | 21 +++++++++++ README.md | 3 ++ test | Bin 0 -> 22000 bytes test.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 173 insertions(+) create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100755 test create mode 100644 test.cpp diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ca01d45 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +FROM alpine:3.12.0 + +ENV UNICORN_VER 1.0.3 +ENV CAPSTONE_VER 4.0.2 +ENV KEYSTONE_VER 0.9.2 + +RUN echo "http://alpine.42.fr/v3.12/main" > /etc/apk/repositories +RUN echo "http://alpine.42.fr/v3.12/community" >> /etc/apk/repositories +RUN apk --no-cache update +RUN apk --no-cache upgrade +RUN apk --no-cache add bash util-linux coreutils curl make cmake gcc g++ libstdc++ libgcc zlib-dev \ + git sed tar wget gzip indent binutils hexdump dos2unix xxd autoconf automake autoconf-archive\ + libtool linux-headers ncurses-dev +WORKDIR /usr/src/ +RUN git clone git://github.com/gansm/finalcut.git +WORKDIR /usr/src/finalcut +RUN autoreconf --install --force && ./configure --prefix=/usr && make && make install + +WORKDIR /usr/src +RUN wget https://github.com/unicorn-engine/unicorn/archive/${UNICORN_VER}.tar.gz && tar -xzf ${UNICORN_VER}.tar.gz +WORKDIR /usr/src/unicorn-${UNICORN_VER} +RUN UNICORN_ARCHS="x86" ./make.sh && UNICORN_ARCHS="x86" ./make.sh install + +RUN apk --no-cache add python3-dev + +WORKDIR /usr/src +RUN wget https://github.com/keystone-engine/keystone/archive/${KEYSTONE_VER}.tar.gz && tar -xzf ${KEYSTONE_VER}.tar.gz +RUN ls +WORKDIR /usr/src/keystone-${KEYSTONE_VER} +RUN mkdir build +WORKDIR /usr/src/keystone-${KEYSTONE_VER}/build +RUN cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DLLVM_TARGETS_TO_BUILD="X86" -G "Unix Makefiles" .. +RUN make -j8 +RUN make install + +WORKDIR /usr/src +RUN wget https://github.com/aquynh/capstone/archive/${CAPSTONE_VER}.tar.gz && tar -xzf ${CAPSTONE_VER}.tar.gz +WORKDIR /usr/src/capstone-${CAPSTONE_VER} +RUN CAPSTONE_ARCHS="x86" CAPTONE_X86_REDUCE="yes" ./make.sh && CAPSTONE_ARCHS="x86" CAPTONE_X86_REDUCE="yes" ./make.sh install + +RUN adduser -D -H -u 502 utilisateur +RUN adduser -D -H -u 1000 utilisateurs +RUN mkdir /data +WORKDIR /data + +ENV LD_LIBRARY_PATH /usr/lib64 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..57c187c --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +CC=g++ -O2 +LFLAGS=-lfinal -lkeystone -lstdc++ -lm -lcapstone -lunicorn +DOCKER=docker run -it --name maker --rm -v $$(pwd):/data maker + +all: dockerfile files run + +dockerfile: + docker build . -t maker + +files: ./test + +test: ./test.cpp + $(DOCKER) $(CC) -o $@ $^ $(LFLAGS) + +run: + $(DOCKER) ./test + +rerun: delete files run + +delete: + rm -rf ./test diff --git a/README.md b/README.md new file mode 100644 index 0000000..1baf274 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# IA86, The even more pedagogical system + +Logiciel pour apprendre à utiliser l'assembleur diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..9833885537f8108972b1214b2db1a5c737a1174b GIT binary patch literal 22000 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 literal 0 HcmV?d00001 diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000..0284b57 --- /dev/null +++ b/test.cpp @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include + +#define CODE "INC cx; DEC dx" + +#define ADDRESS 0x1000 + +int main (int argc, char* argv[]) +{ + ks_engine *ks; + ks_err err; + size_t count; + unsigned char *encode; + size_t sizecode; + + err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks); + if (err != KS_ERR_OK) { + printf("ERROR: failed on ks_open(), quit\n"); + return -1; + } + + if (ks_asm(ks, CODE, 0, &encode, &sizecode, &count) != KS_ERR_OK) { + printf("ERROR: ks_asm() failed & count = %lu, error = %u\n", + count, ks_errno(ks)); + } else { + size_t i; + + printf("%s = ", CODE); + for (i = 0; i < sizecode; i++) { + printf("%02x ", encode[i]); + } + printf("\n"); + printf("Compiled: %lu bytes, statements: %lu\n", sizecode, count); + } + ks_free(encode); + ks_close(ks); + csh handle; + cs_insn *insn; + + if (cs_open(CS_ARCH_X86, CS_MODE_16, &handle) != CS_ERR_OK) + return -1; + count = cs_disasm(handle, encode, sizecode, ADDRESS, 0, &insn); + if (count > 0) { + size_t j; + for (j = 0; j < count; j++) { + printf("0x%"PRIx64":\t%s\t\t%s\n", insn[j].address, insn[j].mnemonic, + insn[j].op_str); + } + + cs_free(insn, count); + } else + printf("ERROR: Failed to disassemble given code!\n"); + + cs_close(&handle); + +uc_engine *uc; + uc_err error; + int r_cx = 0x1234; + int r_dx = 0x7890; + int r_ip = 0x0000; + printf("Emulate i386 code\n"); + error = uc_open(UC_ARCH_X86, UC_MODE_16, &uc); + if (error != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", error); + return -1; + } + uc_mem_map(uc, ADDRESS, 1 * 1024 * 1024, UC_PROT_ALL); + if (uc_mem_write(uc, ADDRESS, encode, sizecode)) { + printf("Failed to write emulation code to memory, quit!\n"); + return -1; + } + uc_reg_write(uc, UC_X86_REG_CX, &r_cx); + uc_reg_write(uc, UC_X86_REG_DX, &r_dx); + uc_reg_read(uc, UC_X86_REG_IP, &r_ip); + printf(">>> CX = 0x%x\n", r_cx); + printf(">>> DX = 0x%x\n", r_dx); + printf(">>> IP = 0x%x\n", r_ip); + error=uc_emu_start(uc, ADDRESS, ADDRESS + sizecode, 0, 0); + if (error) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + error, uc_strerror(error)); + } + printf("Emulation done. Below is the CPU context\n"); + uc_reg_read(uc, UC_X86_REG_CX, &r_cx); + uc_reg_read(uc, UC_X86_REG_DX, &r_dx); + uc_reg_read(uc, UC_X86_REG_IP, &r_ip); + printf(">>> CX = 0x%x\n", r_cx); + printf(">>> DX = 0x%x\n", r_dx); + printf(">>> IP = 0x%x\n", r_ip); + uc_close(uc); + finalcut::FApplication app(argc, argv); + finalcut::FDialog dialog(&app); + dialog.setText ("A dialog"); + const finalcut::FPoint position{25, 5}; + const finalcut::FSize size{30, 10}; + dialog.setGeometry (position, size); + finalcut::FWidget::setMainWidget(&dialog); + dialog.show(); + return app.exec(); +}