kdlibcpp

Форк
0
/
disasm.cpp 
90 строк · 2.3 Кб
1
#include "stdafx.h"
2

3
#include <boost/regex.hpp>
4

5
#include "kdlib/disasm.h"
6
#include "kdlib/disasmengine.h"
7
#include "kdlib/dbgengine.h"
8
#include "kdlib/exceptions.h"
9
#include "kdlib/memaccess.h"
10

11
/////////////////////////////////////////////////////////////////////////////////
12

13
namespace {
14

15
static const boost::wregex opcodeRegex(L"^[0-9a-fA-F`]+\\s+[0-9a-fA-F]+\\s+(.*)$");
16

17
}
18

19
/////////////////////////////////////////////////////////////////////////////////
20

21
namespace kdlib {
22

23
/////////////////////////////////////////////////////////////////////////////////
24

25
Disasm::Disasm( MEMOFFSET_64 offset )
26
    : m_ea(0)
27
{
28
    m_beginOffset = addr64(offset);
29

30
    if ( m_beginOffset == 0 )
31
        m_beginOffset = getInstructionOffset();
32

33
    m_currentOffset = m_beginOffset;
34

35
    doDisasm();
36
}
37

38
/////////////////////////////////////////////////////////////////////////////////
39

40
void Disasm::doDisasm()
41
{
42
    MEMOFFSET_64     endOffset = 0;
43

44
    disasmDisassembly( m_currentOffset, m_disasm, endOffset, m_ea );
45

46
    m_length = (size_t)(endOffset - m_currentOffset);
47
}
48

49
/////////////////////////////////////////////////////////////////////////////////
50

51
std::wstring Disasm::assembly( const std::wstring &instr )
52
{
53
    MEMOFFSET_64     endOffset = 0;
54
    disasmAssemblay( m_currentOffset, instr, endOffset );
55

56
    m_currentOffset = endOffset;
57

58
    doDisasm();
59
    
60
    return m_disasm;
61
}
62

63
/////////////////////////////////////////////////////////////////////////////////
64

65
MEMOFFSET_64 Disasm::getNearInstruction( MEMDISPLACEMENT delta ) {
66
    return kdlib::getNearInstruction( m_currentOffset, delta );
67
}
68

69
/////////////////////////////////////////////////////////////////////////////////
70

71
std::wstring Disasm::opmnemo() const
72
{
73
    boost::wsmatch    matchResult;
74

75
    if (!boost::regex_match(m_disasm, matchResult, opcodeRegex))
76
        throw DbgException("failed to parse instruction");
77

78
    return std::wstring(matchResult[1].first, matchResult[1].second);
79
}
80

81
/////////////////////////////////////////////////////////////////////////////////
82

83
std::vector<unsigned char> Disasm::opcode() const
84
{
85
    return loadBytes(m_currentOffset, m_length);
86
}
87

88
/////////////////////////////////////////////////////////////////////////////////
89

90
}; // end kdlib namespace

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.