
पायथन में रिवर्स इंजीनियरिंग फ्रेमवर्क
Miasm एक मुफ्त और ओपन सोर्स (GPLv2) रिवर्स इंजीनियरिंग फ्रेमवर्क है। Miasm का उद्देश्य बाइनरी प्रोग्रामों का विश्लेषण / संशोधन / निर्माण करना है। यहाँ विशेषताओं की एक गैर-विस्तृत सूची दी गई है:
अधिक उदाहरणों और डेमो के लिए आधिकारिक ब्लॉग देखें।
Miasm x86 आर्किटेक्चर आयात करें:```pycon
from miasm.arch.x86.arch import mn_x86 from miasm.core.locationdb import LocationDB
एक स्थान db प्राप्त करें:```pycon
>>> loc_db = LocationDB()
एक पंक्ति इकट्ठा करें:```pycon
l = mn_x86.fromstring('XOR ECX, ECX', loc_db, 32) print(l) XOR ECX, ECX mn_x86.asm(l) ['1\xc9', '3\xc9', 'g1\xc9', 'g3\xc9']
एक ऑपरेंड संशोधित करें:```pycon
>>> l.args[0] = mn_x86.regs.EAX
>>> print(l)
XOR EAX, ECX
>>> a = mn_x86.asm(l)
>>> print(a)
['1\xc8', '3\xc1', 'g1\xc8', 'g3\xc1']
परिणाम को अलग करें:```pycon
print(mn_x86.dis(a[0], 32)) XOR EAX, ECX
`Machine` एब्स्ट्रैक्शन का उपयोग करना:```pycon
>>> from miasm.analysis.machine import Machine
>>> mn = Machine('x86_32').mn
>>> print(mn.dis('\x33\x30', 32))
XOR ESI, DWORD PTR [EAX]
MIPS के लिए:```pycon
mn = Machine('mips32b').mn print(mn.dis(b'\x97\xa3\x00 ', "b")) LHU V1, 0x20(SP)
मध्यवर्ती प्रतिनिधित्व
---------------------------
एक निर्देश बनाएँ:```pycon
>>> machine = Machine('arml')
>>> instr = machine.mn.dis('\x00 \x88\xe0', 'l')
>>> print(instr)
ADD R2, R8, R0
एक मध्यवर्ती प्रतिनिधित्व ऑब्जेक्ट बनाएँ:```pycon
lifter = machine.lifter_model_call(loc_db)
एक खाली ircfg बनाएँ:```pycon
>>> ircfg = lifter.new_ircfg()
पूल में निर्देश जोड़ें:```pycon
lifter.add_instr_to_ircfg(instr, ircfg)
वर्तमान पूल प्रिंट करें:```pycon
>>> for lbl, irblock in ircfg.blocks.items():
... print(irblock)
loc_0:
R2 = R8 + R0
IRDst = loc_4
IR के साथ काम करना, उदाहरण के लिए दुष्प्रभाव प्राप्त करना:```pycon
for lbl, irblock in ircfg.blocks.items(): ... for assignblk in irblock: ... rw = assignblk.get_rw() ... for dst, reads in rw.items(): ... print('read: ', [str(x) for x in reads]) ... print('written:', dst) ... print() ... read: ['R8', 'R0'] written: R2
read: [] written: IRDst
अधिक जानकारी Miasm IR पर [संबंधित Jupyter Notebook](https://github.com/cea-sec/miasm/blob/master/doc/expression/expression.ipynb) में है।
अनुकरण
---------
एक शेलकोड दिया गया:```pycon
00000000 8d4904 lea ecx, [ecx+0x4]
00000003 8d5b01 lea ebx, [ebx+0x1]
00000006 80f901 cmp cl, 0x1
00000009 7405 jz 0x10
0000000b 8d5bff lea ebx, [ebx-1]
0000000e eb03 jmp 0x13
00000010 8d5b01 lea ebx, [ebx+0x1]
00000013 89d8 mov eax, ebx
00000015 c3 ret
>>> s = b'\x8dI\x04\x8d[\x01\x80\xf9\x01t\x05\x8d[\xff\xeb\x03\x8d[\x01\x89\xd8\xc3'
शेलकोड को Container एब्स्ट्रैक्शन के माध्यम से आयात करें:```pycon
from miasm.analysis.binary import Container c = Container.from_string(s, loc_db) c <miasm.analysis.binary.ContainerUnknown object at 0x7f34cefe6090>
पते `0` पर शेलकोड को डिसअसेंबल करना:```pycon
>>> from miasm.analysis.machine import Machine
>>> machine = Machine('x86_32')
>>> mdis = machine.dis_engine(c.bin_stream, loc_db=loc_db)
>>> asmcfg = mdis.dis_multiblock(0)
>>> for block in asmcfg.blocks:
... print(block)
...
loc_0
LEA ECX, DWORD PTR [ECX + 0x4]
LEA EBX, DWORD PTR [EBX + 0x1]
CMP CL, 0x1
JZ loc_10
-> c_next:loc_b c_to:loc_10
loc_10
LEA EBX, DWORD PTR [EBX + 0x1]
-> c_next:loc_13
loc_b
LEA EBX, DWORD PTR [EBX + 0xFFFFFFFF]
JMP loc_13
-> c_to:loc_13
loc_13
MOV EAX, EBX
RET
JIT इंजन को एक स्टैक के साथ आरंभ करना:```pycon
jitter = machine.jitter(loc_db, jit_type='python') jitter.init_stack()
शेलकोड को एक मनमाना मेमोरी स्थान पर जोड़ें:```pycon
>>> run_addr = 0x40000000
>>> from miasm.jitter.csts import PAGE_READ, PAGE_WRITE
>>> jitter.vm.add_memory_page(run_addr, PAGE_READ | PAGE_WRITE, s)
शेलकोड की वापसी को पकड़ने के लिए एक sentinelle बनाएँ:```Python def code_sentinelle(jitter): jitter.running = False jitter.pc = 0 return True
jitter.add_breakpoint(0x1337beef, code_sentinelle) jitter.push_uint32_t(0x1337beef)
सक्रिय लॉग:```pycon
>>> jitter.set_trace_log()
किसी भी पते पर चलाएँ:```pycon
jitter.init_run(run_addr) jitter.continue_run() RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000000 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000000 40000000 LEA ECX, DWORD PTR [ECX+0x4] RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 .... 4000000e JMP loc_0000000040000013:0x40000013 RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000013 MOV EAX, EBX RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000015 RET
जिटर के साथ बातचीत:```pycon
>>> jitter.vm
ad 1230000 size 10000 RW_ hpad 0x2854b40
ad 40000000 size 16 RW_ hpad 0x25e0ed0
>>> hex(jitter.cpu.EAX)
'0x0L'
>>> jitter.cpu.ESI = 12
IR पूल को प्रारंभ करना:```pycon
lifter = machine.lifter_model_call(loc_db) ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)
इंजन को डिफ़ॉल्ट प्रतीकात्मक मानों के साथ आरंभ करना:```pycon
>>> from miasm.ir.symbexec import SymbolicExecutionEngine
>>> sb = SymbolicExecutionEngine(lifter)
प्रारंभ करना:```pycon
symbolic_pc = sb.run_at(ircfg, 0) print(symbolic_pc) ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
वही, चरण लॉग के साथ (केवल परिवर्तन प्रदर्शित होते हैं):```pycon
>>> sb = SymbolicExecutionEngine(lifter, machine.mn.regs.regs_init)
>>> symbolic_pc = sb.run_at(ircfg, 0, step=True)
Instr LEA ECX, DWORD PTR [ECX + 0x4]
Assignblk:
ECX = ECX + 0x4
________________________________________________________________________________
ECX = ECX + 0x4
________________________________________________________________________________
Instr LEA EBX, DWORD PTR [EBX + 0x1]
Assignblk:
EBX = EBX + 0x1
________________________________________________________________________________
EBX = EBX + 0x1
ECX = ECX + 0x4
________________________________________________________________________________
Instr CMP CL, 0x1
Assignblk:
zf = (ECX[0:8] + -0x1)?(0x0,0x1)
nf = (ECX[0:8] + -0x1)[7:8]
pf = parity((ECX[0:8] + -0x1) & 0xFF)
of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8]
cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8]
af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]
________________________________________________________________________________
af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
pf = parity((ECX + 0x4)[0:8] + 0xFF)
zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX = ECX + 0x4
of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX = EBX + 0x1
________________________________________________________________________________
Instr JZ loc_key_1
Assignblk:
IRDst = zf?(loc_key_1,loc_key_2)
EIP = zf?(loc_key_1,loc_key_2)
________________________________________________________________________________
af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
pf = parity((ECX + 0x4)[0:8] + 0xFF)
IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX = ECX + 0x4
of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX = EBX + 0x1
________________________________________________________________________________
>>>
एक ठोस ECX के साथ पुनः निष्पादन का प्रयास करें। यहाँ, symbolic / concolic निष्पादन शेलकोड के अंत तक पहुँचता है:```pycon
from miasm.expression.expression import ExprInt sb.symbols[machine.mn.regs.ECX] = ExprInt(-3, 32) symbolic_pc = sb.run_at(ircfg, 0, step=True) Instr LEA ECX, DWORD PTR [ECX + 0x4] Assignblk: ECX = ECX + 0x4
af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x1
Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1
af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x2
Instr CMP CL, 0x1 Assignblk: zf = (ECX[0:8] + -0x1)?(0x0,0x1) nf = (ECX[0:8] + -0x1)[7:8] pf = parity((ECX[0:8] + -0x1) & 0xFF) of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8] cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8] af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]
af = 0x0 EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = 0x1 IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2
Instr JZ loc_key_1 Assignblk: IRDst = zf?(loc_key_1,loc_key_2) EIP = zf?(loc_key_1,loc_key_2)
af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2
Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1
af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3
Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: IRDst = loc_key_3
af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3
Instr MOV EAX, EBX Assignblk: EAX = EBX
af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 EAX = EBX + 0x3
Instr RET Assignblk: IRDst = @32[ESP[0:32]] ESP = {ESP[0:32] + 0x4 0 32} EIP = @32[ESP[0:32]]
af = 0x0 EIP = @32[ESP] pf = 0x1 IRDst = @32[ESP] zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 ESP = ESP + 0x4 EAX = EBX + 0x3
यह कैसे काम करता है?
=================
Miasm अपने स्वयं के डिस्सेम्बलर, मध्यवर्ती भाषा और निर्देश शब्दार्थ को एम्बेड करता है। यह Python में लिखा गया है।
कोड को अनुकरण करने के लिए, यह मध्यवर्ती प्रतिनिधित्व को JIT करने के लिए LLVM, GCC, Clang या Python का उपयोग करता है। यह शेलकोड और बाइनरी के सभी या भागों का अनुकरण कर सकता है। निष्पादन के साथ बातचीत करने के लिए Python कॉलबैक निष्पादित किए जा सकते हैं, उदाहरण के लिए लाइब्रेरी फ़ंक्शंस के प्रभावों का अनुकरण करने के लिए।
दस्तावेज़ीकरण
=============
कुछ दस्तावेज़ीकरण संसाधन [doc](https://github.com/cea-sec/miasm/blob/master/doc) फ़ोल्डर में उपलब्ध हैं।
एक स्वतः-निर्मित दस्तावेज़ीकरण उपलब्ध है:
* [Doxygen](http://miasm.re/miasm_doxygen)
* [pdoc](http://miasm.re/miasm_pdoc)
Miasm प्राप्त करना
===============
* रिपॉजिटरी क्लोन करें: [Miasm on GitHub](https://github.com/cea-sec/miasm/)
* [Docker Hub](https://registry.hub.docker.com/u/miasm/) पर एक Docker इमेज प्राप्त करें
सॉफ़्टवेयर आवश्यकताएँ
---------------------
Miasm उपयोग करता है:
* python-pyparsing
* python-dev
* वैकल्पिक रूप से python-pycparser (version >= 2.17)
कोड JIT को सक्षम करने के लिए, निम्नलिखित मॉड्यूल में से एक अनिवार्य है:
* GCC
* Clang
* LLVM with Numba llvmlite, नीचे देखें
'optional' Miasm का भी उपयोग कर सकता है:
* Z3, [प्रमेय सिद्धकर्ता](https://github.com/Z3Prover/z3)
कॉन्फ़िगरेशन
-------------
जिटर का उपयोग करने के लिए, GCC या LLVM अनुशंसित है
* GCC (कोई भी संस्करण)
* Clang (कोई भी संस्करण)
* LLVM
* Debian (testing/unstable): परीक्षण नहीं किया गया
* Debian stable/Ubuntu/Kali/whatever: `pip install llvmlite` या [llvmlite](https://github.com/numba/llvmlite) से इंस्टॉल करें
* Windows: परीक्षण नहीं किया गया
* Miasm बनाएँ और इंस्टॉल करें:```pycon
$ cd miasm_directory
$ python setup.py build
$ sudo python setup.py install
यदि किसी jitter मॉड्यूल के संकलन के दौरान कुछ गलत हो जाता है, तो Miasm त्रुटि को छोड़ देगा और संबंधित मॉड्यूल को अक्षम कर देगा (संकलन आउटपुट देखें)।
Miasm के अधिकांश IDA प्लगइन्स Miasm कार्यक्षमता के एक उपसमूच्च का उपयोग करते हैं। उन्हें काम करने का एक त्वरित तरीका है जोड़ना:
pyparsing.py को C:\...\IDA\python\ या pip install pyparsingmiasm/miasm निर्देशिका को C:\...\IDA\python\JITter से संबंधित को छोड़कर सभी सुविधाएँ उपलब्ध होंगी। अधिक पूर्ण स्थापना के लिए, कृपया ऊपर दिए गए पैराग्राफ देखें।
Miasm के साथ प्रतिगमन परीक्षणों का एक सेट आता है। उन सभी को चलाने के लिए:```pycon cd miasm_directory/test
python test_all.py
python -m unittest test_all.py # sequential, requires 'unittest' python -m pytest test_all.py # sequential, requires 'pytest' python -m pytest -n auto test_all.py # parallel, requires 'pytest' and 'pytest-xdist'
कुछ विकल्प निर्दिष्ट किए जा सकते हैं:
* मोनो थ्रेडिंग: `-m`
* कोड कवरेज इंस्ट्रुमेंटेशन: `-c`
* केवल तेज़ परीक्षण: `-t long` (लंबे परीक्षणों को बाहर करता है)
वे पहले से ही Miasm का उपयोग करते हैं
======================
उपकरण
-----
* [Sibyl](https://github.com/cea-sec/Sibyl): एक फंक्शन डिविनेशन टूल
* [R2M2](https://github.com/guedou/r2m2): radare2 प्लगइन के रूप में miasm का उपयोग करें
* [CGrex](https://github.com/mechaphish/cgrex): CGC बाइनरी के लिए लक्षित पैचर
* [ethRE](https://github.com/jbcayrou/ethRE): Ethereum EVM के लिए रिवर्सिंग टूल (संबंधित Miasm2 आर्किटेक्चर के साथ)
ब्लॉग पोस्ट / पेपर / सम्मेलन
---------------------------------
* [Deobfuscation: recovering an OLLVM-protected program](http://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html)
* [Taming a Wild Nanomite-protected MIPS Binary With Symbolic Execution: No Such Crackme](https://doar-e.github.io/blog/2014/10/11/taiming-a-wild-nanomite-protected-mips-binary-with-symbolic-execution-no-such-crackme/)
* [Génération rapide de DGA avec Miasm](https://www.lexsi.com/securityhub/generation-rapide-de-dga-avec-miasm/): DGA की त्वरित गणना (फ्रेंच लेख)
* [Enabling Client-Side Crash-Resistance to Overcome Diversification and Information Hiding](https://www.internetsociety.org/sites/default/files/blogs-media/enabling-client-side-crash-resistance-overcome-diversification-information-hiding.pdf): अदिश कॉल संभावित तर्कों का पता लगाएं
* [Miasm: Framework de reverse engineering](https://www.sstic.org/2012/presentation/miasm_framework_de_reverse_engineering/) (फ्रेंच)
* [Tutorial miasm](https://www.sstic.org/2014/presentation/Tutorial_miasm/) (फ्रेंच वीडियो)
* [Graphes de dépendances : Petit Poucet style](https://www.sstic.org/2016/presentation/graphes_de_dpendances__petit_poucet_style/): DepGraph (फ्रेंच)
पुस्तकें
-----
* [Practical Reverse Engineering: X86, X64, Arm, Windows Kernel, Reversing Tools, and Obfuscation](http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1118787315,subjectCd-CSJ0.html): Miasm का परिचय (अध्याय 5 "अस्पष्टता")
* [BlackHat Python - Appendix](https://github.com/oreilly-japan/black-hat-python-jp-support/tree/master/appendix-A): जापान सुरक्षा पुस्तक के नमूने