Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit b08d09a

Browse files
committed
Dump disasm line by line, changes to dumping bytes to xml
1 parent 379d9d2 commit b08d09a

File tree

4 files changed

+67
-61
lines changed

4 files changed

+67
-61
lines changed

src/tools/r2rdump/CoreDisTools.cs

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,36 +42,17 @@ public enum TargetArch
4242
[DllImport(_dll)]
4343
public static extern void FinishDisasm(IntPtr Disasm);
4444

45-
public unsafe static string GetCodeBlock(IntPtr Disasm, RuntimeFunction rtf, int imageOffset, byte[] image)
45+
public unsafe static int GetInstruction(IntPtr Disasm, RuntimeFunction rtf, int imageOffset, int rtfOffset, byte[] image, out string instr)
4646
{
47-
StringBuilder sb = new StringBuilder();
48-
49-
int rtfOffset = 0;
50-
int codeOffset = rtf.CodeOffset;
51-
Dictionary<int, GcInfo.GcTransition> transitions = rtf.Method.GcInfo.Transitions;
52-
GcSlotTable slotTable = rtf.Method.GcInfo.SlotTable;
53-
while (rtfOffset < rtf.Size)
47+
int instrSize = 1;
48+
fixed (byte* p = image)
5449
{
55-
int instrSize = 1;
56-
fixed (byte* p = image)
57-
{
58-
IntPtr ptr = (IntPtr)(p + imageOffset + rtfOffset);
59-
instrSize = DumpInstruction(Disasm, (ulong)(rtf.StartAddress + rtfOffset), ptr, rtf.Size);
60-
}
61-
IntPtr pBuffer = GetOutputBuffer();
62-
string instr = Marshal.PtrToStringAnsi(pBuffer);
63-
64-
sb.Append(instr);
65-
if (transitions.ContainsKey(codeOffset))
66-
{
67-
sb.AppendLine($"\t\t\t\t{transitions[codeOffset].GetSlotState(slotTable)}");
68-
}
69-
70-
ClearOutputBuffer();
71-
rtfOffset += instrSize;
72-
codeOffset += instrSize;
50+
IntPtr ptr = (IntPtr)(p + imageOffset + rtfOffset);
51+
instrSize = DumpInstruction(Disasm, (ulong)(rtf.StartAddress + rtfOffset), ptr, rtf.Size);
7352
}
74-
return sb.ToString();
53+
IntPtr pBuffer = GetOutputBuffer();
54+
instr = Marshal.PtrToStringAnsi(pBuffer);
55+
return instrSize;
7556
}
7657

7758
public static IntPtr GetDisasm(Machine machine)

src/tools/r2rdump/R2RDump.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ abstract class Dumper
3434
abstract internal void DumpAllMethods();
3535
abstract internal void DumpMethod(R2RMethod method, XmlNode parentNode = null);
3636
abstract internal void DumpRuntimeFunction(RuntimeFunction rtf, XmlNode parentNode = null);
37-
abstract internal void DumpBytes(int rva, uint size, XmlNode parentNode = null, bool convertToOffset = true);
37+
abstract internal unsafe void DumpDisasm(IntPtr Disasm, RuntimeFunction rtf, int imageOffset, byte[] image, XmlNode parentNode = null);
38+
abstract internal void DumpBytes(int rva, uint size, XmlNode parentNode = null, string name = "Raw", bool convertToOffset = true);
3839
abstract internal void DumpSectionContents(R2RSection section, XmlNode parentNode = null);
3940
abstract internal XmlNode DumpQueryCount(string q, string title, int count);
4041
}

src/tools/r2rdump/TextDumper.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ internal override void DumpMethod(R2RMethod method, XmlNode parentNode = null)
126126

127127
if (_raw)
128128
{
129-
DumpBytes(method.GcInfo.Offset, (uint)method.GcInfo.Size, null, false);
129+
DumpBytes(method.GcInfo.Offset, (uint)method.GcInfo.Size, null, "", false);
130130
}
131131
}
132132
SkipLine();
@@ -147,8 +147,7 @@ internal override void DumpRuntimeFunction(RuntimeFunction rtf, XmlNode parentNo
147147

148148
if (_disasm)
149149
{
150-
string disassembly = CoreDisTools.GetCodeBlock(_disassembler, rtf, _r2r.GetOffset(rtf.StartAddress), _r2r.Image);
151-
_writer.Write(disassembly);
150+
DumpDisasm(_disassembler, rtf, _r2r.GetOffset(rtf.StartAddress), _r2r.Image);
152151
}
153152

154153
if (_raw)
@@ -168,10 +167,33 @@ internal override void DumpRuntimeFunction(RuntimeFunction rtf, XmlNode parentNo
168167
SkipLine();
169168
}
170169

170+
internal unsafe override void DumpDisasm(IntPtr Disasm, RuntimeFunction rtf, int imageOffset, byte[] image, XmlNode parentNode = null)
171+
{
172+
int rtfOffset = 0;
173+
int codeOffset = rtf.CodeOffset;
174+
Dictionary<int, GcInfo.GcTransition> transitions = rtf.Method.GcInfo.Transitions;
175+
GcSlotTable slotTable = rtf.Method.GcInfo.SlotTable;
176+
while (rtfOffset < rtf.Size)
177+
{
178+
string instr;
179+
int instrSize = CoreDisTools.GetInstruction(Disasm, rtf, imageOffset, rtfOffset, image, out instr);
180+
181+
_writer.Write(instr);
182+
if (transitions.ContainsKey(codeOffset))
183+
{
184+
_writer.WriteLine($"\t\t\t\t{transitions[codeOffset].GetSlotState(slotTable)}");
185+
}
186+
187+
CoreDisTools.ClearOutputBuffer();
188+
rtfOffset += instrSize;
189+
codeOffset += instrSize;
190+
}
191+
}
192+
171193
/// <summary>
172194
/// Prints a formatted string containing a block of bytes from the relative virtual address and size
173195
/// </summary>
174-
internal override void DumpBytes(int rva, uint size, XmlNode parentNode = null, bool convertToOffset = true)
196+
internal override void DumpBytes(int rva, uint size, XmlNode parentNode = null, string name = "Raw", bool convertToOffset = true)
175197
{
176198
int start = rva;
177199
if (convertToOffset)

src/tools/r2rdump/XmlDumper.cs

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ internal override void DumpMethod(R2RMethod method, XmlNode parentNode)
122122
methodNode.AppendChild(gcNode);
123123
Serialize(method.GcInfo, gcNode);
124124

125-
foreach (KeyValuePair<int, GcInfo.GcTransition> transition in method.GcInfo.Transitions)
125+
foreach (GcInfo.GcTransition transition in method.GcInfo.Transitions.Values)
126126
{
127127
Serialize(transition, gcNode);
128128
}
129129

130130
if (_raw)
131131
{
132-
DumpBytes(method.GcInfo.Offset, (uint)method.GcInfo.Size, methodNode, false);
132+
DumpBytes(method.GcInfo.Offset, (uint)method.GcInfo.Size, gcNode, "Raw", false);
133133
}
134134
}
135135

@@ -155,8 +155,7 @@ internal override void DumpRuntimeFunction(RuntimeFunction rtf, XmlNode parentNo
155155

156156
if (_disasm)
157157
{
158-
string disassembly = CoreDisTools.GetCodeBlock(_disassembler, rtf, _r2r.GetOffset(rtf.StartAddress), _r2r.Image);
159-
AddXMLNode("Disassembly", disassembly, rtfNode);
158+
DumpDisasm(_disassembler, rtf, _r2r.GetOffset(rtf.StartAddress), _r2r.Image, rtfNode);
160159
}
161160

162161
if (_raw)
@@ -177,10 +176,33 @@ internal override void DumpRuntimeFunction(RuntimeFunction rtf, XmlNode parentNo
177176
}
178177
}
179178

179+
internal unsafe override void DumpDisasm(IntPtr Disasm, RuntimeFunction rtf, int imageOffset, byte[] image, XmlNode parentNode)
180+
{
181+
int rtfOffset = 0;
182+
int codeOffset = rtf.CodeOffset;
183+
Dictionary<int, GcInfo.GcTransition> transitions = rtf.Method.GcInfo.Transitions;
184+
GcSlotTable slotTable = rtf.Method.GcInfo.SlotTable;
185+
while (rtfOffset < rtf.Size)
186+
{
187+
string instr;
188+
int instrSize = CoreDisTools.GetInstruction(Disasm, rtf, imageOffset, rtfOffset, image, out instr);
189+
190+
AddXMLNode("offset"+codeOffset, instr, parentNode);
191+
if (transitions.ContainsKey(codeOffset))
192+
{
193+
AddXMLNode("Transition", transitions[codeOffset].GetSlotState(slotTable), parentNode);
194+
}
195+
196+
CoreDisTools.ClearOutputBuffer();
197+
rtfOffset += instrSize;
198+
codeOffset += instrSize;
199+
}
200+
}
201+
180202
/// <summary>
181203
/// Prints a formatted string containing a block of bytes from the relative virtual address and size
182204
/// </summary>
183-
internal override void DumpBytes(int rva, uint size, XmlNode parentNode, bool convertToOffset = true)
205+
internal override void DumpBytes(int rva, uint size, XmlNode parentNode, string name = "Raw", bool convertToOffset = true)
184206
{
185207
int start = rva;
186208
if (convertToOffset)
@@ -198,29 +220,9 @@ internal override void DumpBytes(int rva, uint size, XmlNode parentNode, bool co
198220
{
199221
sb.Append($" {_r2r.Image[start + i]:X2}");
200222
}
201-
AddXMLNode("Raw", sb.ToString(), parentNode);
223+
AddXMLNode(name, sb.ToString(), parentNode);
202224
return;
203225
}
204-
205-
_writer.Write(" ");
206-
if (rva % 16 != 0)
207-
{
208-
int floor = rva / 16 * 16;
209-
_writer.Write($"{floor:X8}:");
210-
_writer.Write(new String(' ', (rva - floor) * 3));
211-
}
212-
for (uint i = 0; i < size; i++)
213-
{
214-
if ((rva + i) % 16 == 0)
215-
{
216-
_writer.Write($"{rva + i:X8}:");
217-
}
218-
_writer.Write($" {_r2r.Image[start + i]:X2}");
219-
if ((rva + i) % 16 == 15 && i != size - 1)
220-
{
221-
_writer.Write(" ");
222-
}
223-
}
224226
}
225227

226228
internal override void DumpSectionContents(R2RSection section, XmlNode parentNode)
@@ -259,15 +261,15 @@ internal override void DumpSectionContents(R2RSection section, XmlNode parentNod
259261
{
260262
if (importSection.SectionRVA != 0)
261263
{
262-
DumpBytes(importSection.SectionRVA, (uint)importSection.SectionSize, contentsNode);
264+
DumpBytes(importSection.SectionRVA, (uint)importSection.SectionSize, contentsNode, "SectionBytes");
263265
}
264266
if (importSection.SignatureRVA != 0)
265267
{
266-
DumpBytes(importSection.SignatureRVA, (uint)importSection.Entries.Count * sizeof(int), contentsNode);
268+
DumpBytes(importSection.SignatureRVA, (uint)importSection.Entries.Count * sizeof(int), contentsNode, "SignatureBytes");
267269
}
268270
if (importSection.AuxiliaryDataRVA != 0)
269271
{
270-
DumpBytes(importSection.AuxiliaryDataRVA, (uint)importSection.AuxiliaryData.Size, contentsNode);
272+
DumpBytes(importSection.AuxiliaryDataRVA, (uint)importSection.AuxiliaryData.Size, contentsNode, "AuxiliaryDataBytes");
271273
}
272274
}
273275
foreach (R2RImportSection.ImportSectionEntry entry in importSection.Entries)

0 commit comments

Comments
 (0)