From ece4373a04b7e6b5bb9b50782c8e86900bcedbe7 Mon Sep 17 00:00:00 2001 From: Mstik Date: Thu, 23 Jun 2022 07:34:10 -1200 Subject: [PATCH] Base ARM64 Implementation --- .gitignore | 4 ++- LittleXrefs/src/ILXTool.cpp | 10 ++++-- LittleXrefs/src/ILXTool.h | 11 +++++-- ...ferenceEngine.cpp => IReferenceEngine.cpp} | 32 +++++++++++-------- LittleXrefs/src/IReferenceEngine.h | 31 ++++++++++++++++++ LittleXrefs/src/LittleXrefs.vcxproj | 4 +-- LittleXrefs/src/LittleXrefs.vcxproj.filters | 4 +-- LittleXrefs/src/ReferenceEngine.h | 24 -------------- LittleXrefs/src/main.cpp | 2 +- 9 files changed, 75 insertions(+), 47 deletions(-) rename LittleXrefs/src/{ReferenceEngine.cpp => IReferenceEngine.cpp} (78%) create mode 100644 LittleXrefs/src/IReferenceEngine.h delete mode 100644 LittleXrefs/src/ReferenceEngine.h diff --git a/.gitignore b/.gitignore index 8dd4607..2def1b7 100644 --- a/.gitignore +++ b/.gitignore @@ -395,4 +395,6 @@ FodyWeavers.xsd *.msp # JetBrains Rider -*.sln.iml \ No newline at end of file +*.sln.iml + +DevEnv/ \ No newline at end of file diff --git a/LittleXrefs/src/ILXTool.cpp b/LittleXrefs/src/ILXTool.cpp index 1f2c70d..e96e6ca 100644 --- a/LittleXrefs/src/ILXTool.cpp +++ b/LittleXrefs/src/ILXTool.cpp @@ -1,6 +1,6 @@ #include "ILXTool.h" #include "Function.h" -#include "ReferenceEngine.h" +#include "IReferenceEngine.h" #include "FunctionReferenceList.h" #include #include @@ -110,6 +110,12 @@ void ILXTool::Run() FindReferences(typeName, offset, funcRefsLists); funcRefsLists.Print(); - system("pause"); + _getch(); } } + +LXARM64Tool::LXARM64Tool(LittleXrefs* pLXRefs) + : ILXTool(pLXRefs, CS_ARCH_ARM64, CS_MODE_ARM) +{ + RefsEngine = new Arm64ReferenceEngine(GetCapstoneHandle()); +} diff --git a/LittleXrefs/src/ILXTool.h b/LittleXrefs/src/ILXTool.h index 2b402ea..58bad37 100644 --- a/LittleXrefs/src/ILXTool.h +++ b/LittleXrefs/src/ILXTool.h @@ -9,7 +9,7 @@ using namespace LX; struct FunctionReferenceList; struct Function; -struct ReferenceEngine; +struct IReferenceEngine; class ILXTool { @@ -19,7 +19,7 @@ class ILXTool std::vector allFunctions; void ParseAllFunction(); protected: - ReferenceEngine* RefsEngine; + IReferenceEngine* RefsEngine; public: ILXTool(LittleXrefs* _pLXRefs, cs_arch arch, cs_mode archMode); ~ILXTool(); @@ -38,3 +38,10 @@ class LXARMTool : public ILXTool { ~LXARMTool(); }; +class LXARM64Tool : public ILXTool { +public: + LXARM64Tool(LittleXrefs* pLXRefs); + ~LXARM64Tool(); +}; + + diff --git a/LittleXrefs/src/ReferenceEngine.cpp b/LittleXrefs/src/IReferenceEngine.cpp similarity index 78% rename from LittleXrefs/src/ReferenceEngine.cpp rename to LittleXrefs/src/IReferenceEngine.cpp index 407b32c..7ea9bcb 100644 --- a/LittleXrefs/src/ReferenceEngine.cpp +++ b/LittleXrefs/src/IReferenceEngine.cpp @@ -1,19 +1,15 @@ -#include "ReferenceEngine.h" +#include "IReferenceEngine.h" #include "FunctionReferenceList.h" #include "Function.h" #include "CapstoneHelper.h" -ReferenceEngine::ReferenceEngine(csh _CapstoneDisasm) +IReferenceEngine::IReferenceEngine(csh _CapstoneDisasm, uint16_t _abiRegBase) : CapstoneHandle(_CapstoneDisasm) + , abiRegBase(_abiRegBase) { } -ArmReferenceEngine::ArmReferenceEngine(csh CapstoneDisasm) - :ReferenceEngine(CapstoneDisasm) -{ -} - -void ArmReferenceEngine::FindRefereces(Function* pFunc, const std::string& typeName, uint64_t offset, FunctionReferenceList& outRefsLists) +void IReferenceEngine::FindRefereces(Function* pFunc, const std::string& typeName, uint64_t offset, FunctionReferenceList& outRefsLists) { std::vector matchingTypenameParamsId; @@ -27,13 +23,19 @@ void ArmReferenceEngine::FindRefereces(Function* pFunc, const std::string& typeN cs_insn* pDisasmdInstEnd = pDisasmdInst + count; for (uint16_t currParamId : matchingTypenameParamsId) - FindRefereces(pFunc, pDisasmdInst, pDisasmdInstEnd, (uint16_t)(arm_reg::ARM_REG_R0 + currParamId), offset, outRefsLists); + FindRefereces(pFunc, pDisasmdInst, pDisasmdInstEnd, (uint16_t)(abiRegBase + currParamId), offset, outRefsLists); cs_free(pDisasmdInst, count); } } } +ArmReferenceEngine::ArmReferenceEngine(csh CapstoneDisasm) + : IReferenceEngine(CapstoneDisasm, ARM_REG_R0) +{ +} +//arm_reg::ARM_REG_R0 + void ArmReferenceEngine::FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) { for (cs_insn* pCurrInst = pStart; pCurrInst < pEnd; pCurrInst++) @@ -100,9 +102,13 @@ void ArmReferenceEngine::FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn return; } -void ArmReferenceEngine::FindRefereces(unsigned char* pEntry, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) +Arm64ReferenceEngine::Arm64ReferenceEngine(csh CapstoneDisasm) + : IReferenceEngine(CapstoneDisasm, ARM64_REG_X0) +{ + +} + +void Arm64ReferenceEngine::FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) { - - - + } diff --git a/LittleXrefs/src/IReferenceEngine.h b/LittleXrefs/src/IReferenceEngine.h new file mode 100644 index 0000000..d4c85c7 --- /dev/null +++ b/LittleXrefs/src/IReferenceEngine.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +struct Function; +struct FunctionReferenceList; + +struct IReferenceEngine +{ + csh CapstoneHandle; + uint16_t abiRegBase; + + IReferenceEngine(csh CapstoneDisasm, uint16_t abiRegBase); + + virtual void FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) = 0; + void FindRefereces(Function* pFunc, const std::string& typeName, uint64_t offset, FunctionReferenceList& outRefsLists); +}; + +struct ArmReferenceEngine : IReferenceEngine { + ArmReferenceEngine(csh CapstoneDisasm); + + void FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) override; +}; + +struct Arm64ReferenceEngine : IReferenceEngine { + Arm64ReferenceEngine(csh CapstoneDisasm); + + void FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists) override; +}; + diff --git a/LittleXrefs/src/LittleXrefs.vcxproj b/LittleXrefs/src/LittleXrefs.vcxproj index d47034e..bd29409 100644 --- a/LittleXrefs/src/LittleXrefs.vcxproj +++ b/LittleXrefs/src/LittleXrefs.vcxproj @@ -27,7 +27,7 @@ - + @@ -39,7 +39,7 @@ - + 15.0 diff --git a/LittleXrefs/src/LittleXrefs.vcxproj.filters b/LittleXrefs/src/LittleXrefs.vcxproj.filters index d73fb9b..d30910f 100644 --- a/LittleXrefs/src/LittleXrefs.vcxproj.filters +++ b/LittleXrefs/src/LittleXrefs.vcxproj.filters @@ -36,7 +36,7 @@ Header Files - + Header Files @@ -68,7 +68,7 @@ Source Files - + Source Files diff --git a/LittleXrefs/src/ReferenceEngine.h b/LittleXrefs/src/ReferenceEngine.h deleted file mode 100644 index e4503ee..0000000 --- a/LittleXrefs/src/ReferenceEngine.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include - -struct Function; -struct FunctionReferenceList; - -struct ReferenceEngine -{ - csh CapstoneHandle; - - ReferenceEngine(csh CapstoneDisasm); - virtual void FindRefereces(Function* pFunc, const std::string& typeName, uint64_t offset, FunctionReferenceList& outRefsLists) = 0; // (candidateFunc, className, offset, ppOutReferenceList) -}; - -struct ArmReferenceEngine : ReferenceEngine { - ArmReferenceEngine(csh CapstoneDisasm); - - void FindRefereces(Function* pFunc, const std::string& typeName, uint64_t offset, FunctionReferenceList& outRefsLists) override; - void FindRefereces(Function* pFunc, cs_insn* pStart, cs_insn* pEnd, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists); - void FindRefereces(unsigned char* pEntry, uint16_t trackReg, uint64_t offset, FunctionReferenceList& outRefsLists); -}; - diff --git a/LittleXrefs/src/main.cpp b/LittleXrefs/src/main.cpp index 568dbcc..4b9ad46 100644 --- a/LittleXrefs/src/main.cpp +++ b/LittleXrefs/src/main.cpp @@ -9,7 +9,7 @@ int main() exit(1); } - ILXTool* pIlxTool = new LXARMTool(LX::g_pLXrefs); + ILXTool* pIlxTool = new LXARM64Tool(LX::g_pLXrefs); pIlxTool->Run(); } \ No newline at end of file