Refactor disas code
This commit is contained in:
parent
b11cbe2d19
commit
b7ceca6e89
Binary file not shown.
BIN
RElicAnalysis-0.1.1
Executable file
BIN
RElicAnalysis-0.1.1
Executable file
Binary file not shown.
@ -72,7 +72,9 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
|
||||
elf/mdielfview.cpp
|
||||
elf/mdielfview.h
|
||||
dialogabout.h dialogabout.cpp
|
||||
dockmenu.h dockmenu.cpp
|
||||
|
||||
|
||||
elf/elfsymbolmodel.h elf/elfsymbolmodel.cpp
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 12.0.2, 2026-05-01T15:14:32. -->
|
||||
<!-- Written by QtCreator 12.0.2, 2026-05-21T10:40:49. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
<value type="QByteArray">{7576b28b-0509-4f2e-9112-d416507c0bdd}</value>
|
||||
<value type="QByteArray">{c1ad1696-344c-4cbf-8c9b-7903590215f2}</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||
@ -76,7 +76,7 @@
|
||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||
<value type="int" key="ClangTools.ParallelJobs">2</value>
|
||||
<value type="int" key="ClangTools.ParallelJobs">4</value>
|
||||
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||
@ -89,10 +89,10 @@
|
||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="DeviceType">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{4f4e56a4-b54b-4c8a-9576-1e917c71a3c7}</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.6.2 GCC 64bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.6.2 GCC 64bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.662.gcc_64_kit</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
@ -100,16 +100,17 @@
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Unix Makefiles
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Ninja
|
||||
-DCMAKE_BUILD_TYPE:STRING=Debug
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
|
||||
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}</value>
|
||||
<value type="QString" key="CMake.Source.Directory">/home/gbucchino/Documents/GIT/RElicAnalysis/RElicAnalysis</value>
|
||||
<value type="int" key="EnableQmlDebugging">0</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/geoffrey/Documents/GIT/cryptoshield/RElicAnalysis/build-RElicAnalysis-Desktop-Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gbucchino/Documents/GIT/RElicAnalysis/build-RElicAnalysis-Desktop_Qt_6_6_2_GCC_64bit-Debug</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
@ -157,15 +158,16 @@
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Unix Makefiles
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Ninja
|
||||
-DCMAKE_BUILD_TYPE:STRING=Release
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
|
||||
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
|
||||
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/geoffrey/Documents/GIT/cryptoshield/RElicAnalysis/build-RElicAnalysis-Desktop-Release</value>
|
||||
<value type="QString" key="CMake.Source.Directory">/home/gbucchino/Documents/GIT/RElicAnalysis/RElicAnalysis</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/gbucchino/Documents/GIT/RElicAnalysis/build-RElicAnalysis-Desktop_Qt_6_6_2_GCC_64bit-Release</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
@ -175,6 +177,7 @@
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
@ -191,6 +194,7 @@
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
@ -206,170 +210,7 @@
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Unix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
|
||||
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/geoffrey/Documents/GIT/cryptoshield/RElicAnalysis/build-RElicAnalysis-Desktop-RelWithDebInfo</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
||||
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Unix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
|
||||
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}</value>
|
||||
<value type="int" key="EnableQmlDebugging">0</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/geoffrey/Documents/GIT/cryptoshield/RElicAnalysis/build-RElicAnalysis-Desktop-Profile</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.4">
|
||||
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=Unix Makefiles
|
||||
-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
|
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake
|
||||
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
|
||||
-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/geoffrey/Documents/GIT/cryptoshield/RElicAnalysis/build-RElicAnalysis-Desktop-MinSizeRel</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">5</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
@ -388,17 +229,18 @@
|
||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||
<value type="QList<int>" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
|
||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">RElicAnalysis</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.RElicAnalysis</value>
|
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">RElicAnalysis</value>
|
||||
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/gbucchino/Documents/GIT/RElicAnalysis/build-RElicAnalysis-Desktop_Qt_6_6_2_GCC_64bit-Release</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
|
||||
@ -97,10 +97,8 @@ struct elfSymbol {
|
||||
unsigned char st_info;
|
||||
unsigned char st_other;
|
||||
QByteArray st_shndx;
|
||||
char *data;
|
||||
//char *data;
|
||||
uint64_t size;
|
||||
int countEntries;
|
||||
int entry;
|
||||
};
|
||||
|
||||
struct elfHash {
|
||||
|
||||
@ -9,7 +9,8 @@
|
||||
|
||||
struct object_asm {
|
||||
char cmd[SIZE_OBJECT_CMD]; // Store the command
|
||||
char *hexCmd; // Store the command in hex
|
||||
//char *hexCmd; // Store the command in hex
|
||||
char hexCmd[SIZE_OBJECT_CMD];
|
||||
size_t octets;
|
||||
size_t addr; // Command start at
|
||||
};
|
||||
|
||||
@ -6,7 +6,7 @@ DialogAbout::DialogAbout(): QDialog() {
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout;
|
||||
|
||||
QLabel *labelTitle = new QLabel("RElicAnalysis 0.1.0");
|
||||
QLabel *labelTitle = new QLabel("RElicAnalysis 0.1.1");
|
||||
QFont fontTitle;
|
||||
fontTitle.setPointSize(15);
|
||||
fontTitle.setBold(true);
|
||||
|
||||
@ -29,7 +29,7 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
/*
|
||||
* Cf: https://github.com/bpftrace/bpftrace/blob/master/src/bfd-disasm.cpp#L49C1-L55C2
|
||||
*/
|
||||
/*static int dump_asm_styled(void *out __attribute__((unused)), enum disassembler_style s __attribute__((unused)),
|
||||
static int dump_asm_styled(void *out __attribute__((unused)), enum disassembler_style s __attribute__((unused)),
|
||||
const char *fmt __attribute__((unused)), ...)
|
||||
{
|
||||
struct dataDisas *sData = (struct dataDisas*)out;
|
||||
@ -54,7 +54,7 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
|
||||
memcpy(sData->s_object_asm[index].cmd, tmp, strlen(tmp));
|
||||
return 0;
|
||||
}*/
|
||||
}
|
||||
struct dataDisas *disas_asm(unsigned char *buffer, uint64_t startAddress, size_t length){
|
||||
struct disassemble_info disasm_info;
|
||||
|
||||
@ -94,8 +94,8 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
* https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit/?id=600b7b26c07a070d0153daa76b3806c1e52c9e00
|
||||
* https://patchwork.yoctoproject.org/project/arm/patch/20220824025819.4888-1-jon.mason@arm.com/#5104
|
||||
*/
|
||||
//init_disassemble_info (&disasm_info, sData, dump_asm, dump_asm_styled);
|
||||
init_disassemble_info (&disasm_info, sData, dump_asm);
|
||||
init_disassemble_info (&disasm_info, sData, dump_asm, dump_asm_styled);
|
||||
//init_disassemble_info (&disasm_info, sData, dump_asm);
|
||||
disasm_info.arch = bfd_arch_i386;
|
||||
disasm_info.mach = bfd_mach_x86_64;
|
||||
disasm_info.read_memory_func = buffer_read_memory;
|
||||
@ -119,6 +119,7 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
int bufferIndex = 0;
|
||||
while (i < length){
|
||||
size_t octets = disas(i, &disasm_info);
|
||||
//qDebug() << octets;
|
||||
sData->s_object_asm[sData->countEntries].octets = octets;
|
||||
sData->s_object_asm[sData->countEntries].addr = nextStart;
|
||||
|
||||
@ -127,10 +128,17 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
* We free in the parsingElf file
|
||||
*/
|
||||
/* hexCmd object will be freed in parsingElf file */
|
||||
sData->s_object_asm[sData->countEntries].hexCmd = (char*)malloc(sizeof(char) * octets);
|
||||
|
||||
/*sData->s_object_asm[sData->countEntries].hexCmd = (char*)malloc(sizeof(char) * octets);
|
||||
if (!sData->s_object_asm[sData->countEntries].hexCmd){
|
||||
qDebug() << "Failed ";
|
||||
return NULL;
|
||||
}*/
|
||||
|
||||
memcpy(sData->s_object_asm[sData->countEntries].hexCmd,
|
||||
&buffer[bufferIndex],
|
||||
octets);
|
||||
|
||||
i += octets;
|
||||
nextStart += octets;
|
||||
bufferIndex += octets;
|
||||
@ -151,6 +159,5 @@ static int dump_asm(void *stream, const char *fmt, ...){
|
||||
memset(&sData->s_object_asm[sData->countEntries], 0, sizeof(&sData->s_object_asm));
|
||||
memset(sData->s_object_asm[sData->countEntries].cmd, 0, SIZE_OBJECT_CMD);
|
||||
};
|
||||
|
||||
return sData;
|
||||
}
|
||||
|
||||
34
RElicAnalysis/elf/elfsymbolmodel.cpp
Normal file
34
RElicAnalysis/elf/elfsymbolmodel.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
#include "elfsymbolmodel.h"
|
||||
#include <QDebug>
|
||||
|
||||
ElfSymbolModel::ElfSymbolModel() {
|
||||
}
|
||||
|
||||
void ElfSymbolModel::setSymbol(struct elfSymbol *elf, struct elfObjectDisas *s){
|
||||
if(!m_hash[elf])
|
||||
m_hash[elf] = new QList<struct elfObjectDisas *>();
|
||||
m_hash[elf]->append(s);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function return the list of all keys, which represent a section in Elf
|
||||
*/
|
||||
QList<struct elfSymbol *> ElfSymbolModel::getKeys(){
|
||||
return m_hash.keys();
|
||||
}
|
||||
|
||||
/*
|
||||
* This function return all asm code from the symbol specified in argument
|
||||
*/
|
||||
QList<struct elfObjectDisas *> *ElfSymbolModel::getASMCode(struct elfSymbol *symbol){
|
||||
return m_hash.value(symbol);
|
||||
}
|
||||
|
||||
ElfSymbolModel::~ElfSymbolModel(){
|
||||
if (m_hash.size() > 0){
|
||||
for (struct elfSymbol *key : m_hash.keys()){
|
||||
if (m_hash[key])
|
||||
delete m_hash[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
22
RElicAnalysis/elf/elfsymbolmodel.h
Normal file
22
RElicAnalysis/elf/elfsymbolmodel.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef ELFSYMBOLMODEL_H
|
||||
#define ELFSYMBOLMODEL_H
|
||||
|
||||
#include <QList>
|
||||
#include <QHash>
|
||||
#include "../data.h"
|
||||
|
||||
class ElfSymbolModel
|
||||
{
|
||||
public:
|
||||
ElfSymbolModel();
|
||||
~ElfSymbolModel();
|
||||
|
||||
void setSymbol(struct elfSymbol *, struct elfObjectDisas *);
|
||||
QList<struct elfSymbol *> getKeys();
|
||||
QList<struct elfObjectDisas *> *getASMCode(struct elfSymbol *);
|
||||
|
||||
private:
|
||||
QHash<struct elfSymbol *, QList<struct elfObjectDisas *> *> m_hash;
|
||||
};
|
||||
|
||||
#endif // ELFSYMBOLMODEL_H
|
||||
@ -272,6 +272,7 @@ void MdiElf::_addCaracteristics(ElfData *elfData) {
|
||||
s += "ELF number sections: " + QString::number(hexToInt(sElfHdr->e_shnum.toHex())) + "\n";
|
||||
s += "ELF sections offset: " + QString::number(hexToInt(sElfHdr->e_shoff.toHex())) + "\n";
|
||||
s += "String table: " + QString::number(hexToInt(sElfHdr->e_shstrndx.toHex())) + "\n";
|
||||
s += "Bss size: " + QString::number(elfData->getBssSectionSize()) + " bytes\n";
|
||||
|
||||
m_textEditCaracteristics->setPlainText(s);
|
||||
}
|
||||
|
||||
@ -14,49 +14,8 @@ MdiElfDisassembled::MdiElfDisassembled(ProjectElf *projectElf): QMdiSubWindow()
|
||||
// Main layout
|
||||
QHBoxLayout *mainLayout = new QHBoxLayout;
|
||||
|
||||
/*
|
||||
* Explorer part
|
||||
* Get here all symbols, such as functions
|
||||
*/
|
||||
m_modelExplorer = new QStandardItemModel;
|
||||
|
||||
// ListView that contains all symbols
|
||||
m_viewExplorer = new QListView;
|
||||
m_viewExplorer->setModel(m_modelExplorer);
|
||||
m_viewExplorer->setStyleSheet("border: none");
|
||||
m_viewExplorer->setMaximumWidth(250);
|
||||
connect(m_viewExplorer, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(_itemClicked(QModelIndex)));
|
||||
|
||||
// ASM code
|
||||
m_modelAnalyse = new QStandardItemModel;
|
||||
QHash<QByteArray, QList<struct elfObjectDisas *> *> disasCode = elfData->getDisasCode();
|
||||
|
||||
for (const QByteArray &key : disasCode.keys()){
|
||||
// Add to the explorer
|
||||
QStandardItem *itemExplorer = new QStandardItem(key);
|
||||
m_modelExplorer->appendRow(itemExplorer);
|
||||
|
||||
// Add to the QListView
|
||||
QStandardItem *item = new QStandardItem(key);
|
||||
QFont font;
|
||||
font.setItalic(true);
|
||||
font.setPointSize(12);
|
||||
item->setFont(font);
|
||||
m_modelAnalyse->appendRow(item);
|
||||
|
||||
/*
|
||||
* Add the modelIndex to the list.
|
||||
* This list is used when the user has cliked the item
|
||||
*/
|
||||
m_listModelExplorer.append(m_modelAnalyse->indexFromItem(item));
|
||||
|
||||
/* Add the disas code to the QListView */
|
||||
for (qsizetype i = 0; i < disasCode[key]->size(); ++i){
|
||||
//qDebug() << "Disas: " << key << " " << disasCode[key]->at(i)->hexCmd;
|
||||
QString s = sanitizeASMCode(disasCode[key]->at(i));
|
||||
m_modelAnalyse->appendRow(new QStandardItem(s));
|
||||
}
|
||||
}
|
||||
|
||||
// ListView that contains the ASM code
|
||||
m_viewAnalyse = new QListView;
|
||||
@ -64,7 +23,54 @@ MdiElfDisassembled::MdiElfDisassembled(ProjectElf *projectElf): QMdiSubWindow()
|
||||
m_viewAnalyse->setSelectionMode(QAbstractItemView::NoSelection);
|
||||
//m_viewAnalyse->setStyleSheet("border: none");
|
||||
|
||||
mainLayout->addWidget(m_viewExplorer);
|
||||
// We get all symbols and associate with the section (QTreeWidgetItem)
|
||||
m_treeWidget = new QTreeWidget;
|
||||
m_treeWidget->setMaximumWidth(250);
|
||||
m_treeWidget->setHeaderHidden(true);
|
||||
|
||||
QHash<QByteArray, ElfSymbolModel *> hash = elfData->getAllSections();
|
||||
if (hash.size() > 0){
|
||||
for (const QByteArray §ion : hash.keys()){
|
||||
QTreeWidgetItem *itemSection = new QTreeWidgetItem(m_treeWidget);
|
||||
itemSection->setText(0, section);
|
||||
ElfSymbolModel *model = elfData->getSymbolsBySection(section);
|
||||
|
||||
// Add to the QListView (ViewAnalysis)
|
||||
QStandardItem *itemAnalysisSection = new QStandardItem(section);
|
||||
QFont font;
|
||||
font.setItalic(true);
|
||||
font.setBold(true);
|
||||
font.setPointSize(12);
|
||||
itemAnalysisSection->setFont(font);
|
||||
m_modelAnalyse->appendRow(itemAnalysisSection);
|
||||
|
||||
QList<struct elfSymbol *> symbols = model->getKeys();
|
||||
for (size_t i = 0; i < symbols.size(); i++){
|
||||
// Add to the QTreeWidget
|
||||
QTreeWidgetItem *subItem = new QTreeWidgetItem(itemSection);
|
||||
struct elfSymbol *symbol = symbols.at(i);
|
||||
subItem->setText(0, symbol->st_name);
|
||||
|
||||
// Add to the ViewAnalysis (QListView)
|
||||
QStandardItem *itemSymbol = new QStandardItem(symbol->st_name);
|
||||
QFont fontSymbol;
|
||||
font.setItalic(true);
|
||||
font.setPointSize(12);
|
||||
itemSymbol->setFont(fontSymbol);
|
||||
m_modelAnalyse->appendRow(itemSymbol);
|
||||
|
||||
// Dump the asm code
|
||||
QList<struct elfObjectDisas *> *disas = model->getASMCode(symbol);
|
||||
for (size_t j = 0; j < disas->size(); j++){
|
||||
struct elfObjectDisas *obj = disas->at(j);
|
||||
QStandardItem *itemASM = new QStandardItem(sanitizeASMCode(obj));
|
||||
m_modelAnalyse->appendRow(itemASM);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mainLayout->addWidget(m_treeWidget);
|
||||
mainLayout->addWidget(m_viewAnalyse);
|
||||
|
||||
widget->setLayout(mainLayout);
|
||||
@ -83,26 +89,16 @@ QString MdiElfDisassembled::sanitizeASMCode(struct elfObjectDisas *obj){
|
||||
char tabs[maxTab + 1]; /* +1 for the \0 */
|
||||
memset(tabs, 0, maxTab);
|
||||
size_t t;
|
||||
//qDebug() << hexCmd << " " << len << " " << maxTab;
|
||||
|
||||
for(t = 0; t < maxTab; t++)
|
||||
tabs[t] = ' ';
|
||||
tabs[t] = '\t';
|
||||
tabs[t + 1] = '\0';
|
||||
return "\t" + hex + "\t" + hexCmd.toUpper() + tabs + obj->cmd;
|
||||
}
|
||||
void MdiElfDisassembled::_itemClicked(const QModelIndex &model){
|
||||
int row = model.row();
|
||||
if (row != -1){
|
||||
m_viewAnalyse->clearSelection();
|
||||
|
||||
QModelIndex model = m_listModelExplorer.at(row);
|
||||
QItemSelectionModel *selection = m_viewAnalyse->selectionModel();
|
||||
selection->setCurrentIndex(model, QItemSelectionModel::Select);
|
||||
}
|
||||
}
|
||||
MdiElfDisassembled::~MdiElfDisassembled(){
|
||||
delete m_modelExplorer;
|
||||
delete m_modelAnalyse;
|
||||
delete m_viewExplorer;
|
||||
delete m_viewAnalyse;
|
||||
delete m_treeWidget;
|
||||
}
|
||||
|
||||
@ -8,6 +8,8 @@
|
||||
#include <QHeaderView>
|
||||
#include <QStandardItem>
|
||||
#include <QStandardItemModel>
|
||||
#include <QTreeWidget>
|
||||
#include <QTreeWidgetItem>
|
||||
#include "../projectelf.h"
|
||||
|
||||
/* Used for printing the ASM code */
|
||||
@ -21,15 +23,11 @@ public:
|
||||
|
||||
private:
|
||||
ProjectElf *m_projectElf;
|
||||
QListView *m_viewExplorer;
|
||||
QListView *m_viewAnalyse;
|
||||
QStandardItemModel *m_modelExplorer;
|
||||
QTreeWidget *m_treeWidget;
|
||||
QStandardItemModel *m_modelAnalyse;
|
||||
QList<QModelIndex> m_listModelExplorer;
|
||||
QString sanitizeASMCode(struct elfObjectDisas *);
|
||||
|
||||
private slots:
|
||||
void _itemClicked(const QModelIndex &);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -13,20 +13,24 @@ ElfData::ElfData() {
|
||||
m_listDynSymbols = new QList<struct elfSymbol *>;
|
||||
}
|
||||
|
||||
void ElfData::addToHash(QByteArray b, struct elfObjectDisas *obj){
|
||||
/*
|
||||
* Here, we add the item in the list
|
||||
* We create a map with the QList, a map contain an entry which contains a pointer to the QList
|
||||
*/
|
||||
if (!m_hash.contains(b)){
|
||||
m_hash[b] = new QList<struct elfObjectDisas *>;
|
||||
}
|
||||
|
||||
m_hash[b]->append(obj);
|
||||
void ElfData::newSection(QByteArray b){
|
||||
m_hashSections[b] = new ElfSymbolModel;
|
||||
}
|
||||
|
||||
QHash<QByteArray, QList<struct elfObjectDisas *> *> ElfData::getDisasCode(){
|
||||
return m_hash;
|
||||
void ElfData::setSymbol(QByteArray b, struct elfSymbol *elf, struct elfObjectDisas *disas){
|
||||
if (m_hashSections[b]){
|
||||
//qDebug() << "New symbol: " << elf->st_name;
|
||||
m_hashSections[b]->setSymbol(elf, disas);
|
||||
}
|
||||
}
|
||||
|
||||
ElfSymbolModel *ElfData::getSymbolsBySection(QByteArray b){
|
||||
if (m_hashSections[b])
|
||||
return m_hashSections[b];
|
||||
}
|
||||
|
||||
QHash<QByteArray, ElfSymbolModel *> ElfData::getAllSections(){
|
||||
return m_hashSections;
|
||||
}
|
||||
|
||||
void ElfData::setArchitecture(int a){
|
||||
@ -73,7 +77,7 @@ void ElfData::setProgramHeader(struct elfProgram *p){
|
||||
void ElfData::setSectionHeader(struct elfSection *s){
|
||||
m_listSections->append(s);
|
||||
}
|
||||
void ElfData::setSymbol(struct elfSymbol * s){
|
||||
void ElfData::setSymbol(struct elfSymbol *s){
|
||||
m_listSymbols->append(s);
|
||||
}
|
||||
void ElfData::setDynSymbols(struct elfSymbol *s){
|
||||
@ -85,6 +89,9 @@ void ElfData::setHash(struct elfHash *h){
|
||||
void ElfData::setTextSymbol(struct elfSymbol *sElfS){
|
||||
m_listTextSymbols->append(sElfS);
|
||||
}
|
||||
void ElfData::setBssSectionSize(unsigned long s){
|
||||
m_bssSectionSize = s;
|
||||
}
|
||||
|
||||
struct elfIdent *ElfData::getIdentification(){
|
||||
return m_sElfId;
|
||||
@ -110,6 +117,9 @@ QList<struct elfSymbol *> *ElfData::getTextSymbols() {
|
||||
QList<struct elfHash *> *ElfData::getHashes(){
|
||||
return m_listHashes;
|
||||
}
|
||||
unsigned long ElfData::getBssSectionSize(){
|
||||
return m_bssSectionSize;
|
||||
}
|
||||
QString ElfData::mapProgramType(int type){
|
||||
QString text;
|
||||
switch(type){
|
||||
@ -332,8 +342,11 @@ ElfData::~ElfData() {
|
||||
//for (qsizetype i = 0; i < m_listSections->size(); i++)
|
||||
// free(m_listSections->at(i));
|
||||
|
||||
for (qsizetype i = 0; i < m_listSymbols->size(); i++)
|
||||
free(m_listSymbols->at(i)->data);
|
||||
for (qsizetype i = 0; i < m_listSymbols->size(); i++){
|
||||
//qDebug() << "Freeing: " << m_listSymbols->at(i);
|
||||
//free(m_listSymbols->at(i)->data);
|
||||
//free(m_listSymbols->at(i));
|
||||
}
|
||||
|
||||
// Clean from dynamic variables from parsingelf file
|
||||
delete m_listProgs;
|
||||
@ -343,9 +356,11 @@ ElfData::~ElfData() {
|
||||
delete m_listHashes;
|
||||
delete m_listDynSymbols;
|
||||
|
||||
for (const QByteArray &key : m_hash.keys()){
|
||||
for (qsizetype i = 0; i < m_hash[key]->size(); i++)
|
||||
free(m_hash[key]->at(i));
|
||||
delete(m_hash[key]);
|
||||
if(m_hashSections.size() > 0){
|
||||
for (const QByteArray &key : m_hashSections.keys()){
|
||||
if (m_hashSections[key]){
|
||||
delete m_hashSections[key]; // delete ElfSymbolModel object
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
|
||||
#include <QList>
|
||||
#include <QStandardItem>
|
||||
#include "elf/elfsymbolmodel.h"
|
||||
#include "data.h"
|
||||
|
||||
enum Architecture{
|
||||
@ -26,6 +27,7 @@ class ElfData {
|
||||
void setSizeofElf_Ehdr(size_t);
|
||||
void setSizeofElf_Phdr(size_t);
|
||||
void setSizeofElf_Shdr(size_t);
|
||||
void setBssSectionSize(unsigned long);
|
||||
|
||||
int getArchitecture();
|
||||
struct elfIdent *getIdentification();
|
||||
@ -39,6 +41,7 @@ class ElfData {
|
||||
size_t getSizeofElf_Ehdr();
|
||||
size_t getSizeofElf_Phdr();
|
||||
size_t getSizeofElf_Shdr();
|
||||
unsigned long getBssSectionSize();
|
||||
|
||||
QString mapProgramType(int);
|
||||
QString mapSectionType(int);
|
||||
@ -49,8 +52,10 @@ class ElfData {
|
||||
QString mapMachineType(int);
|
||||
QString mapSymbolType(int);
|
||||
|
||||
void addToHash(QByteArray, struct elfObjectDisas *);
|
||||
QHash<QByteArray, QList<struct elfObjectDisas *> *> getDisasCode();
|
||||
void newSection(QByteArray);
|
||||
void setSymbol(QByteArray, struct elfSymbol *, struct elfObjectDisas *);
|
||||
ElfSymbolModel *getSymbolsBySection(QByteArray);
|
||||
QHash<QByteArray, ElfSymbolModel *> getAllSections();
|
||||
|
||||
private:
|
||||
int m_architecture;
|
||||
@ -65,7 +70,8 @@ class ElfData {
|
||||
QList<struct elfSymbol *> *m_listDynSymbols;
|
||||
QList<struct elfSymbol *> *m_listTextSymbols;
|
||||
QList<struct elfHash *> *m_listHashes;
|
||||
QHash<QByteArray, QList<struct elfObjectDisas *> *> m_hash;
|
||||
QHash<QByteArray, ElfSymbolModel *> m_hashSections;
|
||||
unsigned long m_bssSectionSize;
|
||||
};
|
||||
|
||||
#endif // ELFDATA_H
|
||||
|
||||
@ -18,24 +18,6 @@ FileInfo::FileInfo(QFile &file) {
|
||||
m_filename = info.fileName();
|
||||
QString fullPath = m_path + "/" + m_filename;
|
||||
m_rawData = NULL;
|
||||
|
||||
/* Get signature of the file */
|
||||
//QByteArray b = file.readAll();
|
||||
//m_rawData = b.data();
|
||||
//m_rawData = (char *)malloc(m_sizeFile);
|
||||
//qDebug() << "FOOO: " << b.size();
|
||||
//memcpy(m_rawData, b.data(), b.size());
|
||||
//m_rawData = b.constData();
|
||||
//m_rawData = b.data();
|
||||
//qDebug() << b[0] << b[1] << b[2] << b[3];
|
||||
//QByteArray b1 = b + 1;
|
||||
//qDebug() << b1[0] << b1[1] << b1[2] << b1[3];
|
||||
|
||||
|
||||
/*QDataStream in(&file);
|
||||
qint64 len = in.readRawData(m_rawData, m_sizeFile);
|
||||
qDebug() << len;*/
|
||||
|
||||
/*
|
||||
* I need to read the file in the old way, because with Qt functions, my buffer is corrupted
|
||||
* i do not have the full data
|
||||
|
||||
@ -149,20 +149,24 @@ void elf32ProgramHdr(int fd, Elf32_Off phoff, off_t phnum){
|
||||
|
||||
}
|
||||
bool elf64SectionHdr(const char *buffer, ElfData *elfData, size_t offset, quint16 shstrndx, int shnum){
|
||||
size_t lenShdr = sizeof(Elf64_Shdr);
|
||||
bool res = false;
|
||||
struct elfSymbol *elfSymbols = NULL;
|
||||
size_t symtabnum = 0;
|
||||
// We malloc the variable and we free it in the elfData destructor
|
||||
struct elfSection *elfS = (struct elfSection *)malloc(shnum * sizeof(struct elfSection));
|
||||
;
|
||||
if (elfS == NULL)
|
||||
return false;
|
||||
|
||||
Elf64_Shdr *shdr = (Elf64_Shdr*)(buffer + offset);
|
||||
|
||||
Elf64_Sym *symtab = NULL;
|
||||
|
||||
// Get the string table header
|
||||
Elf64_Shdr *strtab = &shdr[shstrndx];
|
||||
Elf64_Shdr *shdrtext = NULL;
|
||||
Elf64_Shdr *shdrfini = NULL;
|
||||
Elf64_Shdr *shdrhash = NULL;
|
||||
//Elf64_Shdr *shdrtext = NULL;
|
||||
//Elf64_Shdr *shdrfini = NULL;
|
||||
//Elf64_Shdr *shdrhash = NULL;
|
||||
const char *b = buffer + strtab->sh_offset;
|
||||
int indexStrTab = 0;
|
||||
int indexSymbolTab = 0;
|
||||
@ -172,6 +176,36 @@ bool elf64SectionHdr(const char *buffer, ElfData *elfData, size_t offset, quint1
|
||||
int indexHashTab = 0;
|
||||
int indexDynSymTab = 0;
|
||||
|
||||
/*
|
||||
* We need to get the .symtab and .strtab
|
||||
*/
|
||||
for (int i = 0; i < shnum; i++){
|
||||
const char *shname = b + shdr[i].sh_name;
|
||||
// .symtab
|
||||
if (shdr[i].sh_type == 0x02 && strcmp(shname, ".symtab") == 0)
|
||||
indexSymbolTab = i;
|
||||
|
||||
// .strtab for symbal name
|
||||
if (shdr[i].sh_type == 0x03 && strcmp(shname, ".strtab") == 0)
|
||||
indexStrTab = i;
|
||||
}
|
||||
|
||||
/* Get all symbols and store to the ElfData */
|
||||
res = getAllSymbols(buffer, &symtab, &elfSymbols, &symtabnum, elfData, shdr, indexStrTab, indexSymbolTab);
|
||||
if (!res){
|
||||
free(elfS);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*for (size_t i = 0; i < symtabnum; i++){
|
||||
qDebug() << "Symbol: " << symtab[i].st_value;
|
||||
}*/
|
||||
// We need to get the symbol name
|
||||
Elf64_Shdr *strTabShdr = &shdr[indexStrTab];
|
||||
// Get section for symbol table
|
||||
Elf64_Shdr *symtabShdr = &shdr[indexSymbolTab];
|
||||
|
||||
|
||||
for (int i = 0; i < shnum; i++){
|
||||
memset(&elfS[i], 0, sizeof(struct elfSection));
|
||||
|
||||
@ -186,7 +220,7 @@ bool elf64SectionHdr(const char *buffer, ElfData *elfData, size_t offset, quint1
|
||||
elfS[i].sh_info = convertFrom32bits(shdr[i].sh_info);
|
||||
elfS[i].sh_addralign = convertFrom32bits(shdr[i].sh_addralign);
|
||||
elfS[i].sh_entsize = convertFrom32bits(shdr[i].sh_entsize);
|
||||
qDebug() << elfS[i].sh_name << " " << elfS[i].sh_offset.toHex() << " " << elfS[i].sh_size.toHex();
|
||||
//qDebug() << elfS[i].sh_name << " " << elfS[i].sh_offset.toHex() << " " << elfS[i].sh_size.toHex();
|
||||
elfData->setSectionHeader(&elfS[i]);
|
||||
|
||||
const char *shname = b + shdr[i].sh_name;
|
||||
@ -201,17 +235,93 @@ bool elf64SectionHdr(const char *buffer, ElfData *elfData, size_t offset, quint1
|
||||
|
||||
if (shdr[i].sh_type == 0x01 && strcmp(shname, ".text") == 0){
|
||||
indexTextTab = i;
|
||||
/*bool r = disasSection(buffer, elfData, ".text", shdr[i].sh_offset, shdr[i].sh_size);
|
||||
if (!r)
|
||||
return r;*/
|
||||
|
||||
elfData->newSection(".text");
|
||||
|
||||
unsigned long textoffset = 0, textend = 0;
|
||||
textoffset = shdr[i].sh_offset;
|
||||
// -1 for avoiding the .fini section
|
||||
textend = shdr[i].sh_offset + shdr[i].sh_size;
|
||||
|
||||
// We get all symbols from .text section
|
||||
for (size_t i = 0; i < symtabnum; i++){
|
||||
unsigned long end = symtab[i].st_value + symtab[i].st_size;
|
||||
|
||||
if (symtab[i].st_value >= textoffset && end <= textend && symtab[i].st_value != textend){
|
||||
const char *b2 = buffer + strTabShdr->sh_offset;
|
||||
struct elfSymbol *sym = getElf64Sym(b2, symtab[i]);
|
||||
//qDebug() << sym->st_name << " " << sym->st_size.toHex() << " " << sym->st_value.toHex();
|
||||
/* Disas the asm code for the symbol and store to the elfData */
|
||||
disasSymbol(buffer, ".text", elfData, sym, symtab[i].st_value, symtab[i].st_size);
|
||||
|
||||
//if (sym)
|
||||
// free(sym);
|
||||
}
|
||||
//elfData->setTextSymbol(&(*elfS)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (shdr[i].sh_type == 0x01 && strcmp(shname, ".fini") == 0)
|
||||
if (shdr[i].sh_type == 0x01 && strcmp(shname, ".fini") == 0){
|
||||
indexFiniTab = i;
|
||||
/*bool r = disasSection(buffer, elfData, ".fini", shdr[i].sh_offset, shdr[i].sh_size);
|
||||
if (!r)
|
||||
return r;*/
|
||||
|
||||
elfData->newSection(".fini");
|
||||
|
||||
unsigned long finioffset = shdr[i].sh_offset;
|
||||
unsigned long finiend = shdr[i].sh_offset + shdr[i].sh_size;
|
||||
|
||||
for (size_t i = 0; i < symtabnum; i++){
|
||||
unsigned long end = symtab[i].st_value + symtab[i].st_size;
|
||||
|
||||
/*
|
||||
* In the following code, we identify if the symbol is located in the .text section
|
||||
* If yes, we add it to the QList<struct elfSymbol *>, that can be used for disassemble code
|
||||
*/
|
||||
if (symtab[i].st_value >= finioffset && end <= finiend && symtab[i].st_value != finiend){
|
||||
const char *b2 = buffer + strTabShdr->sh_offset;
|
||||
|
||||
struct elfSymbol *sym = getElf64Sym(b2, symtab[i]);
|
||||
|
||||
disasSymbol(buffer, ".fini", elfData, sym, symtab[i].st_value, symtab[i].st_size);
|
||||
/*if (sym)
|
||||
free(sym);*/
|
||||
}
|
||||
//elfData->setTextSymbol(&(*elfS)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// .data
|
||||
if (shdr[i].sh_type == 0x01){ }
|
||||
if (shdr[i].sh_type == 0x01 && strcmp(shname, ".data") == 0){
|
||||
/*bool r = disasSection(buffer, elfData, ".data", shdr[i].sh_offset, shdr[i].sh_size);
|
||||
if (!r)
|
||||
return r;*/
|
||||
|
||||
elfData->newSection(".data");
|
||||
}
|
||||
|
||||
// .rodata
|
||||
if (shdr[i].sh_type == 0x01 && strcmp(shname, ".rodata") == 0){
|
||||
/*bool r = disasSection(buffer, elfData, ".rodata", shdr[i].sh_offset, shdr[i].sh_size);
|
||||
if (!r)
|
||||
return r;*/
|
||||
|
||||
elfData->newSection(".rodata");
|
||||
}
|
||||
|
||||
// .hash
|
||||
if (shdr[i].sh_type == 0x05 && strcmp(shname, ".hash") == 0)
|
||||
if (shdr[i].sh_type == 0x05 && strcmp(shname, ".hash") == 0) {
|
||||
indexHashTab = i;
|
||||
/*bool r = disasSection(buffer, elfData, ".hash", shdr[i].sh_offset, shdr[i].sh_size);
|
||||
if (!r)
|
||||
return r;*/
|
||||
|
||||
elfData->newSection(".hash");
|
||||
}
|
||||
|
||||
if (shdr[i].sh_type == 0xb && strcmp(shname, ".dynsym") == 0)
|
||||
indexDynSymTab = i;
|
||||
@ -220,41 +330,69 @@ bool elf64SectionHdr(const char *buffer, ElfData *elfData, size_t offset, quint1
|
||||
indexDynStrTab = i;
|
||||
|
||||
// .bss
|
||||
if (shdr[i].sh_type == 0x08){
|
||||
//qDebug() << b + shdr[i].sh_name;
|
||||
//char *bss = (char *)malloc(shdr[i].sh_size);
|
||||
//memcpy(bss, buffer + shdr[i].sh_offset, shdr[i].sh_size);
|
||||
//free(bss);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Get all symbols in the .text section
|
||||
shdrtext = &shdr[indexTextTab];
|
||||
shdrfini = &shdr[indexFiniTab];
|
||||
|
||||
if (shdr[i].sh_type == 0x08 && strcmp(shname, ".bss") == 0) {
|
||||
/*
|
||||
* Not needed to use shdrfini->sh_offset for the range of the .text
|
||||
* We can add shdrtext->sh_offset + shdrtext->sh_size
|
||||
* Add the .bss section size to ElfData.
|
||||
* Should be printed into the caracteristics widgets
|
||||
*/
|
||||
/*
|
||||
* We can try for each symbols, to get the section .text, .data, .rodata
|
||||
* getTextSections, getRodataSections, getDataSections, etc. and push to a QList
|
||||
*/
|
||||
|
||||
// Get all symbols
|
||||
res = getSymbols(buffer, elfData, shdr, indexStrTab, indexSymbolTab, shdrtext->sh_offset, shdrfini->sh_offset);
|
||||
if (!res)
|
||||
return false;
|
||||
elfData->setBssSectionSize(shdr[i].sh_size);
|
||||
}
|
||||
}
|
||||
|
||||
// Get dynsym tab
|
||||
getDynSym(buffer, elfData, shdr, indexDynSymTab, indexDynStrTab, indexHashTab); // Segmentation fault
|
||||
getDynSym(buffer, elfData, shdr, indexDynSymTab, indexDynStrTab, indexHashTab);
|
||||
|
||||
// Hash table
|
||||
shdrhash = &shdr[indexHashTab];
|
||||
//shdrhash = &shdr[indexHashTab];
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* In this function, we get all symbols. A symbol is stored in the struct elfSymbol.\
|
||||
* Each of them are stored in the ElfData
|
||||
*
|
||||
* Return false if any errors occurs and true if not
|
||||
*/
|
||||
bool getAllSymbols(const char *buffer, Elf64_Sym **symtab, struct elfSymbol **elfS, size_t *symtabnum, ElfData *elfData, Elf64_Shdr *shdr, int indexStrTab, int indexSymbolTab){
|
||||
// Get section string table
|
||||
Elf64_Shdr *strTabShdr = &shdr[indexStrTab];
|
||||
// Get section for symbol table
|
||||
Elf64_Shdr *symtabShdr = &shdr[indexSymbolTab];
|
||||
|
||||
const char *b2 = buffer + strTabShdr->sh_offset;
|
||||
//Elf64_Sym *symtab = (Elf64_Sym*)(buffer + shdr[indexSymbolTab].sh_offset);
|
||||
*symtab = (Elf64_Sym*)(buffer + shdr[indexSymbolTab].sh_offset);
|
||||
*symtabnum = symtabShdr->sh_size / sizeof(Elf64_Sym);
|
||||
|
||||
/*
|
||||
* Should be clean in the destructor in ElfData class
|
||||
*/
|
||||
*elfS = (struct elfSymbol *)malloc(*symtabnum * sizeof(struct elfSymbol));
|
||||
if (!*elfS){
|
||||
qDebug() << "Failed to allocate memory";
|
||||
*elfS = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < *symtabnum; i++){
|
||||
memset(&(*elfS)[i], 0, sizeof(struct elfSymbol));
|
||||
|
||||
// Get the data block from the buffer with the st_value which indicate the offset and the st_size
|
||||
(*elfS)[i].st_name = QByteArray(b2 + (*symtab)[i].st_name);
|
||||
(*elfS)[i].st_info = (*symtab)[i].st_info;
|
||||
(*elfS)[i].st_other = (*symtab)[i].st_other;
|
||||
(*elfS)[i].st_size = convertFrom64bits((*symtab)[i].st_size);
|
||||
(*elfS)[i].st_shndx = convertFrom16bits((*symtab)[i].st_shndx);
|
||||
(*elfS)[i].st_value = convertFrom64bits((*symtab)[i].st_value);
|
||||
|
||||
elfData->setSymbol(&(*elfS)[i]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* This function decode the dynamic symbol
|
||||
*/
|
||||
bool getDynSym(const char *buffer, ElfData *elfData, Elf64_Shdr *shdr, int indexDynSymTab, int indexDynStrTab, int indexHashTab){
|
||||
Elf64_Shdr *shdrdynsym = &shdr[indexDynSymTab];
|
||||
Elf64_Shdr *shdrDynStr = &shdr[indexDynStrTab];
|
||||
@ -265,19 +403,17 @@ bool getDynSym(const char *buffer, ElfData *elfData, Elf64_Shdr *shdr, int index
|
||||
Elf64_Sym *symtab = (Elf64_Sym*)(buffer + shdrdynsym->sh_offset);
|
||||
size_t symtabnum = shdrdynsym->sh_size / shdrdynsym->sh_entsize;
|
||||
|
||||
struct elfSymbol *elfS = (struct elfSymbol*)malloc(symtabnum * sizeof(elfSymbol));
|
||||
struct elfSymbol *elfS = (struct elfSymbol*)malloc(symtabnum * sizeof(struct elfSymbol));
|
||||
if (elfS == NULL){
|
||||
qDebug() << "Failed to allocate memory";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
for (size_t i = 0; i < symtabnum; i++){
|
||||
memset(&elfS[i], 0, sizeof(struct elfSymbol));
|
||||
|
||||
// Get the data block from the buffer with the st_value which indicate the offset and the st_size
|
||||
elfS[i].st_name = QByteArray(b2 + symtab[i].st_name);
|
||||
//qDebug() << elfS[i].st_name ;
|
||||
elfS[i].st_info = symtab[i].st_info;
|
||||
elfS[i].st_other = symtab[i].st_other;
|
||||
elfS[i].st_size = convertFrom64bits(symtab[i].st_size);
|
||||
@ -288,73 +424,65 @@ bool getDynSym(const char *buffer, ElfData *elfData, Elf64_Shdr *shdr, int index
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool getSymbols(const char *buffer, ElfData *elfData, Elf64_Shdr *shdr, int indexStrTab, int indexSymbolTab, int offsetText, int offsetFini){
|
||||
// Get section string table
|
||||
Elf64_Shdr *strTabShdr = &shdr[indexStrTab];
|
||||
// Get section for symbol table
|
||||
Elf64_Shdr *symtabShdr = &shdr[indexSymbolTab];
|
||||
|
||||
const char *b2 = buffer + strTabShdr->sh_offset;
|
||||
Elf64_Sym *symtab = (Elf64_Sym*)(buffer + shdr[indexSymbolTab].sh_offset);
|
||||
size_t symtabnum = symtabShdr->sh_size / sizeof(Elf64_Sym);
|
||||
/*
|
||||
* In this function, we create the new struct elfSymbol, that contains informations regarding the elf
|
||||
* the variable "b" contains the name of the symbol.
|
||||
* The elfS object will be freed in the destructor of ElfSymbolModel
|
||||
*/
|
||||
struct elfSymbol *getElf64Sym(const char *b, const Elf64_Sym symtab){
|
||||
struct elfSymbol *elfS = (struct elfSymbol *)malloc(sizeof(struct elfSymbol));
|
||||
if (!elfS){
|
||||
qDebug() << "NULL";
|
||||
return NULL;
|
||||
}
|
||||
memset(elfS, 0, sizeof(struct elfSymbol));
|
||||
|
||||
struct elfSymbol *elfS = (struct elfSymbol*)malloc(symtabnum * sizeof(elfSymbol));
|
||||
if (elfS == NULL){
|
||||
qDebug() << "Failed to allocate memory";
|
||||
elfS->st_name = b + symtab.st_name;
|
||||
elfS->st_info = symtab.st_info;
|
||||
elfS->st_other = symtab.st_other;
|
||||
elfS->st_size = convertFrom64bits(symtab.st_size);
|
||||
elfS->st_shndx = convertFrom16bits(symtab.st_shndx);
|
||||
elfS->st_value = convertFrom64bits(symtab.st_value);
|
||||
return elfS;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function decode the buffer into asm code with the function disas_asm (binutils)
|
||||
* The asm decoded is the symbol code located at the offset specified in argument of the function
|
||||
* The result is store in struct elfObjectDisas
|
||||
*/
|
||||
bool disasSymbol(const char *buffer, QByteArray b, ElfData *elfData, struct elfSymbol *elfS, unsigned long long offset, unsigned long long size){
|
||||
struct dataDisas *sData;
|
||||
|
||||
//size += 1;
|
||||
|
||||
unsigned char *tmp = (unsigned char*)malloc(size);
|
||||
memcpy(tmp, buffer + offset, size);
|
||||
sData = disas_asm(tmp, offset, size);
|
||||
|
||||
if (!sData){
|
||||
sData = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < symtabnum; i++){
|
||||
memset(&elfS[i], 0, sizeof(struct elfSymbol));
|
||||
|
||||
// Get the data block from the buffer with the st_value which indicate the offset and the st_size
|
||||
elfS[i].st_name = QByteArray(b2 + symtab[i].st_name);
|
||||
elfS[i].st_info = symtab[i].st_info;
|
||||
elfS[i].st_other = symtab[i].st_other;
|
||||
elfS[i].st_size = convertFrom64bits(symtab[i].st_size);
|
||||
elfS[i].st_shndx = convertFrom16bits(symtab[i].st_shndx);
|
||||
elfS[i].st_value = convertFrom64bits(symtab[i].st_value);
|
||||
|
||||
//qDebug() << elfS[i].st_name << " " << elfS[i].st_info << " " << symtab[i].st_size;
|
||||
if (symtab[i].st_size > 0){
|
||||
elfS[i].data = (char*)malloc(symtab[i].st_size);
|
||||
memcpy(elfS[i].data, buffer + symtab[i].st_value, symtab[i].st_size);
|
||||
elfS[i].size = symtab[i].st_size;
|
||||
|
||||
// We are going to the get Assembly code
|
||||
struct dataDisas *sData = disas_asm((unsigned char*)elfS[i].data, symtab[i].st_value, elfS[i].size);
|
||||
|
||||
if (sData == NULL){
|
||||
qDebug() << "Failed to get the assembly code";
|
||||
// I must freeing elfS structures
|
||||
/*for (size_t i = 0; i < symtabnum; i++)
|
||||
free(&elfS[i]);*/
|
||||
free(elfS);
|
||||
elfS = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Nous allons decoder les fonctions des symbols
|
||||
* Pourquoi pas les variables
|
||||
*/
|
||||
int type = (elfS[i].st_info) & 0xf;
|
||||
//qDebug() << elfS[i].st_name << " " << elfS[i].st_info <<" " << type;
|
||||
|
||||
/*
|
||||
* We will create a new list which will contains a struct elfObjectDisas
|
||||
* and that structure store all disassembled code
|
||||
* After, the entry index in struct elfSymbol is in index to the struct elfObjectDisas
|
||||
*/
|
||||
elfS[i].countEntries = sData->countEntries;
|
||||
//QList<struct elfObjectDisas *> *list = new QList<struct elfObjectDisas*>;
|
||||
//qDebug() << elfS[i].st_name;
|
||||
|
||||
// Create new entry
|
||||
for (int j = 0; j < sData->countEntries; j++){
|
||||
// Where I freeing the following structure ????
|
||||
/*
|
||||
* The following structure is deleted in the destructor of the ElfData
|
||||
* The object is stored in a QHash objects
|
||||
*/
|
||||
struct elfObjectDisas *sElfObjectDisas = new struct elfObjectDisas;
|
||||
|
||||
if (sElfObjectDisas == nullptr){
|
||||
//free(sData->s_object_asm->hexCmd);
|
||||
free(sData->s_object_asm);
|
||||
free(sData);
|
||||
sData = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(sElfObjectDisas, 0, sizeof(struct sElfObjectDisas *));
|
||||
|
||||
sElfObjectDisas->cmd = QByteArray(
|
||||
sData->s_object_asm[j].cmd,
|
||||
strlen(sData->s_object_asm[j].cmd)
|
||||
@ -366,44 +494,78 @@ bool getSymbols(const char *buffer, ElfData *elfData, Elf64_Shdr *shdr, int inde
|
||||
);
|
||||
sElfObjectDisas->octets = sData->s_object_asm[j].octets;
|
||||
sElfObjectDisas->addr = sData->s_object_asm[j].addr;
|
||||
//qDebug() << sElfObjectDisas->hexCmd;
|
||||
//list->append(sElfObjectDisas);
|
||||
if (type == 2){
|
||||
elfData->addToHash(elfS[i].st_name, sElfObjectDisas);
|
||||
}
|
||||
}
|
||||
// Store the symbol disassembled code and get the index
|
||||
//elfS[i].entry = elfData->setSymbolDisassembled(list);
|
||||
|
||||
/*
|
||||
* We don't need it anymore, we could clean our sData which contains the disas code
|
||||
*/
|
||||
free(sData->s_object_asm->hexCmd);
|
||||
elfData->setSymbol(b, elfS, sElfObjectDisas);
|
||||
}
|
||||
|
||||
//free(sData->s_object_asm->hexCmd);
|
||||
free(sData->s_object_asm);
|
||||
free(sData);
|
||||
}
|
||||
|
||||
elfData->setSymbol(&elfS[i]);
|
||||
//qDebug() << b2 + symtab[i].st_name << " " << symtab[i].st_value << " " << offsetText << " " << offsetFini;
|
||||
//qDebug() << b2 + symtab[i].st_name << " " << symtab[i].st_value << " " << symtab[i].st_size;
|
||||
// We check if the symbol is in the .text section
|
||||
if (symtab[i].st_value >= offsetText && symtab[i].st_value <= offsetFini){
|
||||
elfData->setTextSymbol(&elfS[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can push the symbols to the correct list
|
||||
* For instance, if symtab[i].st_name == .rodata, we push to the QList
|
||||
* Also, we can check with the size of the symbols
|
||||
* size_t l = symtab[i].st_value + symtab[i].st_size
|
||||
*/
|
||||
}
|
||||
sData = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
void getSymbolsText(struct elfSection *sElfS, int indexTextTab, int inexFiniTab){
|
||||
|
||||
/*
|
||||
* This function decode the buffer into asm code with the function disas_asm (binutils)
|
||||
* The result is store in struct elfObjectDisas
|
||||
*/
|
||||
bool disasSection(const char *buffer, ElfData *elfData, const QByteArray b, quint64 offset, quint64 size){
|
||||
struct dataDisas *sData;
|
||||
|
||||
unsigned char *tmp = (unsigned char*)malloc(size);
|
||||
memcpy(tmp, buffer + offset, size);
|
||||
sData = disas_asm(tmp, offset, size);
|
||||
|
||||
if (!sData){
|
||||
sData = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int j = 0; j < sData->countEntries; j++){
|
||||
/*
|
||||
* The following structure is deleted in the destructor of the ElfData
|
||||
* The object is stored in a QHash objects
|
||||
*/
|
||||
struct elfObjectDisas *sElfObjectDisas = new struct elfObjectDisas;
|
||||
|
||||
if (sElfObjectDisas == nullptr){
|
||||
free(sData->s_object_asm->hexCmd);
|
||||
free(sData->s_object_asm);
|
||||
free(sData);
|
||||
sData = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(sElfObjectDisas, 0, sizeof(struct sElfObjectDisas *));
|
||||
|
||||
sElfObjectDisas->cmd = QByteArray(
|
||||
sData->s_object_asm[j].cmd,
|
||||
strlen(sData->s_object_asm[j].cmd)
|
||||
);
|
||||
|
||||
sElfObjectDisas->hexCmd = QByteArray(
|
||||
sData->s_object_asm[j].hexCmd,
|
||||
sData->s_object_asm[j].octets
|
||||
);
|
||||
sElfObjectDisas->octets = sData->s_object_asm[j].octets;
|
||||
sElfObjectDisas->addr = sData->s_object_asm[j].addr;
|
||||
//qDebug() << sElfObjectDisas->hexCmd.toHex();
|
||||
|
||||
//QString addr;
|
||||
//addr.setNum(sElfObjectDisas->addr, 16);
|
||||
|
||||
//elfData->setSection(b, sElfObjectDisas);
|
||||
}
|
||||
|
||||
//free(sData->s_object_asm->hexCmd);
|
||||
free(sData->s_object_asm);
|
||||
free(sData);
|
||||
sData = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getHashes(const char *buffer, ElfData *elfData){
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -41,10 +41,12 @@ bool elf64ProgramHdr(const char *, ElfData *, size_t, int);
|
||||
void elf32ProgramHdr(int, Elf32_Off, off_t);
|
||||
bool elf64SectionHdr(const char *, ElfData *, size_t, quint16, int);
|
||||
void elf32SectionHdr(int, Elf32_Off, off_t);
|
||||
bool getSymbols(const char *, ElfData *, Elf64_Shdr *, int, int, int, int);
|
||||
bool disasSymbol(const char *, QByteArray, ElfData *, struct elfSymbol *, unsigned long long, unsigned long long);
|
||||
bool disasSection(const char *, ElfData *, const QByteArray, quint64, quint64);
|
||||
bool getAllSymbols(const char *, Elf64_Sym **, struct elfSymbol **, size_t *, ElfData *, Elf64_Shdr *, int, int);
|
||||
bool getDynSym(const char *, ElfData *, Elf64_Shdr *, int, int, int);
|
||||
void getSymbolsText(struct elfSection *, int, int);
|
||||
bool getHashes(const char *, ElfData *);
|
||||
struct elfSymbol *getElf64Sym(const char *, const Elf64_Sym);
|
||||
QByteArray convertFrom16bits(quint16);
|
||||
QByteArray convertFrom32bits(quint32);
|
||||
QByteArray convertFrom64bits(quint64);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user