Add frida-ls-devices CLI tool for listing devices

This commit is contained in:
Ole André Vadla Ravnås
2015-09-17 00:05:19 +02:00
parent 69e3694523
commit f89dc4712b
7 changed files with 112 additions and 4 deletions
+5 -4
View File
@@ -17,28 +17,29 @@ mkdir $(OutDir)frida || exit 1
copy /B /Y "$(ProjectDir)src\frida\*.py" $(OutDir)frida || exit 1
echo. &gt; $(IntDir)frida-package.stamp</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)frida-package.stamp</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\lsd.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">rmdir /S /Q $(OutDir)frida 2&gt;NUL
mkdir $(OutDir)frida || exit 1
copy /B /Y "$(ProjectDir)src\frida\*.py" $(OutDir)frida || exit 1
echo. &gt; $(IntDir)frida-package.stamp</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)frida-package.stamp</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\lsd.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">rmdir /S /Q $(OutDir)frida 2&gt;NUL
mkdir $(OutDir)frida || exit 1
copy /B /Y "$(ProjectDir)src\frida\*.py" $(OutDir)frida || exit 1
echo. &gt; $(IntDir)frida-package.stamp</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)frida-package.stamp</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\lsd.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">rmdir /S /Q $(OutDir)frida 2&gt;NUL
mkdir $(OutDir)frida || exit 1
copy /B /Y "$(ProjectDir)src\frida\*.py" $(OutDir)frida || exit 1
echo. &gt; $(IntDir)frida-package.stamp</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)frida-package.stamp</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectDir)src\frida\core.py;$(ProjectDir)src\frida\application.py;$(ProjectDir)src\frida\lsd.py;$(ProjectDir)src\frida\ps.py;$(ProjectDir)src\frida\discoverer.py;$(ProjectDir)src\frida\tracer.py;$(ProjectDir)src\frida\repl.py</AdditionalInputs>
</CustomBuild>
<None Include="src\frida\core.py" />
<None Include="src\frida\application.py" />
<None Include="src\frida\lsd.py" />
<None Include="src\frida\ps.py" />
<None Include="src\frida\discoverer.py" />
<None Include="src\frida\tracer.py" />
+3
View File
@@ -29,6 +29,9 @@
<None Include="src\frida\application.py">
<Filter>Source Files\frida</Filter>
</None>
<None Include="src\frida\lsd.py">
<Filter>Source Files\frida</Filter>
</None>
<None Include="src\frida\ps.py">
<Filter>Source Files\frida</Filter>
</None>
+3
View File
@@ -29,6 +29,9 @@
<None Include="src\frida\application.py">
<Filter>Source Files\frida</Filter>
</None>
<None Include="src\frida\lsd.py">
<Filter>Source Files\frida</Filter>
</None>
<None Include="src\frida\ps.py">
<Filter>Source Files\frida</Filter>
</None>
+85
View File
@@ -0,0 +1,85 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function
def main():
import frida
from frida.application import ConsoleApplication
class LSDApplication(ConsoleApplication):
def _usage(self):
return "usage: %prog [options]"
def _start(self):
try:
devices = frida.enumerate_devices()
except Exception as e:
self._update_status("Failed to enumerate devices: %s" % e)
self._exit(1)
return
id_column_width = max(map(lambda device: len(device.id), devices))
type_column_width = max(map(lambda device: len(device.type), devices))
name_column_width = max(map(lambda device: len(device.name), devices))
header_format = "%-" + str(id_column_width) + "s " + \
"%-" + str(type_column_width) + "s " + \
"%-" + str(name_column_width) + "s"
print(header_format % ("Id", "Type", "Name"))
print("%s %s %s" % (id_column_width * "-", type_column_width * "-", name_column_width * "-"))
line_format = "%-" + str(id_column_width) + "s " + \
"%-" + str(type_column_width) + "s " + \
"%-" + str(name_column_width) + "s"
for device in sorted(devices, key=cmp_to_key(compare_devices)):
print(line_format % (device.id, device.type, device.name))
self._exit(0)
def compare_devices(a, b):
a_score = score(a)
b_score = score(b)
if a_score == b_score:
if a.name > b.name:
return 1
elif a.name < b.name:
return -1
else:
return 0
else:
if a_score > b_score:
return -1
elif a_score < b_score:
return 1
else:
return 0
def score(device):
type = device.type
if type == 'local':
return 3
elif type == 'tether':
return 2
else:
return 1
def cmp_to_key(mycmp):
"Convert a cmp= function into a key= function"
class K:
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
device = LSDApplication()
device.run()
if __name__ == '__main__':
main()
+6
View File
@@ -1,12 +1,14 @@
bin_SCRIPTS = \
frida \
frida-discover \
frida-ls-devices \
frida-ps \
frida-trace
CLEANFILES = $(bin_SCRIPTS)
EXTRA_DIST = \
frida.in \
frida-discover.in \
frida-ls-devices.in \
frida-ps.in \
frida-trace.in
@@ -24,6 +26,10 @@ frida-discover: frida-discover.in Makefile
$(do_substitution) < $(srcdir)/frida-discover.in > $@
chmod +x $@
frida-ls-devices: frida-ls-devices.in Makefile
$(do_substitution) < $(srcdir)/frida-ls-devices.in > $@
chmod +x $@
frida-ps: frida-ps.in Makefile
$(do_substitution) < $(srcdir)/frida-ps.in > $@
chmod +x $@
+9
View File
@@ -0,0 +1,9 @@
#!@PYTHON@
import sys
sys.path.insert(1, '@pythondir@')
import frida.lsd
if __name__ == '__main__':
frida.lsd.main()
+1
View File
@@ -111,6 +111,7 @@ setup(
'console_scripts': [
"frida = frida.repl:main",
"frida-discover = frida.discoverer:main",
"frida-ls-devices = frida.lsd:main",
"frida-ps = frida.ps:main",
"frida-trace = frida.tracer:main"
]