smda 2.4.2__tar.gz → 2.4.4__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 (76) hide show
  1. {smda-2.4.2/smda.egg-info → smda-2.4.4}/PKG-INFO +3 -1
  2. {smda-2.4.2 → smda-2.4.4}/README.md +2 -0
  3. {smda-2.4.2 → smda-2.4.4}/setup.py +1 -1
  4. {smda-2.4.2 → smda-2.4.4}/smda/SmdaConfig.py +1 -1
  5. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/ElfSymbolProvider.py +0 -1
  6. {smda-2.4.2 → smda-2.4.4}/smda/ida/IdaInterface.py +6 -6
  7. {smda-2.4.2 → smda-2.4.4}/smda/intel/IntelDisassembler.py +15 -0
  8. {smda-2.4.2 → smda-2.4.4}/smda/intel/definitions.py +1 -0
  9. {smda-2.4.2 → smda-2.4.4/smda.egg-info}/PKG-INFO +3 -1
  10. {smda-2.4.2 → smda-2.4.4}/tests/testFileFormatParsers.py +1 -1
  11. {smda-2.4.2 → smda-2.4.4}/LICENSE +0 -0
  12. {smda-2.4.2 → smda-2.4.4}/pyproject.toml +0 -0
  13. {smda-2.4.2 → smda-2.4.4}/setup.cfg +0 -0
  14. {smda-2.4.2 → smda-2.4.4}/smda/Disassembler.py +0 -0
  15. {smda-2.4.2 → smda-2.4.4}/smda/DisassemblyResult.py +0 -0
  16. {smda-2.4.2 → smda-2.4.4}/smda/DisassemblyStatistics.py +0 -0
  17. {smda-2.4.2 → smda-2.4.4}/smda/__init__.py +0 -0
  18. {smda-2.4.2 → smda-2.4.4}/smda/cil/CilDisassembler.py +0 -0
  19. {smda-2.4.2 → smda-2.4.4}/smda/cil/CilInstructionEscaper.py +0 -0
  20. {smda-2.4.2 → smda-2.4.4}/smda/cil/FunctionAnalysisState.py +0 -0
  21. {smda-2.4.2 → smda-2.4.4}/smda/cil/__init__.py +0 -0
  22. {smda-2.4.2 → smda-2.4.4}/smda/common/BasicBlock.py +0 -0
  23. {smda-2.4.2 → smda-2.4.4}/smda/common/BinaryInfo.py +0 -0
  24. {smda-2.4.2 → smda-2.4.4}/smda/common/BlockLocator.py +0 -0
  25. {smda-2.4.2 → smda-2.4.4}/smda/common/CodeXref.py +0 -0
  26. {smda-2.4.2 → smda-2.4.4}/smda/common/DominatorTree.py +0 -0
  27. {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaBasicBlock.py +0 -0
  28. {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaFunction.py +0 -0
  29. {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaInstruction.py +0 -0
  30. {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaReport.py +0 -0
  31. {smda-2.4.2 → smda-2.4.4}/smda/common/TailcallAnalyzer.py +0 -0
  32. {smda-2.4.2 → smda-2.4.4}/smda/common/Tarjan.py +0 -0
  33. {smda-2.4.2 → smda-2.4.4}/smda/common/__init__.py +0 -0
  34. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/AbstractLabelProvider.py +0 -0
  35. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/CilSymbolProvider.py +0 -0
  36. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/DelphiKbSymbolProvider.py +0 -0
  37. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/DelphiReSymProvider.py +0 -0
  38. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/ElfApiResolver.py +0 -0
  39. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/GoLabelProvider.py +0 -0
  40. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/OrdinalHelper.py +0 -0
  41. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/PdbSymbolProvider.py +0 -0
  42. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/PeSymbolProvider.py +0 -0
  43. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/WinApiResolver.py +0 -0
  44. {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/__init__.py +0 -0
  45. {smda-2.4.2 → smda-2.4.4}/smda/ida/BackendInterface.py +0 -0
  46. {smda-2.4.2 → smda-2.4.4}/smda/ida/IdaExporter.py +0 -0
  47. {smda-2.4.2 → smda-2.4.4}/smda/ida/__init__.py +0 -0
  48. {smda-2.4.2 → smda-2.4.4}/smda/intel/BitnessAnalyzer.py +0 -0
  49. {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionAnalysisState.py +0 -0
  50. {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionCandidate.py +0 -0
  51. {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionCandidateManager.py +0 -0
  52. {smda-2.4.2 → smda-2.4.4}/smda/intel/IndirectCallAnalyzer.py +0 -0
  53. {smda-2.4.2 → smda-2.4.4}/smda/intel/IntelInstructionEscaper.py +0 -0
  54. {smda-2.4.2 → smda-2.4.4}/smda/intel/JumpTableAnalyzer.py +0 -0
  55. {smda-2.4.2 → smda-2.4.4}/smda/intel/LanguageAnalyzer.py +0 -0
  56. {smda-2.4.2 → smda-2.4.4}/smda/intel/MnemonicTfIdf.py +0 -0
  57. {smda-2.4.2 → smda-2.4.4}/smda/intel/__init__.py +0 -0
  58. {smda-2.4.2 → smda-2.4.4}/smda/utility/BracketQueue.py +0 -0
  59. {smda-2.4.2 → smda-2.4.4}/smda/utility/DelphiKbFileLoader.py +0 -0
  60. {smda-2.4.2 → smda-2.4.4}/smda/utility/ElfFileLoader.py +0 -0
  61. {smda-2.4.2 → smda-2.4.4}/smda/utility/FileLoader.py +0 -0
  62. {smda-2.4.2 → smda-2.4.4}/smda/utility/MachoFileLoader.py +0 -0
  63. {smda-2.4.2 → smda-2.4.4}/smda/utility/MemoryFileLoader.py +0 -0
  64. {smda-2.4.2 → smda-2.4.4}/smda/utility/PeFileLoader.py +0 -0
  65. {smda-2.4.2 → smda-2.4.4}/smda/utility/PriorityQueue.py +0 -0
  66. {smda-2.4.2 → smda-2.4.4}/smda/utility/StringExtractor.py +0 -0
  67. {smda-2.4.2 → smda-2.4.4}/smda/utility/__init__.py +0 -0
  68. {smda-2.4.2 → smda-2.4.4}/smda.egg-info/SOURCES.txt +0 -0
  69. {smda-2.4.2 → smda-2.4.4}/smda.egg-info/dependency_links.txt +0 -0
  70. {smda-2.4.2 → smda-2.4.4}/smda.egg-info/requires.txt +0 -0
  71. {smda-2.4.2 → smda-2.4.4}/smda.egg-info/top_level.txt +0 -0
  72. {smda-2.4.2 → smda-2.4.4}/tests/testBracketQueue.py +0 -0
  73. {smda-2.4.2 → smda-2.4.4}/tests/testEscaper.py +0 -0
  74. {smda-2.4.2 → smda-2.4.4}/tests/testIntegration.py +0 -0
  75. {smda-2.4.2 → smda-2.4.4}/tests/testPeFileLoader.py +0 -0
  76. {smda-2.4.2 → smda-2.4.4}/tests/testTarjan.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smda
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: A recursive disassmbler optimized for CFG recovery from memory dumps. Based on capstone.
5
5
  Home-page: https://github.com/danielplohmann/smda
6
6
  Author: Daniel Plohmann
@@ -133,6 +133,8 @@ make test
133
133
  ```
134
134
 
135
135
  ## Version History
136
+ * 2025-12-15: v2.4.4 - Extended set of default prologues for additional 64bit GCC-style byte combinations. Added exit syscall check to improve function end recognition. (THX: @N0fix)
137
+ * 2025-12-10: v2.4.3 - Compatibility issue for IDA export, API changes happened already in 8.5, so adjusted the version check.
136
138
  * 2025-11-28: v2.4.2 - Fix for a bug when extracting and merging code areas from section tables. (THX: @r0ny123)
137
139
  * 2025-11-28: v2.4.1 - Modernized packaging by also building a wheel. (THX: @dimbleby)
138
140
  * 2025-11-21: v2.4.0 - Integration of DelphiReSym by @WenzWenzWenz for Delphi VMT parsing, thanks to @r0ny123 for adapting it!!
@@ -101,6 +101,8 @@ make test
101
101
  ```
102
102
 
103
103
  ## Version History
104
+ * 2025-12-15: v2.4.4 - Extended set of default prologues for additional 64bit GCC-style byte combinations. Added exit syscall check to improve function end recognition. (THX: @N0fix)
105
+ * 2025-12-10: v2.4.3 - Compatibility issue for IDA export, API changes happened already in 8.5, so adjusted the version check.
104
106
  * 2025-11-28: v2.4.2 - Fix for a bug when extracting and merging code areas from section tables. (THX: @r0ny123)
105
107
  * 2025-11-28: v2.4.1 - Modernized packaging by also building a wheel. (THX: @dimbleby)
106
108
  * 2025-11-21: v2.4.0 - Integration of DelphiReSym by @WenzWenzWenz for Delphi VMT parsing, thanks to @r0ny123 for adapting it!!
@@ -12,7 +12,7 @@ requirements.append("lief>=0.16.0")
12
12
  setup(
13
13
  name="smda",
14
14
  # note to self: always change this in config as well.
15
- version="2.4.2",
15
+ version="2.4.4",
16
16
  description="A recursive disassmbler optimized for CFG recovery from memory dumps. Based on capstone.",
17
17
  long_description_content_type="text/markdown",
18
18
  long_description=long_description,
@@ -4,7 +4,7 @@ import os
4
4
 
5
5
  class SmdaConfig:
6
6
  # note to self: always change this in setup.py as well!
7
- VERSION = "2.4.2"
7
+ VERSION = "2.4.4"
8
8
  ESCAPER_DOWNWARD_COMPATIBILITY = "1.13.16"
9
9
  CONFIG_FILE_PATH = str(os.path.abspath(__file__))
10
10
  PROJECT_ROOT = str(os.path.abspath(os.sep.join([CONFIG_FILE_PATH, "..", ".."])))
@@ -32,7 +32,6 @@ class ElfSymbolProvider(AbstractLabelProvider):
32
32
  if binary_info.file_path:
33
33
  with open(binary_info.file_path, "rb") as fin:
34
34
  data = fin.read()
35
- return
36
35
  elif binary_info.raw_data:
37
36
  data = binary_info.raw_data
38
37
  else:
@@ -32,10 +32,10 @@ class IdaInterface:
32
32
 
33
33
  def __init__(self):
34
34
  if not IdaInterface.instance:
35
- if idaapi.IDA_SDK_VERSION >= 740 and idaapi.IDA_SDK_VERSION < 900:
35
+ if idaapi.IDA_SDK_VERSION >= 740 and idaapi.IDA_SDK_VERSION < 850:
36
36
  IdaInterface.instance = Ida74Interface()
37
- if idaapi.IDA_SDK_VERSION >= 900:
38
- IdaInterface.instance = Ida90Interface()
37
+ if idaapi.IDA_SDK_VERSION >= 850:
38
+ IdaInterface.instance = Ida85Interface()
39
39
  else:
40
40
  IdaInterface.instance = Ida73Interface()
41
41
 
@@ -48,7 +48,7 @@ class IdaInterface:
48
48
 
49
49
  class Ida74Interface(BackendInterface):
50
50
  def __init__(self):
51
- self.version = "IDA Pro 7.4"
51
+ self.version = "IDA Pro 7.4 - 8.4"
52
52
  self._processor_map = {"metapc": "intel"}
53
53
  self._api_map = {}
54
54
  self._import_module_name = ""
@@ -277,9 +277,9 @@ class Ida73Interface(BackendInterface):
277
277
  return True
278
278
 
279
279
 
280
- class Ida90Interface(BackendInterface):
280
+ class Ida85Interface(BackendInterface):
281
281
  def __init__(self):
282
- self.version = "IDA Pro 9.0"
282
+ self.version = "IDA Pro 8.5+"
283
283
  self._processor_map = {"metapc": "intel"}
284
284
  self._api_map = {}
285
285
  self._import_module_name = ""
@@ -402,6 +402,21 @@ class IntelDisassembler:
402
402
  " analyzeFunction() found ending instruction @0x%08x",
403
403
  i_address,
404
404
  )
405
+ elif i_mnemonic_noprefix in ["syscall"]:
406
+ if previous_address and previous_mnemonic == "mov":
407
+ prev_operands = previous_op_str.split(",")
408
+ if len(prev_operands) == 2:
409
+ reg = prev_operands[0].strip().lower()
410
+ if (self.disassembly.binary_info.bitness == 64 and reg == "rax") or (
411
+ self.disassembly.binary_info.bitness == 32 and reg == "eax"
412
+ ):
413
+ syscall_number_str = int(prev_operands[1].strip(), 16)
414
+ if syscall_number_str == 60:
415
+ self._analyzeEndInstruction(state)
416
+ LOGGER.debug(
417
+ " analyzeFunction() found program ending instruction @0x%08x",
418
+ i_address,
419
+ )
405
420
  elif previous_address and i_address != start_addr and previous_mnemonic == "call":
406
421
  instruction_sequence = list(
407
422
  self.capstone.disasm(self._getDisasmWindowBuffer(i_address), i_address)
@@ -52,6 +52,7 @@ DEFAULT_PROLOGUES = [
52
52
  b"\x89\xff\x55\x8b\xec",
53
53
  b"\x55\x8b\xec",
54
54
  b"\x55\x89\xe5",
55
+ b"\x55\x48\x89\xe5",
55
56
  ]
56
57
 
57
58
  # these cover 99% of confirmed function starts in the reference data set
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smda
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: A recursive disassmbler optimized for CFG recovery from memory dumps. Based on capstone.
5
5
  Home-page: https://github.com/danielplohmann/smda
6
6
  Author: Daniel Plohmann
@@ -133,6 +133,8 @@ make test
133
133
  ```
134
134
 
135
135
  ## Version History
136
+ * 2025-12-15: v2.4.4 - Extended set of default prologues for additional 64bit GCC-style byte combinations. Added exit syscall check to improve function end recognition. (THX: @N0fix)
137
+ * 2025-12-10: v2.4.3 - Compatibility issue for IDA export, API changes happened already in 8.5, so adjusted the version check.
136
138
  * 2025-11-28: v2.4.2 - Fix for a bug when extracting and merging code areas from section tables. (THX: @r0ny123)
137
139
  * 2025-11-28: v2.4.1 - Modernized packaging by also building a wheel. (THX: @dimbleby)
138
140
  * 2025-11-21: v2.4.0 - Integration of DelphiReSym by @WenzWenzWenz for Delphi VMT parsing, thanks to @r0ny123 for adapting it!!
@@ -124,7 +124,7 @@ class SmdaIntegrationTestSuite(unittest.TestCase):
124
124
  binary_info.oep = binary_info.getOep()
125
125
  disasm._disassemble(binary_info)
126
126
  komplex_unmapped_disassembly = disasm.disassembleUnmappedBuffer(komplex_binary)
127
- self.assertEqual(komplex_unmapped_disassembly.num_functions, 208)
127
+ self.assertEqual(komplex_unmapped_disassembly.num_functions, 211)
128
128
 
129
129
 
130
130
  if __name__ == "__main__":
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
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