黑客编程学习_1.黑客编程入门
学习使用的书籍:《C++黑客编程揭秘与防范》
0x01 初识Windows消息
发送消息可以用来打开记事本的进程、关闭笔记本的进程、获取窗口的标题和设置窗口的标题。程序的具体代码为:
void CMsgTestDlg::OnClose()
{HWND hWnd = ::FindWindow("Notepad",NULL);if(hand == NULL){AfxMessageBox("没有找到记事本");return;}::SendMessage(hWnd,WM_CLOSE,NULL,NULL);
}void CMsgTestDlg::ONExec()
{WinExec("notepad.exe",SW_SHOW);
}void CMsgTestDlg::OnEditWnd()
{HWND hWnd=::FindWindow(NULL,"无标题 - 记事本");if(hand == NULL){AfxMessageBox("没有找到记事本");return;}char *pCaptionText = "消息测试";::SendMessage(hWnd,VM_SETTEXT,(WPARAM)0,(LPARAM)pCaptionText);
} void CMsgTestDlg::OnGetWnd()
{HWND hWnd=::FindWindow("Notepad",NULL);if(hand == NULL){AfxMessageBox("没有找到记事本");return;}char pCaptionText[MAXBYTE]={0};::SendMessage(hWnd,VM_SETTEXT,(WPARAM)0,(LPARAM)pCaptionText);AfxMessageBox(pCaptionText);
}
FindWindow()功能是通过指定的窗口名返回窗口句柄,其有两个参数,lpClassName为窗口类名,通常使用第二个长处lpWindowName指定窗口的名称。当函数找到该窗口时,会返回它的窗口句柄。
SendMessage()函数根据指定窗口句柄将消息发送给指定的窗口。三个参数分别是HWND对象要接受消息的窗口的窗口句柄、UINT对象要发送消息的消息类型,第三个参数WPARAM对象和第四个参数LPARAM对象是消息的两个附加参数。第二个参数分别是:
使用FindWindow()函数时,通常使用第二个参数,获取窗口的类名称常用Spy++。
0x02 Windows消息机制的处理
Windows应用程序执行流程非常复杂,可以看到主程序和窗口过程没有直接的调用关系,它们之间使用系统程序模块进行连接。主程序是用来注册窗口类、获取消息和分发消息的,窗口过程中定义了需要处理的消息,会根据不同的消息执行不同的动作,而不需要程序处理的消息则会交给默认的系统进程进行处理。
这里学习到一个比较简单的例子:
WinMain()函数的定义如下:
int WINAPI WinMain(HINSTANCE hInstance, //应用程序的实例句柄,即为程序装入内存后的起始地址HINSTANCE hPrevInstance, //同一文件创建的上一个实例的实例句柄LPSTR lpCmdLine, //主函数的参数,用于程序启动时给进程传递参数int nCmdShow //进程显示的方式,可以使最大化显示、最小化显示或者隐藏等
);
因为主函数要完成的任务是注册一个窗口类,创建一个窗口并显示创建的窗口,然后不停的获取属于自己的消息并分发给自己的窗口过程,直到收到WM_QUIT消息后推出消息循环结束进程:
使用了MyRegisterClass函数,传递实例句柄作为参数,首先填充WNDCLASSEX结构体,然后调用RegisterClassEx函数进行注册。见下:
其中,lpfnWndProc是最重要的字段,保存窗口过程的地址。注册窗口类的重点是在后面的代码中可以根据该窗口类创建该种类型的窗口。代码中,在定义窗口类时指定了背景色、鼠标指针和窗口图表等,则使用该窗口类创建的窗口都具有相同的窗口类型。
创建主窗口并显示更新的代码为:
窗口函数是由操作系统进行调用的,代码如下:
WinMain()函数收到消息后,使用DispatchMessage()函数将消息派发给了窗口过程,从而由窗口过程对消息进行处理。
0x03 模拟鼠标键盘按键的操作
鼠标、键盘常用的信息中, WM_MOUSEMOVE对应移动鼠标光标,按下鼠标左键为WM_LBUTTONDOWN,释放鼠标左键为WM_LBUTTONUP,鼠标消息如下:
键盘的按下与抬起消息也有定义,分别是WM_KEYDOWN和WM_KEYUP。常用的为:
PostMessage()函数可以对键盘按键进行模拟,目标编程界面为:
开始按钮事件的代码如下:
在按钮事件中添加定时器,按照指定的时间间隔进行相应的处理:
获取标题可以通过Spy++获得。通过PostMessage()发送按F5就可以完成键盘按键模拟的程序,此函数的好处是目标程序可以在后台,不需要窗口处于激活状态。
通过API函数也可以模拟鼠标键盘按键的操作。keybd_event()、mouse_enevt()可以分别模拟键盘和鼠标的输入,定义如下:
模拟界面为:
首先将目标窗口设置到最前面并处于激活状态的部分,代码如下:
在代码的使用中,SetForegroundWindow()函数将指定的窗口设置到最前面并处于激活状态,唯一的参数是目标窗口的窗口句柄。
模拟键盘按钮:
模拟鼠标:
其中用到的ClientToScreen()函数的作用时得到指定窗口在屏幕中的坐标位置,SetCursorPos()将鼠标移动到指定的坐标位置。
0x04 通过消息实现进程间的通信
系统消息分为两种,已经定义的消息是由0到0x3ff,用户自定义的消息可以从0x400开始,系统提供了一个宏WM_USER,在进行自定义消息是,在其基础上加一个值就可以。
进程间通信需要有发送端和接受端:
通过WM_COPYDATA消息也可进行进程通信:
消息机制在计算机中得到了充分的利用,是黑客编程的基础。
虽因初涉,致云里雾里,小生只得继续努力,以待醍醐灌顶之时。
黑客编程学习_1.黑客编程入门相关推荐
- 初学者值得一看:什么是编程/C语言,编程学习建议,编程解疑与误区注意
文章目录 :star: 初学者值得一看:什么是编程/C语言,编程学习建议,编程解疑与误区注意 1.什么是编程语言 2.什么是C语言与我的强烈建议 - 先学C,而不是c++,java等 3.C语言的发展 ...
- 一些适合青少年编程学习的趣味编程工具
今天总结了一些适合青少年编程学习的趣味编程工具,感兴趣的可以了解了解,教教自家的小朋友. 趣味编程按照学生的年龄,兴趣和知识掌握程度由易到难. Scratch符合低龄儿童和程序初学者,简单的拖拽式和脚 ...
- python中小学生编程学习-小学生python编程在线教育-小码精灵编程线上教育机构...
导语概要 为什么要学习少儿编程?能培养孩子的耐心与专注能力.编程的严谨性决定了任何小的失误都将导致程序无法正常运行.因此在编写程序的过程中需要不断地调试.试错,无形之中就可以提高孩子的耐性和专注力.如 ...
- Linux系统编程学习之《编程前的准备》
在进行Linux系统编程钱,先来看看编程前的准备吧! 先说说我为什么学习Linux系统编程,因为我觉得现在Linux是IT行业的主流,学习一下Linux相关知识,对于学计算机专业的我来说肯定是有必要的 ...
- 掌握了c语言就能够编程,C语言编程学习-C语言编程学习app-最火手机站
C语言编程学习是一款优质的学习软件,能够帮助用户更好的学习C语言,让用户在线就能够获得更多的帮助,快速的解决你的学习需求,增加你的使用体验,进入平台就能够获得优质的学习服务,更好的解决用户的学习问题; ...
- 长春哪个学校可以学习计算机编程的,长春编程学习,长春学编程的学校,长春学编程自学好还是报班好 - IT教育频道...
长春编程学习 首页 > 软件 > 长春编程学习 作者:镀金池 发布时间:2017-10-25 MacDown是一款便利的的markdown编纂器,它可以在markdown代码右侧及时表 ...
- python编程学习笔记_python编程:从入门到实践学习笔记-Django开发用户账户(一)...
让用户能够输入数据(表单) 在创建用户账户身份验证系统之前,先添加几个页面,让用户能偶输入数据.添加新主题.添加新条目以及编辑既有条目. 添加新主题 1.用于添加主题的表单 创建一个forms.py文 ...
- 【Linux系统编程学习】 Makefile简单入门
此为牛客网Linux C++课程1.10&1.11&1.12 的课程笔记. 0. Makefile介绍 1. Makefile文件命名与规则 示例: 使用vim编写如下名为Makefi ...
- VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(1)
前言 打开CSDN或者度娘(谷哥被墙了,搜索不了),关键词"VB6 dx9 DirectX9 游戏源码",你会发现,讲解DX9技术的文章很多,但是跟VB6都没什么关系.偶有几片文章 ...
- DX9贴图-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(11)
DX9贴图 先准备2张图片,蜘蛛为m1.png,单眼怪物为m2.png 创建一个Form1.frm,输入如下源码: Private Sub Form_Load()'新手注意:游戏编程中, '通常将窗体 ...
最新文章
- spark-shuffle分析
- 搜索引擎, 请手下留情
- Boost:bind绑定一元地址的测试程序
- 撕掉“丑”的标签,体素是如何让游戏更有趣的?
- 使用report clear appointment的all day flag
- Android开发之跨进程通讯-AIDL实现方法 (附源码)
- 本地服务器下的局域网安全吗_本地安全认证服务器
- c语言数组前缀和,关于最大子数组问题
- Python新手输出代码
- 科学计算库BLAS LAPACK ATLAS OpenBLAS MKL EIGEN等之间的关系
- php如何实现跳转,php怎么实现页面跳转?
- ELK logstash grok匹配失败存另外的es表
- 第五章、SQL 语言学习(基础篇)
- 模2除法(CRC冗余码计算)和二进制/十进制除法
- Tools:downloading and Building EDK II工具篇:安装/使用EDKII源代码获取/编译工具[2.3]...
- ztree去掉文字前面的文件夹图标
- Open-DrainPush-Pull
- 麦吉尔大学计算机科学申请,三大权威榜单为你诠释:加拿大计算机科学哪家强?...
- TVS (瞬态二极管)
- 开源项目treasure_house