Skip to content

Commit

Permalink
Base ARM64 Implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
pinwhell committed Jun 23, 2022
1 parent 00bc253 commit ece4373
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 47 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -395,4 +395,6 @@ FodyWeavers.xsd
*.msp

# JetBrains Rider
*.sln.iml
*.sln.iml

DevEnv/
10 changes: 8 additions & 2 deletions LittleXrefs/src/ILXTool.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "ILXTool.h"
#include "Function.h"
#include "ReferenceEngine.h"
#include "IReferenceEngine.h"
#include "FunctionReferenceList.h"
#include <iostream>
#include <conio.h>
Expand Down Expand Up @@ -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());
}
11 changes: 9 additions & 2 deletions LittleXrefs/src/ILXTool.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ using namespace LX;

struct FunctionReferenceList;
struct Function;
struct ReferenceEngine;
struct IReferenceEngine;

class ILXTool
{
Expand All @@ -19,7 +19,7 @@ class ILXTool
std::vector<Function*> allFunctions;
void ParseAllFunction();
protected:
ReferenceEngine* RefsEngine;
IReferenceEngine* RefsEngine;
public:
ILXTool(LittleXrefs* _pLXRefs, cs_arch arch, cs_mode archMode);
~ILXTool();
Expand All @@ -38,3 +38,10 @@ class LXARMTool : public ILXTool {
~LXARMTool();
};

class LXARM64Tool : public ILXTool {
public:
LXARM64Tool(LittleXrefs* pLXRefs);
~LXARM64Tool();
};


Original file line number Diff line number Diff line change
@@ -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<uint16_t> matchingTypenameParamsId;

Expand All @@ -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++)
Expand Down Expand Up @@ -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)
{




}
31 changes: 31 additions & 0 deletions LittleXrefs/src/IReferenceEngine.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include <capstone/capstone.h>
#include <string>

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;
};

4 changes: 2 additions & 2 deletions LittleXrefs/src/LittleXrefs.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<ClInclude Include="LittleXrefs.h" />
<ClInclude Include="Parameter.h" />
<ClInclude Include="Reference.h" />
<ClInclude Include="ReferenceEngine.h" />
<ClInclude Include="IReferenceEngine.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="CapstoneHelper.cpp" />
Expand All @@ -39,7 +39,7 @@
<ClCompile Include="main.cpp" />
<ClCompile Include="Parameter.cpp" />
<ClCompile Include="Reference.cpp" />
<ClCompile Include="ReferenceEngine.cpp" />
<ClCompile Include="IReferenceEngine.cpp" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
Expand Down
4 changes: 2 additions & 2 deletions LittleXrefs/src/LittleXrefs.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<ClInclude Include="Parameter.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ReferenceEngine.h">
<ClInclude Include="IReferenceEngine.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="CapstoneHelper.h">
Expand Down Expand Up @@ -68,7 +68,7 @@
<ClCompile Include="Parameter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ReferenceEngine.cpp">
<ClCompile Include="IReferenceEngine.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CapstoneHelper.cpp">
Expand Down
24 changes: 0 additions & 24 deletions LittleXrefs/src/ReferenceEngine.h

This file was deleted.

2 changes: 1 addition & 1 deletion LittleXrefs/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ int main()
exit(1);
}

ILXTool* pIlxTool = new LXARMTool(LX::g_pLXrefs);
ILXTool* pIlxTool = new LXARM64Tool(LX::g_pLXrefs);

pIlxTool->Run();
}

0 comments on commit ece4373

Please sign in to comment.