冥界3大法王 发表于 2020-4-10 08:33

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;

luxingyu329 发表于 2021-10-23 09:56

当年自学VB,写一个工作过程中的小软件。然后自觉Delphi 那个时候好像是7 是不是 暴漏年龄了?对小软件进行了重写,有了一段时间,后来转行,小软件也不知道扔到哪里去了,前几天在CSDN居然看见了自己的软件下载,但是没有积分下载不了!也不知道现在还能不能把这两个语言拾的起来!现在学习python ,谁告诉我一下学会了python后学习一下C 还是jave?

wfst 发表于 2020-9-12 23:11

水云 发表于 2020-4-10 09:05
辉煌不再的 好东西,可惜了

前年自学过。小甲鱼的视频看了几个。第三还是第四个,有个地方照着做都不会,,放弃了{:1_907:}

lizf2019 发表于 2020-4-10 08:52

抢个沙发{:301_997:}

水云 发表于 2020-4-10 09:05

辉煌不再的 好东西,可惜了

vethenc 发表于 2020-4-10 09:29

感谢分享

周峻弘6 发表于 2020-4-10 09:42

德妃有啥好啊?

9152pojie 发表于 2020-4-10 10:58

看到delphi,回一个,的确很好使

homejun 发表于 2020-4-10 12:12

顶一下!

DEATHTOUCH 发表于 2020-4-10 15:33

大佬就是大佬,不知道什么时候学到这个水平{:301_1009:}

mokson 发表于 2020-4-10 15:56

冥界3大法王 发表于 2020-4-10 18:19

mokson 发表于 2020-4-10 15:56
要记住的东西真的多呀。

@mokson
错,知识这么多,活到死也不会掌握
记住主要的,会抄,会改,满足需求=毕业 {:301_971:}
页: [1] 2 3
查看完整版本: Delphi编程点点滴滴