API拦截的简单问题!大家都近来鄙视鄙视!

woonia 2003-05-09 12:10:47
想用输入函数表的方式来替换API!但我想知道如果要被替换的的程序里的函数是用序号来引用的而不是用函数名引用,该怎么替换啊?大概是怎么一个思想?谢谢!
...全文
35 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypyRock 2003-05-13
  • 打赏
  • 举报
回复
进来鄙视鄙视
888888888888 2003-05-11
  • 打赏
  • 举报
回复
关注
yansea 2003-05-11
  • 打赏
  • 举报
回复
当.exe文件被载入的时候,这个数组的内容会被填充为api的实际地址。
你可以看看罗云彬的《win32汇编语言程序设计》中最后一章,就是讨论的pe文件。
yansea 2003-05-09
  • 打赏
  • 举报
回复
用地址判断。其实我在实际的编写过程中发现只能用地址来判断是否是目标api。
先从dll的输出表中找到实际api地址,保存下来。
然后遍历目标程序的输入表,比对地址是否与找到的真实地址一致,一致就进行替换。
开始的时候我也以为可以用api名字在输入表中查找,但是对实际在入内存的程序查找发现,那个装着api名字的数组地址是0,rva吧,我记不清了。不过没关系,地址都存在。
woonia 2003-05-09
  • 打赏
  • 举报
回复
也就是问为什么Func := pointer(Integer(DOS) + ImportDesc.LookupTable);是函数的地址?谢谢!
woonia 2003-05-09
  • 打赏
  • 举报
回复
我还是有点不明白就是:Func := pointer(Integer(DOS) + ImportDesc.LookupTable);为什么是
函数的地址!我看有的书写的是如果ImportDesc.LookupTable的最高位是0,那么他指向一个IMPORTBYNAME数组,该数组里面有函数的名字!而高位为1时,则说明是用序号引用的,会指向一个函数的序号!所以请问为什么Func := pointer(Integer(DOS) + ImportDesc.LookupTable);会是一个函数的地址呢?
yansea 2003-05-09
  • 打赏
  • 举报
回复
还是不对,我说错了!

DLL := PChar(Integer(Dos) + ImportDesc^.Name); //得到dll名字
RepointAddrInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);//?从dll中查找目标api函数?
Func := pointer(Integer(DOS) + ImportDesc.LookupTable);//函数地址
while Func^ <> nil do

qxj 2003-05-09
  • 打赏
  • 举报
回复
路过
yansea 2003-05-09
  • 打赏
  • 举报
回复
“代码并不难,Func := pointer(Integer(DOS) + ImportDesc.LookupTable);这是取得函数地址。”这个不对,应该是“取得LookupTable表,导入表的地址”
yansea 2003-05-09
  • 打赏
  • 举报
回复
大家定义的名字不一样而已,看看我的定义:
type
PImageImportDescriptor = ^IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = Record
OriginalFirstThunk :DWORD; //RVA
TimeDateStamp :DWORD;
ForwarderChain :DWORD;
Name :DWORD;
FirstThunk :DWORD; //RVA
end;
建议你还是用我这样的定义,当然内容都一样,不过名字我可是参MASM中windows.inc里的说明呀^_^
代码并不难,Func := pointer(Integer(DOS) + ImportDesc.LookupTable);这是取得函数地址。那个dos应该就是$400000吧,.exe基地址。
还是贴点我代码吧,这个解释起来比较容易

RePointer := ImageDirectoryEntryToData(Pointer($00400000),true,IMAGE_DIRECTORY_ENTRY_IMPORT,xCount);
//取得.exe输入表地址;
while PImageImportDescriptor(RePointer)^.Name <> 0 do //dll名字不为空,条件
begin
pThunk := DWORD($00400000+PImageImportDescriptor(RePointer)^.FirstThunk);
//这句应该你问的那个意思一样吧,取得该数组地址
.....
这里就判断了,没什么意思
注意 LongWord(Pointer(pThunk)^) 就是api的实际地址了,用这个值同从dll中得到的地址比较
Inc(pThunk,4);
//循环,累加
end;
woonia 2003-05-09
  • 打赏
  • 举报
回复
请问思宏:
//************************************
type //定义一个入口结构
PImage_Import_Entry = ^Image_Import_Entry;
Image_Import_Entry = record
Characteristics: DWORD;
TimeDateStamp: DWORD;
MajorVersion: Word;
MinorVersion: Word;
Name: DWORD;
LookupTable: DWORD;
end;


这里代码略。。。

DLL := PChar(Integer(Dos) + ImportDesc^.Name);
RepointAddrInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
Func := pointer(Integer(DOS) + ImportDesc.LookupTable);
while Func^ <> nil do
begin
f := Func^;
略。。。

上面是CSDN里的关于APIHOOK的文章!我有个地方不明白,那就是:Func := pointer(Integer(DOS) + ImportDesc.LookupTable);这里的func是什么意思?func^是指向一个输入函数的地址
还是指向一个输入函数的函数名?这里我有点搞不清楚!

这个回答完就结贴了!谢谢!

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧