代码拉取完成,页面将自动刷新
unit elfsymbols;
{$mode OBJFPC}
interface
uses
{$ifdef JNI}
Classes, SysUtils, elftypes, elfconsts, networkInterface, unixporthelper, newkernelhandler, processhandlerunit;
{$else}
{$ifdef darwin}
macport,
{$endif}
Classes, SysUtils, elftypes, elfconsts, networkInterface, cefuncproc, newkernelhandler, processhandlerunit;
{$endif}
function EnumElfSymbols(modulename: string; modulebase: ptruint; callback: TNetworkEnumSymCallback): boolean;
implementation
function EnumElfSymbols32(modulename: string; modulebase: ptruint; mem: pbyte; callback: TNetworkEnumSymCallback): boolean;
begin
result:=false;
end;
function EnumElfSymbols64(modulename: string; modulebase: ptruint; mem: pbyte; callback: TNetworkEnumSymCallback): boolean;
type
PElf64Hdr=^TElf64Hdr;
var
Header: PElf64Hdr;
SectionHeaders: PElf64SectHdr;
CurrentSectionHeader: PElf64SectHdr;
i,j: integer;
maxindex: integer;
symbol: PElf64Symbol;
name: pchar;
address: ptruint;
begin
result:=false;
Header:=@mem[sizeof(TElfIdent)];
SectionHeaders:=@mem[Header^.SectHdrOffset];
for i:=0 to Header^.SectHdrNum-1 do
begin
if ptruint(@SectionHeaders[i])-ptruint(mem)>4096 then break; //unexpected
CurrentSectionHeader:=@SectionHeaders[i];
if (CurrentSectionHeader^._Type=SHT_SYMTAB) or (CurrentSectionHeader^._Type=SHT_DYNSYM) then
begin
maxindex:=CurrentSectionHeader^.Size div sizeof(TElf64Symbol);
symbol:=@mem[CurrentSectionHeader^.Offset];
for j:=0 to maxindex-1 do
begin
name:=@mem[SectionHeaders[CurrentSectionHeader^.Link].Offset+symbol[j].Name];
address:=modulebase+(symbol[j].value-CurrentSectionHeader^.Address+CurrentSectionHeader^.Offset);
if (symbol[j].Value<>0) and (name<>'') then
callback(modulename, name, address, symbol[j].Size, false);
end;
end;
end;
end;
function EnumElfSymbols(modulename: string; modulebase: ptruint; callback: TNetworkEnumSymCallback): boolean;
type
PElfIdent=^TElfIdent;
var
br: ptruint;
mem: pbyte;
begin
result:=false;
mem:=getmem(4096);
if ReadProcessMemory(processhandle, pointer(modulebase), mem, 4096, br) then
begin
if PElfIdent(mem)^.ElfClass=ELFCLASS32 then
result:=EnumElfSymbols32(modulename, modulebase, mem, callback)
else
result:=EnumElfSymbols64(modulename, modulebase, mem, callback);
end;
FreeMemAndNil(mem);
end;
end.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。