- 博客(69)
- 收藏
- 关注
原创 C语言学习day25:WinAPI编程进阶07-游戏辅助时钟周期事件、定时器消息
接下来我们说一下时间周期(定时器)事件我们接下来继续用上一章中的代码来举例这次课程我们需要用的函数=SetTimer()函数和KillTimer()函数。
2025-03-09 21:02:11
442
原创 C语言学习day25:WinAPI编程进阶06-游戏辅助窗体监视热键讲解
我们上一章已经绘制出了植物大战僵尸的一个页面但是我们要怎么样去判断,用户是否按了F1呢。好的接下来就是我们的内容,监视热键。思路:我们按下的是键盘,因此我们得用键盘消息,也是:WM_KEYDOWN同时要对某一个键进行监听,我们就需要用到函数。
2025-03-09 20:37:19
350
原创 C语言day25:WinAPI编程进阶04-绘制出页面
/ 回调函数UINT uMsg,//左键按下// // MessageBoxA(NULL, "鼠标左键按下", "温馨提示", MB_OK);// break;//关闭程序break;//绘制消息//获取设备上下文的句柄//要绘制的字符串char szText[]={"F1 开启无限阳关"};//获取客户区的大小//透明标签break;
2025-03-09 20:20:17
398
原创 C语言学习day25:WinAPI编程进阶02-第一个窗口应用程序开发
/ 回调函数UINT uMsg,MessageBoxA(NULL, "鼠标左键按下", "温馨提示", MB_OK);break;break;return 0;// 1.初始化窗口类结构// 注册// 创建窗口"第一个程序",NULL,NULL,hInstance,0);// 显示和更新窗口// 消息循环。
2025-03-09 19:22:08
964
原创 C语言学习day25:WinAPI编程进阶01-第一个标准Windows应用程序
例如,在D盘下有一个111.txt文件,当我们用鼠标双击这个文件时将启动记事本程序(notepad.exe),此时系统会将D:\111.txt作为命令行参数传递给记事本程序的winMain函数,记事本程序得到这个文件的路径后,在窗口中显示该文件的具体内容。指定应用程序最初如何显示,例如在任务栏上正常显示、最大化到全屏显示或最小化显示关于显示类型的知识点,需要翻阅:ShowWindow函数。上一个应用程序的实例句柄,对于win32以上的应用程序来说,该参数始终=NULL,是个是历史残留。
2025-03-09 17:37:59
400
原创 C语言学习day25:WinAPI 微信消息群发器原理分析
群发消息原理分析微信:方向键上下可以移动聊天对象回车键可以发送消息总结:只要能够在微信窗口上,自动按下键盘,就可以实现群发消息。
2025-03-09 17:02:39
299
原创 C语言学习day25:WinAPI进程强制结束
参数1:GetWindowThreadProcessId()函数,获取某程序的pid,再通过OpenProcess()函数获取进程句柄。参数2:默认填0,因为程序是否终止,肉眼能看见。
2025-03-09 15:50:14
174
原创 C语言学习day24:DLL给程序打上窗口破解补丁
在上一章节我们知道了DLL,编写DLL以及最重要的导出DLL,这一章节我们学习如何给应用打上窗口破解补丁(DLL)。
2024-12-19 22:12:42
390
原创 C语言学习day24:DLL函数导出详情
这一章节就结束了,我们一步步来,慢慢梳理我们汲取到的知识,下一章节我们学习如何去将导出的补丁(DLL)打入至软件里面。
2024-12-19 21:50:07
282
原创 C语言学习day23:编译DLL/如何去生成/注意事项
今天我们开始编写一个简单的动态链接库(DLL),首先我们需要VS,打开它,在创建新项目的搜索栏,搜索DLL,然后创建项目。
2024-12-18 21:20:35
555
原创 C语言学习day23:动态链接库(DLL)--概念
在之前,我们想去修改一个窗口的名称,用c语言可能就需要先finwindow找窗口句柄,然后呢就setwindowtexta去修改窗口的名称/标题。今天我们学习动态链接库,也就是常说的DLL,一部分朋友知道DLL,但是呢不理解DLL的意思或者是准确的作用,接下来我举一个很简单的例子。但是DLL是怎么用的呢,其实是先编写好DLL文件,之后放进应用的目录,当应用运行时,程序会自己调用DLL,将它运行起来。但是现在学了DLL就不用这么麻烦,如果已经写进程序里,那么打开软件就已经修改成功,而不是再用C语言去编写。
2024-12-18 20:54:47
259
原创 C语言学习day23:WriteProcessMemory函数/游戏内存数据修改工具开发
上一章我们说了获取应用进程的某数据(data),这一章我们就说说修改内存地址的数据。想要修改内存,那么就需要我们另一个WinAPI函数:WriteProcessMemory()函数。
2024-12-18 20:34:32
823
原创 C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发
ReadProcessMemory函数是 Windows API 中的一个函数,用于从目标进程的虚拟内存空间中读取数据。这个函数非常有用,尤其是在进行内存分析、调试、或某些类型的逆向工程时。
2024-12-16 21:11:55
946
2
原创 C语言学习day22:OpenProcess函数/句柄与进程打开权限
之后就可以把句柄传给任何别的函数,让这些函数操作。好像一张通行证,拿到它,就可以在编程之路上畅通无阻。在此之前,我们发现有的WindowsAPI函数调用,必须传入相关的句柄。比如通过Findwindow获取窗口句柄,这个窗口。然后就可以把这个句柄传给其他的进程操作函数调用。拿到进程句柄,就相当于拿到了进程操作的权限。就成为了另外的API函数调用的重要的。这就足以说明句柄的重要地位。之后,也就拿到操作它的。简单来说,当获取到了。而窗口有窗口的句柄。
2024-12-16 20:22:38
533
原创 C语言学习day22:进程ID获取工具/GetWindowThreadProcessId函数
如果函数成功,则返回值是创建窗口的线程的标识符。如果窗口句柄无效,则返回值为零。要获得更多的错误信息,请调用 GetLastError。会将进程的标识符复制到变量;如果函数失败,则变量的值保持不变。检索创建指定窗口的线程的标识符,以及创建该窗口的进程(可选)的标识符。进程也是如此,每个进程也有唯一的标识符,来标记自身是独一无二的。他会给参数二(Pid1)相关应用的一个指针(内存地址)每个人都有身份证号,这个身份证号就是个人的唯一标识符。指向接收进程标识符的变量的指针(实际上就是变量的内存地址。
2024-12-16 19:37:55
591
原创 C语言学习day22:URLDownloadToFile函数/开发文件下载工具
在之前我们去下载某个东西都是用的迅雷之类的软件,但是现在,只要提供一个地址,或者一个链接,我们自己去做一个工具去下载。这就是我们这篇的主要内容。是 Windows API 中的一个函数,属于urlmon.dll动态链接库。它的主要功能是从指定的 URL 下载文件,并将其保存到本地磁盘上的指定路径。这个函数通常在 C/C++ 编程中使用,用于简单的文件下载任务。
2024-12-16 18:41:08
602
原创 C语言学习day21:SetWindowTextA/FindWindowA/开发窗口标题修改破解工具
是 Windows API 中的一个函数,用于设置指定窗口或控件的标题或文本。这个函数适用于 ANSI 字符集(因此末尾是。用于根据窗口的类名和窗口标题查找窗口句柄。这个函数适用于 ANSI 字符集(因此末尾是。利用windowsAPI函数,由于是修改窗口标题,所以需要用到窗口函数。如果使用 Unicode 字符集,则应使用FindWindowW。如果使用 Unicode 字符集,则应使用。Windows API 的引用内容列表。WindowName窗口名。ClassName类名。
2024-12-14 14:13:47
746
原创 C语言学习day21:DeleteFile/开发文件删除工具、错误码排查技巧
首先,我们要知道windows是微软的一个操作系统,操作系统上会有很多的应用软件,比如QQ、微信QQ、微信在保存文件、删除文件的时候不是直接就删除了,而是需要和操作系统做沟通,告诉操作系统我要删除文件那这种沟通的“暗语"就是WindowsAPI,沟通的方式就是调用Windows API。API:应用程序的接口。简单点说,就是平台或者系统开放给“编程开发人员"使用的接口,通过调用接口可以实现相应的功能。比如我要删除文件,那么我就弄一个删除文件的接口来调用。
2024-12-14 03:21:00
801
2
原创 C语言学习day20:typedef语句
函数指针类型通常很复杂,typedef可以让它们更易于理解和使用。// 定义函数指针类型// 加法函数// 减法函数// 定义一个函数指针变量op = add;return 0;typedef只是定义别名,并不创造新类型。比如中,INT和int是等价的,INT只是int的一个别名。和#define的区别typedef是由编译器处理的,具有类型检查功能。#define是由预处理器处理的,只是简单的文本替换,没有类型检查。示例:// 等价于 int* a, b;
2024-12-14 02:26:41
227
原创 C语言学习day19:结构体/枚举/共用体/游戏结构体的逆向分析
结构体通过struct关键字定义,后跟结构体名称和一对花括号,花括号内是结构体的成员(字段)。// 定义一个结构体// 学生姓名int age;// 学生年龄// 学生成绩// 声明一个结构体变量// 为结构体成员赋值// 输出结构体成员return 0;int age;} p1, p2;// 同时声明 p1 和 p2。
2024-12-14 02:15:59
883
原创 C语言学习day18:字符串操作/ANSI编码/宽字节/消息框/软件/游戏编码/逆向分析中的编码
wchar_t是C语言中的宽字符类型,用来表示支持多字节字符集的字符。宽字符用于表示多种语言(如中文、日文等)中的字符,能够存储更多的信息。使用宽字符时,打印时需要用到wprintf函数,而不是printf。在Windows上,wchar_t通常占用2字节,在Linux等系统上占用4字节。// 函数,代码的入口函数int main()// 字符串常量// 正确:str1应该是字符指针// 宽字符字符串// 宽字符数组wchar_t str3[] = L"我爱";// 宽字符数组。
2024-12-13 00:46:22
1531
原创 C语言学习day17:指针数组的应用与函数指针以及正向、逆向的概念
函数指针是一种指向函数的指针类型。它可以存储函数的地址,并可以通过该指针调用函数。返回类型 (*指针名)(参数类型1, 参数类型2, ...);
2024-12-12 02:19:11
1562
原创 C语言学习day16:指针
就拿这串来说明,我们在定义函数时,用到了 void *这个通用指针,而这个if语句判断,则是在看传过来的值是否为整型,也就是int类型,但这时,我们的int *ptr它的值还是地址,我们需要帮他弄成所在地址的数据,这时我们就需要解引用,也就是*。指针是一个变量,它存储的是另一个变量的地址。所以就有了 * (int *)ptr,这时它的值则为ptr的值。上面说了,指针被赋予的值应该是地址,所以这串代码会输出什么?变量存放的是数据,而指针则是存放数据的地址。没错,居然不是a的地址,而是a的数值:50。
2024-12-11 23:33:45
496
原创 C语言学习day16:多维数组(了解)
它代表了我定义了一个三维数组,数组的名字=arr,数组的长度=3,每个数组元素又是一个二维数组,这个二维数组的长度=2;每个二维数组的元素又是一个一维数组,它的长度=2;假设我现在定义一个三位数组。
2024-02-18 00:23:15
250
1
原创 C语言学习day16:二维数组练习
/定义一个数组,存储五名学生三门成绩(通过键盘输入)//求出每名学生的总成绩,平均成绩。//求出每门学科的总成绩,平均成绩。
2024-02-18 00:09:53
648
原创 C语言学习day16:二维数组
没错,它们还是连续性的,并且每个元素相隔的规律和一维数组一样。假如我现在要找1,那么它的下标就会是arr[0][0];我们发现arr=arr[0]=arr[0][0]由整个数组的大小/第一个数组元素的大小。数据类型 数组名[行][列] =接下来我们遍历一下二维数组的地址。这证明了我们的结论是完全正确的。同时二维数组还有三种写法。说明取的依然是首地址。
2024-02-17 23:47:29
516
原创 C语言学习day15:数组定义的格式
在数组中,如果给定了数组元素的数量,而实际值的数量小于所定的数量,那么缺少的位置将被填充为0;而如果实际值的数量超过了所定的数量,多余的值将被舍弃。若仅提供数量却未给出具体数值,各下标对应的值将显得混乱;而一旦赋予该下标相应的数值,即可得到精确而准确的数值。下面我们试试通过键盘输入,存放数据。数组的写法格式有很多种。
2024-02-16 13:16:08
528
原创 C语言学习day14:数组定义和使用
接下来我们看看数组在内存中的地址,它是怎样存放的;究竟是一个一个存还是一串全部存进去,究竟是连续性的还是不连续性的。因此我们可以得出结论:数组在内存中占的大小=数组类型(int类型=4字节)*元素个数。我们的数组一共有10个值,每个值占了4个字节,因此 数组在内存中占40字节大小。可以看见我们的数组在内存中占了40个字节大小,因为sizeof的单位是int。内存中是以16进制来存储的,同时我们定义的数组是int类型,4个字节大小;数组是在内存中连续的相同类型的变量空间。接下来我们说说数组在内存中占的大小。
2024-02-16 00:01:41
1240
原创 C语言学习day14:跳转语句
在这段代码中,一定要定义j,因为跳转时是在循环里面,这时没有定义j的数值。continue:结束当前的循环迭代,进行下一次的迭代。上一篇文章已经说过了break和continue。break:结束这个循环。这些就是跳转语句的内容。无条件跳转,尽量少用。也可以怎么写(代码)
2024-02-15 22:11:23
349
原创 C语言学习day13:嵌套循环+练习题(时钟+乘法表)
第一次循环时都满足条件,输出为i=0,j=0,里层的循环满足条件,迭代循环,输出为i=0,j=1......以此类推,当里层循环不满足条件时,跳出里层循环,这时外层循环进行迭代。往里运行,输出为i=1,j=0......写一个时钟案例,秒真转一圈则分针+1,分针转一圈则时针+1,秒最大60,分最大60,时最大24。输出的%02d意思是:输出的整数宽度为2,如果整数的位数不足2位,则在左边用0填充。这里的代码从外往里运行,先是i=0,当循环运行到第二层循环时,往里运行。这时,j=0,条件j<5,j++。
2024-02-14 20:00:52
328
原创 C语言学习day13:for循环练习(生成随机数)
通过程序随机一个1-100的数,用户通过键盘输入数字 看是否匹配,匹配成功则跳出循环,失败则继续循环。
2024-02-14 19:04:42
1258
原创 C语言学习day12:水仙花(do while)
一个三位数(100-999),获取其中所有各个位数的相加等于这个数本身 的数。我们写立方要a*a*a,这样太繁琐,尽量自己先写一写,差不多了再看答案。求次方我们可以用一个方法。
2024-02-10 13:15:22
643
原创 C语言学习day11:do while语句
do while语句首先执行循环体语句,然后再判断条件表达式的值。如果条件表达式为真,则继续执行循环体语句,然后再次判断条件表达式的值。do while语句先执行一次循环体语句,再判断条件表达式的值,而while语句先判断条件表达式的值,再决定是否执行循环体语句。这是因为循环体语句会先执行一次,然后判断条件i <= 5的值,如果为真,则继续执行循环体语句,直到条件为假时,循环终止。使用do while语句时需要注意循环体语句至少会执行一次,因为条件判断是在循环体执行完之后才进行的。
2024-02-10 12:58:14
302
原创 C语言学习day10:while语句
100以内凡是带7的数字以及7的倍数,都需要敲桌子,否则正常输出。while语句到此就结束了,现在我们写一个练习;
2023-12-26 01:42:12
1026
原创 C语言学习day10:switch语句
switch又有说法叫开关语句当在C语言中遇到复杂的条件判断时,可以使用switch语句来简化代码。它允许根据不同的条件值执行不同的代码块。switch语句由一个表达式和多个case标签组成,每个case标签表示一个可能的条件值。当表达式的值与某个case标签的值匹配时,与该case标签关联的代码块将被执行。
2023-12-26 01:12:55
460
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人