Delphi编程点点滴滴
要实现的代码是:按下全局热键Alt+A得到当前激活窗口的句柄、窗口标题、类名、文件路径
然后查找x64dbg窗口并激活,定位控件,发送剪贴板到命令行控件上等功能
首先编很多代码时,就得考虑程序的重复利用问题,这就需要很多子程序或函数
把诸多的功能拆解成各个子模块来实现,互相没有干扰,这点也很重要,利于排错
多个参数传递数值时,有时需要传递中间的变量,不然参数过多,难免出错
比如下面的代码的实现,就分了几个步奏完成的。
ShowMessage('当前激活的窗口标题是:' + arr +#13#10 + '得到激活的窗口类名是:' + ps +#13#10 + '得到激活窗口的完整路径是:' + PChar(path) +#13#10 + '当前窗口的句柄是:' + PChar(IntToHex(StrToInt(IntToStr(h)))));
第1步,先用CNpack工具中的生成对话框生成一个大概的,
因为要使用到对话框中的图标、窗口置顶、传递一个固定字符串+变量作标题(激活窗口的标题)、然后显示的文字也是由类似的三部分(类名,路径、窗口句柄)组成的。
ShowMessage这个弹框函数最为简单,因为无标题,只要一个()部分,里边可以连接字符串或多个变量或多个换行
当换成了下面的MessageBoxW(里边的参数就很多,很复杂了,很容易出错)
TempA是临时定义的中间值,中途过渡下,让参数看起来变得简化些
最后实现后就是这个样子的了。
TempA := ('得到激活的窗口类名是: ' + ps + #13#10 + '得到激活窗口的完整路径是: ' + PChar(path) + #13#10 + '当前窗口的句柄是: ' + PChar(IntToHex(StrToInt(IntToStr(h)))));
MessageBoxW(0, PChar(TempA), PChar('当前激活的窗口标题是: '+(arr)), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
下面的代码中有很多注释掉的内容,并非完全无用,只是测试的中间代码,或不同的实现思路。
很多时候,加入很多注释也是很有必要的,时间一长,有时自己也需要回忆下,当年是如何完成的了。
就是这个道理。
if (GetAsyncKeyState(VK_MENU) < 0) and (GetAsyncKeyState(Ord('A')) < 0) then //Alt+A (得到激活窗口的PID
begin
h := GetForegroundWindow; //这个是句柄
GetWindowThreadProcessId(h, @pid);
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
GetWindowText(h, @arr, SizeOf(arr));
GetClassName(h, ps, 255);
path := GetProcessExePath(h);
//ShowMessage('当前激活的窗口标题是:' + arr +#13#10 + '得到激活的窗口类名是:' + ps +#13#10 + '得到激活窗口的完整路径是:' + PChar(path) +#13#10 + '当前窗口的句柄是:' + PChar(IntToHex(StrToInt(IntToStr(h)))));
TempA := ('得到激活的窗口类名是: ' + ps + #13#10 + '得到激活窗口的完整路径是: ' + PChar(path) + #13#10 + '当前窗口的句柄是: ' + PChar(IntToHex(StrToInt(IntToStr(h)))));
MessageBoxW(0, PChar(TempA), PChar('当前激活的窗口标题是: '+(arr)), MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
{ Application.MessageBox(arr, '当前激活的窗口标题', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
GetClassName(h, ps, 255); //得到激活的窗口类名
Application.MessageBox(ps, '窗口类名', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
path := GetProcessExePath(h); //得到激活窗口的完整路径
Application.MessageBox(PChar(path), '激活窗口的完整路径', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
//ShowMessage('当前窗口的句柄为:' + IntToStr(h));//这个是 10 进制的
Application.MessageBox(PChar(IntToHex(StrToInt(IntToStr(h)))), '当前窗口的句柄为(16进制的):', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST); //这个是转换成16进制的
}
{
begin //遍历打开的全部窗口
h := GetWindow(Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GETWindowText(h, @Text, 255) > 0 then //判断得到的窗口标题
if (POS('分析模块', Text) > 0) then //判断得到的局部窗口标题
begin
//ShowMessage(Text);
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);//激活窗口
end;
h := GetWindow(h, GW_HWNDNEXT);
end;
end;}
//ShowMessage(IntToHex(StrToInt(Format('%u',)), 4)); //再转换成 16进制,因为x32dbg/x64dbg 附加进程用到的是 16进制数
Clipboard.AsText := 'AttachDebugger ' + IntToHex(StrToInt(Format('%u', )), 4) + ',' + IntToHex(StrToInt(IntToStr(h)));
SendMyPress(Clipboard.ToString);
// ShowMessage('回到X64dbg中并在命令行处开心的粘贴吧!' + #13#10 + '命令行代码为:' + Clipboard.AsText + #13#10 + '你会发现程序已神奇的附加了!');
CloseHandle(pHandle);
MediaPlayer1.FileName := ExtractFileDir(Application.Exename) + '\Sound\已经复制到剪贴板.wav';
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
//下面是Alt+Shift+G的: 即在窗口标题上按下,得到模块名,模拟按键Ctrl+G,输入FOA
if (GetAsyncKeyState(VK_MENU) < 0) and (GetAsyncKeyState(VK_SHIFT) < 0) and (GetAsyncKeyState(Ord('G')) < 0) then //Alt+Shift+G
begin
h := GetForegroundWindow;
GetWindowThreadProcessId(h, @pid);
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
CloseHandle(pHandle);
//ShowMessage(Format('%u',)); //得到激活窗口的pid可行
//ShowMessage(IntToHex(StrToInt(Format('%u',)), 4)); //再转换成 16进制,因为x32dbg/x64dbg 附加进程用到的是 16进制数
GetCursorPos(p);
h := WindowFromPoint(p);
IntToStr(GetWindowText(h, lpCaption, 255));
SetCursorPos(850, 350);
Sleep(1000);
match := TRegEx.match(lpCaption, '(?<=模块:\s).*(?=\s-\s线程:)');
if match.Success then
begin
// ShowMessage(match.Value); //这样就得到了x32dbg/x64dbg中显示的模块名,接下来再弄一个Ctrl+Shift+G(完成RVA地址的定位)
TempA := match.Value + ':#' + Clipboard.AsText; //这个是转换成Ctrl+G中的 FOA的那种写法的格式 【A.exe:#123】
// ShowMessage(TempA);
Clipboard.AsText := TempA;
end;
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0); //按下Ctrl键
keybd_event(ord('G'), MapVirtualKey(ord('G'), 0), 0, 0); //按下G键
keybd_event(ord('G'), MapVirtualKey(ord('G'), 0), KEYEVENTF_KEYUP, 0); //放开G键
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0); //弹起Ctrl
Sleep(500);
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0); //按下Ctrl键
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0); //按下V键
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0); //放开V键
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0); //弹起Ctrl
MediaPlayer1.FileName := ExtractFileDir(Application.Exename) + '\Sound\已经复制到剪贴板.wav';
MediaPlayer1.Open;
MediaPlayer1.Play;
end; 当年自学VB,写一个工作过程中的小软件。然后自觉Delphi 那个时候好像是7 是不是 暴漏年龄了?对小软件进行了重写,有了一段时间,后来转行,小软件也不知道扔到哪里去了,前几天在CSDN居然看见了自己的软件下载,但是没有积分下载不了!也不知道现在还能不能把这两个语言拾的起来!现在学习python ,谁告诉我一下学会了python后学习一下C 还是jave?
水云 发表于 2020-4-10 09:05
辉煌不再的 好东西,可惜了
前年自学过。小甲鱼的视频看了几个。第三还是第四个,有个地方照着做都不会,,放弃了{:1_907:} 抢个沙发{:301_997:} 辉煌不再的 好东西,可惜了 感谢分享 德妃有啥好啊? 看到delphi,回一个,的确很好使 顶一下! 大佬就是大佬,不知道什么时候学到这个水平{:301_1009:} mokson 发表于 2020-4-10 15:56
要记住的东西真的多呀。
@mokson
错,知识这么多,活到死也不会掌握
记住主要的,会抄,会改,满足需求=毕业 {:301_971:}