1 Star 0 Fork 0

phy0292/cheat-engine

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
elfsymbols.pas 2.46 KB
一键复制 编辑 原始数据 按行查看 历史
cheat-engine 提交于 2019-12-20 00:49 +08:00 . Fix registry issues
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.
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/phy0292/cheat-engine.git
git@gitee.com:phy0292/cheat-engine.git
phy0292
cheat-engine
cheat-engine
master

搜索帮助