一个键盘消息钩子的分析过程(二)

admin 2024年8月2日16:57:57评论15 views字数 2198阅读7分19秒阅读模式

    在前几期写了个《一个键盘消息钩子的分析过程》,这里补上个(二),算是个延伸和不同的展示,当作留存笔记;

    上篇是个C++写的键盘消息钩子程序,我们学会了怎么分析C++的;那本篇是delphi写的键盘消息钩子程序,我们可以学到如何反编译、逆向delphi的。

一、源代码分析

用delhi先写个消息钩子程序,如下,

一个键盘消息钩子的分析过程(二)

程序定义的结构体如下:

KBDLLHOOKSTRUCT=record

vkCode:DWORD;

scanCode:DWORD;

flags:DWORD;

time:DWORD;

dwExtraInfo:ulong;

end;

LPKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT;

const

WH_KEYBOARD_LL = 13;

//KeyProc 是一个标准调用约定的函数(stdcall),用于处理键盘事件。它通常作为键盘钩子回调函数来使用,用于捕获全局键盘输入事件。

//·code: 一个整数,表示钩子代码。如果这个值小于 0,则表示钩子过程应该传递消息,而不进行处理。

//·wparam: 包含了消息的附加信息,表示发生了什么样的键盘事件(例如,键盘按下或释放)。

//·lparam: 包含了指向 KBDLLHOOKSTRUCT 结构的指针,描述了键盘消息的信息。

//返回值:LRESULT: 返回一个 LRESULT 类型的值,表示事件的处理结果。

function KeyProc(code:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT stdcall;

var

pkbhs:LPKBDLLHOOKSTRUCT;

begin

Result:=1;

if (code < 0) then

//·如果 code 小于 0,则调用 CallNextHookEx 函数将消息传递给下一个钩子,并返回其结果。·否则,继续处理。

begin

Result:= CallNextHookEx(OldHook,code,wParam,lParam);

exit;

end;

pkbhs := LPKBDLLHOOKSTRUCT(lParam);

// lparam 转换为 LPKBDLLHOOKSTRUCT 类型的指针。

RecieveFlag := False;

case wparam of

//处理键盘事件:

·根据 wparam 的值,检查是否为 WM_KEYDOWN 消息。

·检查按键代码 vkCode 是否为 VK_F1  VK_F2

o如果按下 F1 键,显示消息按下F1”

o如果按下 F2 键,显示消息按下F2”,并将 RecieveFlag 设置为 False

WM_KEYDOWN : begin

if pkbhs.vkCode = VK_F1 then

begin

ShowMessage('按下F1');

end

else if pkbhs.vkCode = VK_F2 then

begin

ShowMessage('按下F2');

RecieveFlag := False;

end;

end;

end;

Result:=CallNextHookEx(OldHook,code,wParam,lParam);

//调用 CallNextHookEx 函数将消息传递给下一个钩子,并返回其结果。

end;

//设置键盘消息钩子

procedure TFMMain.btn1Click(Sender: TObject);

begin

OldHook   :=   SetWindowsHookEx(WH_KEYBOARD_LL,KeyProc,HInstance,0);

btn1.Enabled := False;

btn2.Enabled := True;

end;

//取消键盘消息钩子

procedure TFMMain.btn2Click(Sender: TObject);

begin

UnhookWindowsHookEx(OldHook);

btn1.Enabled := True;

btn2.Enabled := False;

end;

二、进程分析

参考第一篇里面的分析过程,这里就不占用篇幅了。

三、静态分析

我来说说关于delphi程序的逆向分析,不用IDA了,用Ghidra来分析,这里要用到Ghidra的一个插件:dhrake。

1、IDR反编译,转换成IDC保存

先载入程序,

一个键盘消息钩子的分析过程(二)

IDC Generator导出成IDC;

一个键盘消息钩子的分析过程(二)

2、Ghidra载入程序

一个键盘消息钩子的分析过程(二)

出现这样的代码FUN_...,我们也不知道是个啥意思,这时候用到这个dhrake插件了。

3、dhrake插件

Dhrake is a collection of scripts for reverse engineering Delphi binaries withGhidra and IDR.官方的解释,专为ghidra和IDR打造的。

使用方法:

一个键盘消息钩子的分析过程(二)

下载地址:https://github.com/huettenhain/dhrake?tab=readme-ov-file

我们将其中的*.java放在Ghidra的插件目录中,

一个键盘消息钩子的分析过程(二)

4、运行插件

一个键盘消息钩子的分析过程(二)

在这里运行Run Script,导入刚才的IDC,

一个键盘消息钩子的分析过程(二)

一个键盘消息钩子的分析过程(二)

看下结果:

一个键盘消息钩子的分析过程(二)

果然比刚才有形多了。

5、其它的就不分析,都是套路了。

后记:投给了《取证实录》第三季,中午花点时间将它放到公众号里。这虽是篇分析消息钩子的文章,但详细介绍了如何反编译及逆向delphi写的程序,也算是个这方面的总结吧。

原文始发于微信公众号(MicroPest):一个键盘消息钩子的分析过程(二)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月2日16:57:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一个键盘消息钩子的分析过程(二)https://cn-sec.com/archives/2984924.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息