吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4806|回复: 15
收起左侧

[其他转载] 6句代码实现Delphi动态调用API函数

[复制链接]
bester 发表于 2019-7-8 21:03
[Delphi] 纯文本查看 复制代码
procedure TForm1.formcreate(Sender: TObject);  //这里相当于于易语言的启动窗口事件,就是当窗口被创建时,就会运行下面的代码

type    //首先用type定义一个函数,参数跟MessageBoxA一样,用stdcall调用约定
   MyMessageBox = function(hWnd:Cardinal;lpText, lpCaption: AnsiString ;uType: Cardinal): Integer; stdcall;   //定义的函数名为MyMessageBox,这里跟静态调用不同的是,静态调用是 function 函数名(参数),这里是  函数名=函数(参数)
var
    MyMessage:MyMessageBox;     //定义一个变量名为MyMessage,令这个变量的类型是MyMessageBox,也就是这个变量等于函数
    apiaddr:Integer;    //保存获取到的api函数地址
    tiaoshi:Integer;    //用来做调试输出用
begin
     apiaddr:=Integer(GetProcAddress(LoadLibrary('user32.dll'), 'MessageBoxA'))+2;   //这里+2是为了测试朱朱说的7字节热补丁,实际上api函数的mov edi,edi是没有意义的,这句代码占2个字节,故我们可以直接用push开始执行,所以这里+2,也可以不+2,因为getprocessaddress返回的是pointer类型,所以用integer转整数再+2
     @MyMessage:=Pointer(apiaddr);   //这里就将这个+2以后的地址转成pointer类型,加@是为了取MyMessage的实际地址,但是这里好像不加@也可以,但是为了保险还是加@
     tiaoshi:=Integer(@MyMessage);   //这里拿来做调试输出,可不用这句代码
     MyMessage(0,'动态调用','动态调用',0);  //这里我们声明的一个局部变量,他的类型是函数类型,所以这里这个局部变量就等于我们的函数了,所以直接调用,注意Delphi下,MessageBoxA的标题和内容参数是ansistring类型,如果我们定义的函数是string类型,那么就应该调用MessageBoxW,否则会乱码


end;

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| bester 发表于 2019-7-16 20:54
rt2ryu 发表于 2019-7-15 23:07
主要的动态转换就是+2的分配的内存页地址是随机的?可以这么理解么?

所谓的动态调用,是指我们不声明API函数,但是我们通过动态获取API指针还是能调用到这个API函数
静态调用:
function MyMessageBoxA(hwnd:integer;text,caption:Ansistring;uType:integer):Integer;stdcall;external 'user32.dll' name 'MessageBoxA'

上面就是我们声明的API函数,这个就是静态调用
 楼主| bester 发表于 2019-7-16 20:47
rt2ryu 发表于 2019-7-15 23:07
主要的动态转换就是+2的分配的内存页地址是随机的?可以这么理解么?

某些APi函数的头2给字节是mov edi,edi,这句代码可以理解为无意义代码,+2就是跳过这句代码开始执行API,不影响API函数的执行结果,当然不+2就是正常的API调用执行
rt2ryu 发表于 2019-7-8 21:42
就是将入口地址+2,再转换为指针输出指向调用?
 楼主| bester 发表于 2019-7-8 23:05
rt2ryu 发表于 2019-7-8 21:42
就是将入口地址+2,再转换为指针输出指向调用?

对,当时朱朱提了一下,我就稍微弄了一下,感觉还行
小菜一碟(自由) 发表于 2019-7-10 08:25
支持楼主,建议多发一些关于DELPHI方面的资料,好方便学习哈
rt2ryu 发表于 2019-7-15 23:07
bester 发表于 2019-7-8 23:05
对,当时朱朱提了一下,我就稍微弄了一下,感觉还行

主要的动态转换就是+2的分配的内存页地址是随机的?可以这么理解么?
rt2ryu 发表于 2019-7-26 22:03
bester 发表于 2019-7-16 20:54
所谓的动态调用,是指我们不声明API函数,但是我们通过动态获取API指针还是能调用到这个API函数
静态调 ...

明白了~类似于隐式指针的概念~~~3Q
soooven 发表于 2019-7-28 17:33
不错,学习一下,现在用D的人很少了
sail2000 发表于 2019-7-30 18:22
好久没见这么基础的delphi帖子了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 19:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表