在前几期写了个《一个键盘消息钩子的分析过程》,这里补上个(二),算是个延伸和不同的展示,当作留存笔记;
上篇是个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):一个键盘消息钩子的分析过程(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论