Skip to content

Commit

Permalink
fix string printing / reading
Browse files Browse the repository at this point in the history
  • Loading branch information
dshikashio committed Oct 15, 2022
1 parent 61d9aad commit b21bed9
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 22 deletions.
2 changes: 1 addition & 1 deletion pybag/dbgeng/idebugclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def __init__(self, client=None):
self._proc_server_hndl = 0

def Release(self):
self._cli.Release()
#self._cli.Release()
self._cli = None

# Convenience Methods
Expand Down
44 changes: 24 additions & 20 deletions pybag/pydbg.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ def InitComObjects(Dbg):
def FiniComObjects(Dbg):
Dbg._client.SetOutputCallbacks(None)
Dbg._client.SetEventCallbacks(None)
Dbg._advanced.Release()
Dbg._control.Release()
Dbg._dataspaces.Release()
Dbg._symbols.Release()
Dbg._systems.Release()
#Dbg._advanced.Release()
#Dbg._control.Release()
#Dbg._dataspaces.Release()
#Dbg._symbols.Release()
#Dbg._systems.Release()
Dbg.reg = None
Dbg.mod = None
Dbg.events = None
Expand Down Expand Up @@ -285,6 +285,24 @@ def read(self, addr, len=1):
"""read(addr,len) -> read len bytes from addr"""
return self._dataspaces.ReadVirtual(addr, len)

def readstr(self, addr, wchar=False):
"""readstr(addr, wchar=False) -> return string"""
MAX_LEN = 0x1000
if wchar:
width = 2
enc = 'utf-16-le'
else:
width = 1
enc = 'utf-8'
data = []
for i in range(0, MAX_LEN, width):
x = self.read(addr + i, width)
if x == b"\x00"*width:
break
else:
data.append(x)
return b''.join(data).decode(enc)

def readptr(self, addr, count=1):
"""readptr(addr,count=1) -> read and return size_t dwords from addr"""
if self.bitness() == '64':
Expand Down Expand Up @@ -441,21 +459,7 @@ def dp(self, addr, count=10):

def ds(self, addr, wchar=False):
"""ds(addr, wchar=False) -> display string"""
MAX_LEN = 0x1000
if wchar:
width = 2
enc = 'utf-16-le'
else:
width = 1
enc = 'ascii'
data = []
for i in range(0, MAX_LEN, width):
x = self.read(addr + i, width)
if x == b"\x00"*width:
break
else:
data.append(x)
print(b''.join(data).encode(enc))
print(self.readstr(addr,wchar))

def bl(self):
"""bl() -> List breakpoints"""
Expand Down
3 changes: 2 additions & 1 deletion run_tests.bat
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ python -m tests.test_idebugclient
python -m tests.test_target TestBasic
python -m tests.test_target TestTargetCreate
python -m tests.test_target TestTargetAttach1
python -m tests.test_target TestTargetAttach2
python -m tests.test_target TestTargetAttach2
python -m tests.test_target TestDataCommands
13 changes: 13 additions & 0 deletions tests/target/target.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,19 @@
char *astring = "ascii string";
WCHAR *wstring = L"wide string";

char aArray[] = "ascii array";
WCHAR wArray[] = L"wide array";

int add(int a, int b)
{
return a + b;
}

int sub(int a, int b)
{
return a - b;
}

int wmain(int argc, wchar_t **argv)
{
printf("%S: Hello\n", argv[0]);
Expand Down
40 changes: 40 additions & 0 deletions tests/test_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,45 @@ def test_processes(self):
pprint.pprint(pids)


def breakin(dbg,bp):
return pybag.dbgeng.core.DEBUG_STATUS_BREAK

def go(dbg,bp):
return pybag.dbgeng.core.DEBUG_STATUS_GO

class TestDataCommands(unittest.TestCase):
def setUp(self):
self.dbg = UserDbg()
self.dbg.cmd(".sympath SRV*c:\\sym")
self.dbg.create(target1)
self.dbg.cmd(".reload /f")
self.dbg.bp("target!wmain", breakin)
self.dbg.go()

def tearDown(self):
self.dbg.terminate()
self.dbg.wait()
self.dbg.Release()

def test_string(self):
# Ascii string
aptr = self.dbg.symbol('target!astring')
astring = self.dbg.readptr(aptr)[0]
self.assertEqual(self.dbg.readstr(astring), 'ascii string')
# Wide string
wptr = self.dbg.symbol('target!wstring')
wstring = self.dbg.readptr(wptr)[0]
self.assertEqual(self.dbg.readstr(wstring, True), 'wide string')

astring = self.dbg.symbol("target!aArray")
self.assertEqual(self.dbg.readstr(astring), 'ascii array')

wstring = self.dbg.symbol("target!wArray")
self.assertEqual(self.dbg.readstr(wstring, True), 'wide array')

def test_disasm(self):
self.dbg.disasm()
self.dbg.disasm(self.dbg.symbol("target!add"))

if __name__ == '__main__':
unittest.main()

0 comments on commit b21bed9

Please sign in to comment.