吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5316|回复: 24
收起左侧

[其他转载] Delphi编程点点滴滴

[复制链接]
冥界3大法王 发表于 2020-4-10 08:33
要实现的代码是:按下全局热键Alt+A
得到当前激活窗口的句柄、窗口标题、类名、文件路径
然后查找x64dbg窗口并激活,定位控件,发送剪贴板到命令行控件上等功能

首先编很多代码时,就得考虑程序的重复利用问题,这就需要很多子程序或函数
把诸多的功能拆解成各个子模块来实现,互相没有干扰,这点也很重要,利于排错
多个参数传递数值时,有时需要传递中间的变量,不然参数过多,难免出错
比如下面的代码的实现,就分了几个步奏完成的。

ShowMessage('当前激活的窗口标题是:' + arr +#13#10 + '得到激活的窗口类名是:' + ps +#13#10 + '得到激活窗口的完整路径是:' + PChar(path) +#13#10 + '当前窗口的句柄是:' + PChar(IntToHex(StrToInt(IntToStr(h)))));

第1步,先用CNpack工具中的生成对话框生成一个大概的,
因为要使用到对话框中的图标、窗口置顶、传递一个固定字符串+变量作标题(激活窗口的标题)、然后显示的文字也是由类似的三部分(类名,路径、窗口句柄)组成的。 2020-04-10_082220.png
ShowMessage这个弹框函数最为简单,因为无标题,只要一个()部分,里边可以连接字符串或多个变量或多个换行


当换成了下面的MessageBoxW(里边的参数就很多,很复杂了,很容易出错)
TempA是临时定义的中间值,中途过渡下,让参数看起来变得简化些
最后实现后就是这个样子的了。
2020-04-10_083055.png

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',[pid])), 4));   //再转换成 16进制,因为x32dbg/x64dbg 附加进程用到的是 16进制数
    Clipboard.AsText := 'AttachDebugger ' + IntToHex(StrToInt(Format('%u', [pid])), 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]));                           //得到激活窗口的pid可行
//ShowMessage(IntToHex(StrToInt(Format('%u',[pid])), 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;

免费评分

参与人数 5吾爱币 +6 热心值 +5 收起 理由
nshark + 1 + 1 用心讨论,共获提升!
xiaonanw + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
DEATHTOUCH + 1 + 1 用心讨论,共获提升!
qq52013 + 1 用心讨论,共获提升!

查看全部评分

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

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
辉煌不再的 好东西,可惜了

前年自学过。小甲鱼的视频看了几个。第三还是第四个,有个地方照着做都不会,,放弃了
lizf2019 发表于 2020-4-10 08:52
水云 发表于 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
大佬就是大佬,不知道什么时候学到这个水平
头像被屏蔽
mokson 发表于 2020-4-10 15:56
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 冥界3大法王 发表于 2020-4-10 18:19
mokson 发表于 2020-4-10 15:56
要记住的东西真的多呀。

@mokson
错,知识这么多,活到死也不会掌握
记住主要的,会抄,会改,满足需求=毕业
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 09:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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