예제 #1
0
def test_assembler():
    CheckInstr(Add)('RAX', 'RSP')
    CheckInstr(Add)('RAX', mem('[RCX]'))
    CheckInstr(Add)('RAX', mem('[RDI + 0x10]'))
    CheckInstr(Add)('RAX', mem('[RSI + 0x7fffffff]'))
    CheckInstr(Add)('RAX', mem('[RSI + -0x1]'))
    CheckInstr(Add)('RAX', mem('[0x10]'))
    CheckInstr(Add)('RAX', mem('fs:[0x10]'))
    CheckInstr(Add)('RAX', mem('[RSI + RDI * 2]'))
    CheckInstr(Add)('RAX', mem('[RSI + RDI * 2 + 0x10]'))
    CheckInstr(Add)('RAX', mem('gs:[RSI + RDI * 2 + 0x10]'))
    CheckInstr(Add)('RAX', mem('[R15 * 8 + 0x10]'))
    CheckInstr(Add)('RAX', mem('[R9 + R8 * 2 + 0x7fffffff]'))
    CheckInstr(Add)('RAX', mem('[R9 + R8 * 2 + -0x80000000]'))
    CheckInstr(Add)('RAX', mem('[-1]'))
    CheckInstr(Add)('RAX', mem('[0x7fffffff]'))
    CheckInstr(Add)('RAX', -1)


    CheckInstr(Sub)('RCX', 'RSP')
    CheckInstr(Sub)('RCX', mem('[RSP]'))

    CheckInstr(Xor)('R15', mem('[RAX + R8 * 2 + 0x11223344]'))
    CheckInstr(Xor)('RAX', 'RAX')
    CheckInstr(Cmp)('RAX', -1)
    #CheckInstr(Cmp, immediat_accepted=-1)('RAX', 0xffffffff)
    CheckInstr(Lea)('RAX', mem('[RAX + 1]'))
    CheckInstr(Lea)('RAX', mem('fs:[RAX + 1]'))
    CheckInstr(Mov)('RAX', mem('[0x1122334455667788]'))
    CheckInstr(Mov)('RAX', mem('gs:[0x1122334455667788]'))
    CheckInstr(Mov)('RAX', mem('gs:[0x60]'))
    CheckInstr(Mov)('RCX', 0x1122334455667788)
    CheckInstr(Mov)('RCX', -1)
    CheckInstr(Mov)('RCX', -0x1000)
    CheckInstr(Mov)('RCX', 0xffffffff)
    CheckInstr(Mov)('RAX', 0xffffffff)
    CheckInstr(Mov)('R8', 0x1122334455667788)
    CheckInstr(Mov)('RCX', -1)
    CheckInstr(Mov, immediat_accepted=-1)('RCX', 0xffffffffffffffff)
    CheckInstr(Mov)(mem('gs:[0x1122334455667788]'), 'RAX')
    CheckInstr(Mov)(mem('[RAX]'), 0x11223344)
    CheckInstr(Mov)(mem('[EAX]'), 0x11223344)
    CheckInstr(Mov)(mem('[RBX]'), 0x11223344)
    CheckInstr(Mov)("R12", mem("[RAX]"))
    CheckInstr(Mov)("RAX", mem("[R12]"))
    CheckInstr(Mov)("RAX", mem("[RAX + R12]"))
    CheckInstr(Mov)("RAX", mem("[R12 + R12]"))
    CheckInstr(Mov)("RAX", mem("[R12 + R15]"))

    CheckInstr(Mov)("RAX", mem("[R10]"))
    CheckInstr(Mov)("RAX", mem("[R11]"))
    CheckInstr(Mov)("RAX", mem("[R12]"))
    CheckInstr(Mov)("RAX", mem("[R13]"))
    CheckInstr(Mov)("RAX", mem("[R14]"))
    CheckInstr(Mov)("RAX", mem("[R15]"))

    #CheckInstr(Mov)("RSI", mem("[R12]"))

    CheckInstr(And)('RCX', 'RBX')
    CheckInstr(And)('RAX', 0x11223344)
    CheckInstr(And)('EAX', 0x11223344)
    CheckInstr(And)('EAX', 0xffffffff)
    CheckInstr(And)('RAX', mem('[RAX + 1]'))
    CheckInstr(And)(mem('[RAX + 1]'), 'R8')
    CheckInstr(And)(mem('[EAX + 1]'), 'R8')
    CheckInstr(And)(mem('[RAX + 1]'), 'EAX')

    CheckInstr(Or)('RCX', 'RBX')
    CheckInstr(Or)('RAX', 0x11223344)
    CheckInstr(Or)('RAX', mem('[RAX + 1]'))
    CheckInstr(Or)(mem('[RAX + 1]'), 'R8')
    CheckInstr(Or)(mem('[EAX + 1]'), 'R8')
    CheckInstr(Or)(mem('[RAX + 1]'), 'EAX')

    CheckInstr(Shr)('RAX', 8)
    CheckInstr(Shr)('R15', 0x12)
    CheckInstr(Shl)('RAX', 8)
    CheckInstr(Shl)('R15', 0x12)

    CheckInstr(Int3)()
    CheckInstr(Int)(0)
    CheckInstr(Int)(3)
    CheckInstr(Int)(0xff)

    # I really don't know why it's the inverse
    # But I don't care, it's Test dude..
    CheckInstr(x64.Test, expected_result="test r11, rax")('RAX', 'R11')
    CheckInstr(x64.Test, expected_result="test edi, eax")('EAX', 'EDI')
    CheckInstr(x64.Test)('RCX', 'RCX')

    CheckInstr(x64.Test)(mem('[RDI + 0x100]'), 'RCX')

    assert x64.Test(mem('[RDI + 0x100]'), 'RCX').get_code() == x64.Test('RCX', mem('[RDI + 0x100]')).get_code()


    CheckInstr(Push)('RAX')
    assert len(Push("RAX").get_code()) == 1
    CheckInstr(Push)('R15')
    CheckInstr(Push)(0x42)
    CheckInstr(Push)(-1)
    CheckInstr(Push)(mem("[ECX]"))
    CheckInstr(Push)(mem("[RCX]"))


    CheckInstr(Pop)('RAX')
    assert len(Pop("RAX").get_code()) == 1


    CheckInstr(Call)('RAX')
    CheckInstr(Call)(mem('[RAX + RCX * 8]'))
    CheckInstr(Cpuid)()
    CheckInstr(Xchg)('RAX', 'RSP')
    assert Xchg('RAX', 'RCX').get_code() == Xchg('RCX', 'RAX').get_code()


    # 32 / 64 bits register mixing
    CheckInstr(Mov)('ECX', 'EBX')
    CheckInstr(Mov)('RCX', mem('[EBX]'))
    CheckInstr(Mov)('ECX', mem('[RBX]'))
    CheckInstr(Mov)('ECX', mem('[EBX]'))
    CheckInstr(Mov)('RCX', mem('[EBX + EBX]'))
    CheckInstr(Mov)('RCX', mem('[ESP + EBX + 0x10]'))
    CheckInstr(Mov)('ECX', mem('[ESP + EBX + 0x10]'))
    CheckInstr(Mov)('ECX', mem('[RBX + RCX + 0x10]'))

    CheckInstr(Mov)(mem('[RBX + RCX + 0x10]'), 'ECX')
    CheckInstr(Mov)(mem('[EBX + ECX + 0x10]'), 'ECX')
    CheckInstr(Mov)(mem('[EBX + ECX + 0x10]'), 'R8')

    CheckInstr(Not)('RAX')
    CheckInstr(Not)(mem('[RAX]'))


    CheckInstr(ScasB, expected_result="scasb al, byte ptr [rdi]")()
    CheckInstr(ScasW, expected_result="scasw ax, word ptr [rdi]")()
    CheckInstr(ScasD, expected_result="scasd eax, dword ptr [rdi]")()
    CheckInstr(ScasQ, expected_result="scasq rax, qword ptr [rdi]")()

    CheckInstr(CmpsB, expected_result="cmpsb byte ptr [rsi], byte ptr [rdi]")()
    CheckInstr(CmpsW, expected_result="cmpsw word ptr [rsi], word ptr [rdi]")()
    CheckInstr(CmpsD, expected_result="cmpsd dword ptr [rsi], dword ptr [rdi]")()
    CheckInstr(CmpsQ, expected_result="cmpsq qword ptr [rsi], qword ptr [rdi]")()



    CheckInstr(Mov, must_fail=True)('RCX', 'ECX')
    CheckInstr(Mov, must_fail=True)('RCX', mem('[ECX + RCX]'))
    CheckInstr(Mov, must_fail=True)('RCX', mem('[RBX + ECX]'))
    CheckInstr(Mov, must_fail=True)('ECX', mem('[ECX + RCX]'))
    CheckInstr(Mov, must_fail=True)('ECX', mem('[RBX + ECX]'))
    CheckInstr(Add, must_fail=True)('RAX', 0xffffffff)


    # Test some prefix / REP
    assert (x64.Rep + x64.Nop()).get_code() == b"\xf3\x90"
    assert (x64.GSPrefix + x64.Nop()).get_code() == b"\x65\x90"
    assert (x64.OperandSizeOverride + x64.Nop()).get_code() == b"\x66\x90"
    assert (x64.Repne + x64.Nop()).get_code() == b"\xf2\x90"

    code = MultipleInstr()
    code += Nop()
    code += Rep + Nop()
    code += Ret()
    print(repr(code.get_code()))
    assert code.get_code() == b"\x90\xf3\x90\xc3"
예제 #2
0
GetProcAddress64 += x64.Mov("RAX", "RDX")
GetProcAddress64 += x64.Mov(
    "RBX",
    x64.mem("[RAX + 32]"))  # RBX : first base ! (base of current module)
#GetProcAddress64 +=     x64.Mov("RBX ", x64.mem("[RAX + 32]")) # RBX : first base ! (base of current module)
GetProcAddress64 += x64.Cmp("RBX", 0)
GetProcAddress64 += x64.Jz(":DLL_NOT_FOUND")
GetProcAddress64 += x64.Mov(
    "RCX", x64.mem("[RAX + 80]"))  # RCX = NAME (UNICODE_STRING.Buffer)
GetProcAddress64 += x64.Call(":FUNC_STRLENW64")
GetProcAddress64 += x64.Mov("RDI", "RCX")
GetProcAddress64 += x64.Mov("RCX", "RAX")
GetProcAddress64 += x64.Mov("RSI", "R11")
GetProcAddress64 += x64.Rep + x64.CmpsW(
)  #;cmp with current dll name (unicode)
GetProcAddress64 += x64.Test("RCX", "RCX")
GetProcAddress64 += x64.Jz(":DLL_FOUND")
GetProcAddress64 += x64.Mov("RDX", x64.mem("[RDX]"))
GetProcAddress64 += x64.Jmp(":a_dest")
GetProcAddress64 += x64.Label(":DLL_FOUND")  # here rbx = base
GetProcAddress64 += x64.Mov("EAX", x64.mem("[RBX + 60]"))  # rax = PEBASE RVA
GetProcAddress64 += x64.Add("RAX", "RBX")  # RAX = PEBASE
GetProcAddress64 += x64.Add("RAX", 24)  # ;OPTIONAL HEADER
GetProcAddress64 += x64.Mov("ECX",
                            x64.mem("[rax + 112]"))  # ;rcx = RVA export dir
GetProcAddress64 += x64.Add("RCX", "RBX")  # ;rcx = export_dir
GetProcAddress64 += x64.Mov("RAX", "RCX")  # ;RAX = export_dir
GetProcAddress64 += x64.Push("RAX")  # ;Save it for after function search
# ; EBX = BASE | EAX = EXPORT DIR
GetProcAddress64 += x64.Mov("ECX", x64.mem("[RAX  + 24] "))
GetProcAddress64 += x64.Mov("R13", "RCX")  # ;r13 = NB names