Recent

Author Topic: Disassembler functions  (Read 6421 times)

LemonParty

  • Jr. Member
  • **
  • Posts: 58
Disassembler functions
« on: December 11, 2016, 07:35:42 pm »
Lazarus can use disassembler to show code in assembler (window shown when some bug occur). Is it some libraries to return compiled code in assembler mnemonics? I want parse binary code. Something like:
Code: Pascal  [Select][+][-]
  1. function Assemble(Proc{procedure address}: Pointer): AsmCode;
Maybe it is possible to use built-in disassembler?

marcov

  • Administrator
  • Hero Member
  • *
  • Posts: 11383
  • FPC developer.
Re: Disassembler functions
« Reply #1 on: December 11, 2016, 07:42:43 pm »
I think that that is GDB output, not Pascal code.

guest58172

  • Guest
Re: Disassembler functions
« Reply #2 on: December 11, 2016, 08:16:40 pm »
You can use beaengine. I used it in 2011 in Hexalt (made with Delphi) so it can certainly be linked with FPC.

https://github.com/BeaEngine/beaengine

LemonParty

  • Jr. Member
  • **
  • Posts: 58
Re: Disassembler functions
« Reply #3 on: December 11, 2016, 09:34:35 pm »
This is what I looking for.
I download git sources. Then try to build clear program on Windows, on x32 compiler, but received "Error: Can't open object file: BeaEngineLib.obj". I found this file, download and put in project dir. So new problem sound like "Error: Illegal COFF Magic while reading BeaEngineLib.obj". What's wrong?

guest58172

  • Guest
Re: Disassembler functions
« Reply #4 on: December 11, 2016, 10:09:53 pm »
which compiler did you use to build beaengine ? Would it be possible that it produced an OMF object ?

Akira1364

  • Hero Member
  • *****
  • Posts: 561
Re: Disassembler functions
« Reply #5 on: December 11, 2016, 10:44:16 pm »
The FPDebug package that comes with Lazarus includes a native disassembler in fpdbgdisasx86.pp, which you call with the following procedure:

Code: Pascal  [Select][+][-]
  1. procedure Disassemble(var AAddress: Pointer; const A64Bit: Boolean; out ACodeBytes: String; out ACode: String);

LemonParty

  • Jr. Member
  • **
  • Posts: 58
Re: Disassembler functions
« Reply #6 on: December 11, 2016, 10:55:43 pm »
I found ready decision: https://github.com/stievie/TCapstone.
Those framework have working TCapstone class for disassemble (to compile test.lpi
comment line {$R *.res} inside).

(use Visual Studio)

(Thank, Akira1364, try it later)

guest58172

  • Guest
Re: Disassembler functions
« Reply #7 on: December 11, 2016, 11:11:50 pm »
I've attached the right object generated with mingw32. Tested Ok however it's a pita to link because you have to declare and export several C functions from the standard library (_strlen, _strcmp, _strcpy, _memset and _printf).

The gcc comd line is simple:

Code: Pascal  [Select][+][-]
  1. gcc -c  -DBEA_ENGINE_STATIC -Iinclude -obin/coff32/beaengine.obj "BeaEngine.c"
  2.  

LemonParty

  • Jr. Member
  • **
  • Posts: 58
Re: Disassembler functions
« Reply #8 on: December 11, 2016, 11:14:32 pm »
Download capstone.dll http://www.capstone-engine.org/download.html from "Windows - Core engine" paragraph.

LemonParty

  • Jr. Member
  • **
  • Posts: 58
Re: Disassembler functions
« Reply #9 on: December 12, 2016, 01:29:24 pm »
FpDbgDisasX86 unit usage example:
Code: Pascal  [Select][+][-]
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4. {$AsmMode intel}
  5.  
  6. uses
  7.  {$IFDEF UNIX}{$IFDEF UseCThreads}
  8.  cthreads,
  9.  {$ENDIF}{$ENDIF}
  10.  FpDbgDisasX86;
  11.  
  12. {$R *.res}
  13. var
  14.   b: byte; W: Word;
  15.   P: pointer;
  16. procedure AAA;
  17. begin
  18.  b:= 5;
  19.  W:= 3;
  20.  asm
  21.   mov ax, w;
  22.  end;
  23. end;
  24. {instructions to be disassemble}
  25. procedure Go(N: byte);
  26. var CB, C: String;
  27. begin
  28.  for N:= 1 to N do begin
  29.   Disassemble(P, false, CB, C);
  30.   Writeln(CB:25, ' ', C);
  31.  end;
  32. end;
  33.  
  34. begin
  35.  P:= @AAA;
  36.  Go(7);
  37.  readln;
  38. end.

 

TinyPortal © 2005-2018