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.
- {smda-2.4.2/smda.egg-info → smda-2.4.4}/PKG-INFO +3 -1
- {smda-2.4.2 → smda-2.4.4}/README.md +2 -0
- {smda-2.4.2 → smda-2.4.4}/setup.py +1 -1
- {smda-2.4.2 → smda-2.4.4}/smda/SmdaConfig.py +1 -1
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/ElfSymbolProvider.py +0 -1
- {smda-2.4.2 → smda-2.4.4}/smda/ida/IdaInterface.py +6 -6
- {smda-2.4.2 → smda-2.4.4}/smda/intel/IntelDisassembler.py +15 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/definitions.py +1 -0
- {smda-2.4.2 → smda-2.4.4/smda.egg-info}/PKG-INFO +3 -1
- {smda-2.4.2 → smda-2.4.4}/tests/testFileFormatParsers.py +1 -1
- {smda-2.4.2 → smda-2.4.4}/LICENSE +0 -0
- {smda-2.4.2 → smda-2.4.4}/pyproject.toml +0 -0
- {smda-2.4.2 → smda-2.4.4}/setup.cfg +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/Disassembler.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/DisassemblyResult.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/DisassemblyStatistics.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/cil/CilDisassembler.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/cil/CilInstructionEscaper.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/cil/FunctionAnalysisState.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/cil/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/BasicBlock.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/BinaryInfo.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/BlockLocator.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/CodeXref.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/DominatorTree.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaBasicBlock.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaFunction.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaInstruction.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/SmdaReport.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/TailcallAnalyzer.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/Tarjan.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/AbstractLabelProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/CilSymbolProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/DelphiKbSymbolProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/DelphiReSymProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/ElfApiResolver.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/GoLabelProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/OrdinalHelper.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/PdbSymbolProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/PeSymbolProvider.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/WinApiResolver.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/common/labelprovider/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/ida/BackendInterface.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/ida/IdaExporter.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/ida/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/BitnessAnalyzer.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionAnalysisState.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionCandidate.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/FunctionCandidateManager.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/IndirectCallAnalyzer.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/IntelInstructionEscaper.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/JumpTableAnalyzer.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/LanguageAnalyzer.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/MnemonicTfIdf.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/intel/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/BracketQueue.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/DelphiKbFileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/ElfFileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/FileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/MachoFileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/MemoryFileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/PeFileLoader.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/PriorityQueue.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/StringExtractor.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda/utility/__init__.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda.egg-info/SOURCES.txt +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda.egg-info/dependency_links.txt +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda.egg-info/requires.txt +0 -0
- {smda-2.4.2 → smda-2.4.4}/smda.egg-info/top_level.txt +0 -0
- {smda-2.4.2 → smda-2.4.4}/tests/testBracketQueue.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/tests/testEscaper.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/tests/testIntegration.py +0 -0
- {smda-2.4.2 → smda-2.4.4}/tests/testPeFileLoader.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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,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 <
|
|
35
|
+
if idaapi.IDA_SDK_VERSION >= 740 and idaapi.IDA_SDK_VERSION < 850:
|
|
36
36
|
IdaInterface.instance = Ida74Interface()
|
|
37
|
-
if idaapi.IDA_SDK_VERSION >=
|
|
38
|
-
IdaInterface.instance =
|
|
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
|
|
280
|
+
class Ida85Interface(BackendInterface):
|
|
281
281
|
def __init__(self):
|
|
282
|
-
self.version = "IDA Pro
|
|
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)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: smda
|
|
3
|
-
Version: 2.4.
|
|
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,
|
|
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
|
|
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
|