hilda 2.0.11__tar.gz → 2.0.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {hilda-2.0.11 → hilda-2.0.13}/PKG-INFO +3 -1
  2. {hilda-2.0.11 → hilda-2.0.13}/README.md +2 -0
  3. {hilda-2.0.11 → hilda-2.0.13}/hilda/_version.py +2 -2
  4. {hilda-2.0.11 → hilda-2.0.13}/hilda/hilda_client.py +43 -14
  5. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c_class.py +2 -3
  6. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c_symbol.py +1 -2
  7. {hilda-2.0.11 → hilda-2.0.13}/hilda/symbol.py +2 -2
  8. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/PKG-INFO +3 -1
  9. {hilda-2.0.11 → hilda-2.0.13}/.github/workflows/python-app.yml +0 -0
  10. {hilda-2.0.11 → hilda-2.0.13}/.github/workflows/python-publish.yml +0 -0
  11. {hilda-2.0.11 → hilda-2.0.13}/.gitignore +0 -0
  12. {hilda-2.0.11 → hilda-2.0.13}/.pre-commit-config.yaml +0 -0
  13. {hilda-2.0.11 → hilda-2.0.13}/LICENSE +0 -0
  14. {hilda-2.0.11 → hilda-2.0.13}/gifs/.gitattributes +0 -0
  15. {hilda-2.0.11 → hilda-2.0.13}/gifs/ui.png +0 -0
  16. {hilda-2.0.11 → hilda-2.0.13}/gifs/xpc_print_message.gif +0 -0
  17. {hilda-2.0.11 → hilda-2.0.13}/hilda/__init__.py +0 -0
  18. {hilda-2.0.11 → hilda-2.0.13}/hilda/__main__.py +0 -0
  19. {hilda-2.0.11 → hilda-2.0.13}/hilda/cli.py +0 -0
  20. {hilda-2.0.11 → hilda-2.0.13}/hilda/common.py +0 -0
  21. {hilda-2.0.11 → hilda-2.0.13}/hilda/exceptions.py +0 -0
  22. {hilda-2.0.11 → hilda-2.0.13}/hilda/hilda_ascii_art.html +0 -0
  23. {hilda-2.0.11 → hilda-2.0.13}/hilda/ipython_extensions/events.py +0 -0
  24. {hilda-2.0.11 → hilda-2.0.13}/hilda/ipython_extensions/keybindings.py +0 -0
  25. {hilda-2.0.11 → hilda-2.0.13}/hilda/ipython_extensions/magics.py +0 -0
  26. {hilda-2.0.11 → hilda-2.0.13}/hilda/launch_lldb.py +0 -0
  27. {hilda-2.0.11 → hilda-2.0.13}/hilda/lldb_entrypoint.py +0 -0
  28. {hilda-2.0.11 → hilda-2.0.13}/hilda/lldb_importer.py +0 -0
  29. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/from_ns_to_json.m +0 -0
  30. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/get_objectivec_class_by_module.m +0 -0
  31. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/get_objectivec_class_description.m +0 -0
  32. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/get_objectivec_symbol_data.m +0 -0
  33. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/lsof.m +0 -0
  34. {hilda-2.0.11 → hilda-2.0.13}/hilda/objective_c/to_ns_from_json.m +0 -0
  35. {hilda-2.0.11 → hilda-2.0.13}/hilda/registers.py +0 -0
  36. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/__init__.py +0 -0
  37. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/boringssl.py +0 -0
  38. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/collections.py +0 -0
  39. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/dyld.py +0 -0
  40. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/fs_utils.py +0 -0
  41. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/mach/CFRunLoopServiceMachPort_hooks.py +0 -0
  42. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/mach/__init__.py +0 -0
  43. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/__init__.py +0 -0
  44. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/all_image_infos.py +0 -0
  45. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/apple_version.py +0 -0
  46. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/image_info.py +0 -0
  47. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/macho.py +0 -0
  48. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/macho/macho_load_commands.py +0 -0
  49. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/remotepairingd.py +0 -0
  50. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/syslog.py +0 -0
  51. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/uuid.py +0 -0
  52. {hilda-2.0.11 → hilda-2.0.13}/hilda/snippets/xpc.py +0 -0
  53. {hilda-2.0.11 → hilda-2.0.13}/hilda/symbols_jar.py +0 -0
  54. {hilda-2.0.11 → hilda-2.0.13}/hilda/ui/colors.json +0 -0
  55. {hilda-2.0.11 → hilda-2.0.13}/hilda/ui/ui_manager.py +0 -0
  56. {hilda-2.0.11 → hilda-2.0.13}/hilda/ui/views.py +0 -0
  57. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/SOURCES.txt +0 -0
  58. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/dependency_links.txt +0 -0
  59. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/entry_points.txt +0 -0
  60. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/requires.txt +0 -0
  61. {hilda-2.0.11 → hilda-2.0.13}/hilda.egg-info/top_level.txt +0 -0
  62. {hilda-2.0.11 → hilda-2.0.13}/pyproject.toml +0 -0
  63. {hilda-2.0.11 → hilda-2.0.13}/requirements.txt +0 -0
  64. {hilda-2.0.11 → hilda-2.0.13}/setup.cfg +0 -0
  65. {hilda-2.0.11 → hilda-2.0.13}/tests/__init__.py +0 -0
  66. {hilda-2.0.11 → hilda-2.0.13}/tests/conftest.py +0 -0
  67. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_from_ns.py +0 -0
  68. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_hilda_client.py +0 -0
  69. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_monitor.py +0 -0
  70. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_ns.py +0 -0
  71. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_rebind_symbols.py +0 -0
  72. {hilda-2.0.11 → hilda-2.0.13}/tests/test_hilda_client/test_registers.py +0 -0
  73. {hilda-2.0.11 → hilda-2.0.13}/tests/test_snippets/test_xpc.py +0 -0
  74. {hilda-2.0.11 → hilda-2.0.13}/tests/test_symbols/test_objective_c_class.py +0 -0
  75. {hilda-2.0.11 → hilda-2.0.13}/tests/test_symbols/test_objective_c_symbol.py +0 -0
  76. {hilda-2.0.11 → hilda-2.0.13}/tests/test_symbols/test_symbol.py +0 -0
  77. {hilda-2.0.11 → hilda-2.0.13}/tests/test_symbols/test_symbols_jar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hilda
3
- Version: 2.0.11
3
+ Version: 2.0.13
4
4
  Summary: LLDB wrapped and empowered by iPython's features
5
5
  Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
6
6
  Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
@@ -189,6 +189,8 @@ Here is a gist of methods you can access from `p`:
189
189
  - Stop process.
190
190
  - `cont`
191
191
  - Continue process.
192
+ - `run_for`
193
+ - Run the process for given interval.
192
194
  - `detach`
193
195
  - Detach from process.
194
196
  Useful in order to exit gracefully so process doesn't get killed
@@ -132,6 +132,8 @@ Here is a gist of methods you can access from `p`:
132
132
  - Stop process.
133
133
  - `cont`
134
134
  - Continue process.
135
+ - `run_for`
136
+ - Run the process for given interval.
135
137
  - `detach`
136
138
  - Detach from process.
137
139
  Useful in order to exit gracefully so process doesn't get killed
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.0.11'
16
- __version_tuple__ = version_tuple = (2, 0, 11)
15
+ __version__ = version = '2.0.13'
16
+ __version_tuple__ = version_tuple = (2, 0, 13)
@@ -125,9 +125,29 @@ def stop_is_needed(func: Callable):
125
125
  return wrapper
126
126
 
127
127
 
128
- class HildaClient:
129
- Breakpoint = namedtuple('Breakpoint', 'address options forced callback')
128
+ class HildaBreakpoint:
129
+ def __init__(self, hilda_client: 'HildaClient', lldb_breakpoint: lldb.SBBreakpoint,
130
+ address: Union[str, int], forced: bool = False, options: Optional[typing.Mapping] = None,
131
+ callback: Optional[Callable] = None) -> None:
132
+ self._hilda_client = hilda_client
133
+ self.address = address
134
+ self.forced = forced
135
+ self.options = options
136
+ self.callback = callback
137
+ self.lldb_breakpoint = lldb_breakpoint
138
+
139
+ def __repr__(self) -> str:
140
+ return (f'<{self.__class__.__name__} LLDB:{self.lldb_breakpoint} FORCED:{self.forced} OPTIONS:{self.options} '
141
+ f'CALLBACK:{self.callback}>')
142
+
143
+ def __str__(self) -> str:
144
+ return repr(self)
130
145
 
146
+ def remove(self) -> None:
147
+ self._hilda_client.remove_hilda_breakpoint(self.lldb_breakpoint.id)
148
+
149
+
150
+ class HildaClient:
131
151
  RETVAL_BIT_COUNT = 64
132
152
 
133
153
  def __init__(self, debugger: lldb.SBDebugger):
@@ -146,6 +166,7 @@ class HildaClient:
146
166
  self._dynamic_env_loaded = False
147
167
  self._symbols_loaded = False
148
168
  self.globals: typing.MutableMapping[str, Any] = globals()
169
+ self._hilda_root = Path(__file__).parent
149
170
 
150
171
  # the frame called within the context of the hit BP
151
172
  self._bp_frame = None
@@ -168,7 +189,7 @@ class HildaClient:
168
189
  Get dictionary of all open FDs
169
190
  :return: Mapping between open FDs and their paths
170
191
  """
171
- data = (Path(__file__).parent / 'objective_c' / 'lsof.m').read_text()
192
+ data = (self._hilda_root / 'objective_c' / 'lsof.m').read_text()
172
193
  result = json.loads(self.po(data))
173
194
  # convert FDs into int
174
195
  return {int(k): v for k, v in result.items()}
@@ -347,6 +368,16 @@ class HildaClient:
347
368
  if not self.process.Stop().Success():
348
369
  self.log_critical('failed to stop process')
349
370
 
371
+ def run_for(self, seconds: float) -> None:
372
+ """
373
+ Run the process for a given time
374
+ :return:
375
+ """
376
+ self.cont()
377
+ self.logger.info(f'Running for {seconds} seconds')
378
+ time.sleep(seconds)
379
+ self.stop()
380
+
350
381
  def cont(self, *args) -> None:
351
382
  """ Continue process. """
352
383
  is_running = self.process.GetState() == lldb.eStateRunning
@@ -462,7 +493,7 @@ class HildaClient:
462
493
  with self.stopped():
463
494
  return self.evaluate_expression(call_expression)
464
495
 
465
- def monitor(self, address, condition: str = None, **options) -> lldb.SBBreakpoint:
496
+ def monitor(self, address, condition: str = None, **options) -> HildaBreakpoint:
466
497
  """
467
498
  Monitor every time a given address is called
468
499
 
@@ -602,7 +633,7 @@ class HildaClient:
602
633
  if remove_forced or not bp.forced:
603
634
  self.remove_hilda_breakpoint(bp_id)
604
635
 
605
- def remove_hilda_breakpoint(self, bp_id):
636
+ def remove_hilda_breakpoint(self, bp_id: int) -> None:
606
637
  """
607
638
  Remove a single breakpoint placed by Hilda
608
639
  :param bp_id: Breakpoint's ID
@@ -636,7 +667,7 @@ class HildaClient:
636
667
  print(highlight(entitlements, XmlLexer(), TerminalTrueColorFormatter()))
637
668
 
638
669
  def bp(self, address_or_name: Union[int, str], callback: Optional[Callable] = None, condition: str = None,
639
- forced=False, module_name: Optional[str] = None, **options) -> lldb.SBBreakpoint:
670
+ forced=False, module_name: Optional[str] = None, **options) -> HildaBreakpoint:
640
671
  """
641
672
  Add a breakpoint
642
673
  :param address_or_name:
@@ -665,15 +696,14 @@ class HildaClient:
665
696
  bp.SetCondition(condition)
666
697
 
667
698
  # add into Hilda's internal list of breakpoints
668
- self.breakpoints[bp.id] = HildaClient.Breakpoint(
669
- address=address_or_name, options=options, forced=forced, callback=callback
670
- )
699
+ self.breakpoints[bp.id] = HildaBreakpoint(self, bp, address=address_or_name, forced=forced, options=options,
700
+ callback=callback)
671
701
 
672
702
  if callback is not None:
673
703
  bp.SetScriptCallbackFunction('lldb.hilda_client.bp_callback_router')
674
704
 
675
705
  self.log_info(f'Breakpoint #{bp.id} has been set')
676
- return bp
706
+ return self.breakpoints[bp.id]
677
707
 
678
708
  def bp_callback_router(self, frame, bp_loc, *_):
679
709
  """
@@ -828,8 +858,7 @@ class HildaClient:
828
858
  json_data = json.dumps({'root': data}, default=self._to_ns_json_default)
829
859
  except TypeError as e:
830
860
  raise ConvertingToNsObjectError from e
831
-
832
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'to_ns_from_json.m').read_text()
861
+ obj_c_code = (self._hilda_root / 'objective_c' / 'to_ns_from_json.m').read_text()
833
862
  expression = obj_c_code.replace('__json_object_dump__', json_data.replace('"', r'\"'))
834
863
  try:
835
864
  return self.evaluate_expression(expression)
@@ -842,7 +871,7 @@ class HildaClient:
842
871
  :param address: NS object.
843
872
  :return: Python object.
844
873
  """
845
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'from_ns_to_json.m').read_text()
874
+ obj_c_code = (self._hilda_root / 'objective_c' / 'from_ns_to_json.m').read_text()
846
875
  address = f'0x{address:x}' if isinstance(address, int) else address
847
876
  expression = obj_c_code.replace('__ns_object_address__', address)
848
877
  try:
@@ -1212,7 +1241,7 @@ class HildaClient:
1212
1241
  continue
1213
1242
  objc_classlist = m.FindSection('__DATA').FindSubSection('__objc_classlist')
1214
1243
  objc_classlist_addr = self.symbol(objc_classlist.GetLoadAddress(self.target))
1215
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'get_objectivec_class_by_module.m').read_text()
1244
+ obj_c_code = (self._hilda_root / 'objective_c' / 'get_objectivec_class_by_module.m').read_text()
1216
1245
  obj_c_code = obj_c_code.replace('__count_objc_class', f'{objc_classlist.size // 8}').replace(
1217
1246
  '__objc_class_list',
1218
1247
  f'{objc_classlist_addr}')
@@ -3,7 +3,6 @@ import time
3
3
  from collections import namedtuple
4
4
  from dataclasses import dataclass, field
5
5
  from functools import partial
6
- from pathlib import Path
7
6
  from typing import Any
8
7
  from uuid import uuid4
9
8
 
@@ -120,7 +119,7 @@ class Class(object):
120
119
  :param hilda.hilda_client.HildaClient client: Hilda client.
121
120
  :param class_name: Class name.
122
121
  """
123
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'get_objectivec_class_description.m').read_text()
122
+ obj_c_code = (client._hilda_root / 'objective_c' / 'get_objectivec_class_description.m').read_text()
124
123
  obj_c_code = obj_c_code.replace('__class_address__', '0').replace('__class_name__', class_name)
125
124
  class_symbol = Class(client, class_data=json.loads(client.po(obj_c_code)))
126
125
  if class_symbol.name != class_name:
@@ -143,7 +142,7 @@ class Class(object):
143
142
  Reload class object data.
144
143
  Should be used whenever the class layout changes (for example, during method swizzling)
145
144
  """
146
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'get_objectivec_class_description.m').read_text()
145
+ obj_c_code = (self._client._hilda_root / 'objective_c' / 'get_objectivec_class_description.m').read_text()
147
146
  obj_c_code = obj_c_code.replace('__class_address__', f'{self._class_object:d}')
148
147
  obj_c_code = obj_c_code.replace('__class_name__', self.name)
149
148
  self._load_class_data(json.loads(self._client.po(obj_c_code)))
@@ -2,7 +2,6 @@ import json
2
2
  from contextlib import suppress
3
3
  from dataclasses import dataclass
4
4
  from functools import partial
5
- from pathlib import Path
6
5
 
7
6
  from objc_types_decoder.decode import decode as decode_type
8
7
  from pygments import highlight
@@ -60,7 +59,7 @@ class ObjectiveCSymbol(Symbol):
60
59
  self.methods.clear()
61
60
  self.class_ = None
62
61
 
63
- obj_c_code = (Path(__file__).parent / 'objective_c' / 'get_objectivec_symbol_data.m').read_text()
62
+ obj_c_code = (self._client._hilda_root / 'objective_c' / 'get_objectivec_symbol_data.m').read_text()
64
63
  obj_c_code = obj_c_code.replace('__symbol_address__', f'{self:d}')
65
64
  data = json.loads(self._client.po(obj_c_code))
66
65
 
@@ -139,10 +139,10 @@ class Symbol(int):
139
139
  def peek_str(self) -> str:
140
140
  return self._client.peek_str(self)
141
141
 
142
- def monitor(self, **args) -> lldb.SBBreakpoint:
142
+ def monitor(self, **args):
143
143
  return self._client.monitor(self, **args)
144
144
 
145
- def bp(self, callback=None, **args) -> lldb.SBBreakpoint:
145
+ def bp(self, callback=None, **args):
146
146
  return self._client.bp(self, callback, **args)
147
147
 
148
148
  def disass(self, size, **args) -> lldb.SBInstructionList:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hilda
3
- Version: 2.0.11
3
+ Version: 2.0.13
4
4
  Summary: LLDB wrapped and empowered by iPython's features
5
5
  Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
6
6
  Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
@@ -189,6 +189,8 @@ Here is a gist of methods you can access from `p`:
189
189
  - Stop process.
190
190
  - `cont`
191
191
  - Continue process.
192
+ - `run_for`
193
+ - Run the process for given interval.
192
194
  - `detach`
193
195
  - Detach from process.
194
196
  Useful in order to exit gracefully so process doesn't get killed
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes