32.设置断点与无痕Hook的原理
无痕Hook的原理1.C语言使用VirtualAlloc分配内存后写入指令调用12345678910111213141516171819202122232425262728293031323334353637383940#include <stdio.h>#include <windows.h>void test(){ // 使用 VirtualAlloc 分配内存,确保内存页面可执行 SIZE_T size = 1; // 1 字节的内存 unsigned char* arry = (unsigned char*)VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (arry == NULL) { printf("Memory allocation failed.\n"); return; } // 将内存填充为 RET 指令 ar ...
31.C语言在windows中捕获异常
Windows捕获会引起程序崩溃的异常1.给空指针赋值引起的异常(__try __except)访问冲突(Access Violation):
这通常发生在尝试访问无效或不可访问的内存地址时,例如空指针解引用或访问已释放的内存。
示例:int* ptr = NULL; *ptr = 5; 或 free(ptr); ptr = NULL; *ptr = 10;
123456789101112131415161718192021#include <windows.h>#include <stdio.h>void test() { __try { // 这里执行可能会抛出异常的代码 int* ptr = NULL; *ptr = 42; // 这会触发访问冲突异常 } __except (EXCEPTION_EXECUTE_HANDLER) { // 捕获异常并处理 printf("An exception occurred! ...
30.使用C语言在windows中用数组执行机器指令
[toc]
一、在C语言中直接使用数组执行机器指令1.写一个C语言程序,内容为调用MessageBoxA弹出一个消息框12345678910111213141516#include <stdio.h>#include <string.h>#include <windows.h>void MessageC(){ MessageBoxA(0,"MessageC", 0, 0); return;}int main() { MessageC(); return 0;}
2.写一个C语言程序,内容为使用x86内联汇编调用MessageBoxA弹出一个消息框12345678910111213141516171819202122232425#include <stdio.h>#include <string.h>#include <windows.h>void MessageA(){ char *message = &quo ...
28.C语言在Windows中获得system权限的方法
[toc]
利用系统进程来创建新的进程lsass.exe系统中没有加载kernel32.dll,只有ntdll.dll,需要先将kernel32.dll注入到lsass.exe进程中
1.使用CreateProcessWithTokenW获取其他进程令牌来创建新的进程之前的文章写过: 6.使用C语言在windows中创建线程与进程并且创建具有system权限进程
C:\Windows\System32\kernel32.dll
2. 将Dll注入到系统进程中弹出cmd程序
编写x86_64位dll程序并编译
将Dll注入到拥有系统权限进程winlogn.exe的程序中,系统如果有两个winlogn.exe会有一个没效果,注入器需要有管理员与Debug权限
完整代码,功能为创建一个cmd.exe
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960//dllmain.c#include <Windows ...
29. 利用系统进程加载Dll到其他进程中(系统进程可能会出现bug)
[toc]
一、将Dll注入到系统进程后加载Dll到其他进程中1.编写Dll1.dll文件,注入到winlogon.exe中
dllmain1.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950//dllmain1.c#include <Windows.h>#include "Load1.h"HMODULE g_hDll = NULL;DWORD WINAPI UnloadThreadCallBack(PVOID param);DWORD WINAPI UnloadThread();// DLL 主函数BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH ...
1.使用C语言在Windows程序中播放音频
[toc]
使用c语言中的媒体库播放声音1.c语言使用Winapi播放声音
准备一个WAV格式的音乐,PlaySound函数只能播放WAV格式的音乐
123456789101112#include <windows.h>#include <mmsystem.h>#include <stdio.h>#pragma comment(lib,"winmm.lib")int main() { BOOL flag=PlaySoundA("D:\\Users\\3\\Videos\\落叶的位置.wav", NULL, SND_SYNC); if(!flag)printf("%d\n",GetLastError()); return 0;}
准备一个mp3格式的音乐,使用mciSendString播放
123456789101112131415161718192021222324#include <windows.h>#include < ...
C语言中使用MySql下:使用服务器中的MySql
[toc]
一 、配置服务端1. 安装kali2. 在kali中开启MySql
打开MySql服务
12systemctl start mysql#service mysql restart
查看MySql状态
12systemctl status mysql#service mysql status
MySQL初始化
1mysql_secure_installation
初始化之后再重启服务
1systemctl restart mysql
运行MySQL测试一下,exit退出
1mysql
3. 开启服务器中MySql的访问权限,使其他主机可以连接服务器的MySql数据库
在服务器中启动MySql
1mysql
列出所有MySql用户
1SELECT user FROM mysql.user;
选择数据库mysql
1use mysql
显示数据库mysql,里面保存了所有用户
1SELECT user,host FROM user;
创建新用户命名为new
1CREATE USER 'new'@'%' IDEN ...
C语言使用MySql上:使用本地中的MySql
[toc]
一、准备工作1.安装MySql2.使用MySql数据库新建一个表
使用cmd开启服务,以管理员身份运行cmd
1net start MySQL80
切换到mysql中bin命令
1cd C:\Program Files\MySQL\MySQL Server 8.0\bin
命令行连接数据库
1mysql -h localhost -u root -p123456
使用sql语句新建一个数据库
1CREATE DATABASE test DEFAULT CHARSET utf8;
选择数据库
1use test
使用sql语句新建一个表格
1234567CREATE TABLE book ( book_id int PRIMARY KEY AUTO_INCREMENT, book_name varchar(60) NOT NULL, book_author varchar(60) NOT NULL, book_shelf int DEFAULT 0, book_addtime datetime NOT NULL);
给表格插入一条数据
...
27.通过调试程序读取内存地址数据
[toc]
读取数据1.准备一个被调试程序,编译前关闭随机基址1234567891011121314#include <Windows.h>#include <stdio.h>int main(){ SetConsoleTitleA("Message"); printf("Message.exe 0x%X\n",GetModuleHandle(TEXT("Message.exe"))); SIZE* addr = 0x140000000; printf("0x140000000 value 0x%x",*addr); getchar(); return TRUE;}
2.用C语言调试已经打开的Message.exe并读取0x14000000地址处的数据123456789101112131415161718192021222324252627282930313233343536 ...
26.C语言隐藏函数调用
[toc]
C语言通过内联汇编隐藏函数调用1. 通过C语言内联汇编隐藏调用函数,将需要调用的地址放到[ebp+4]的位置(此程序执行成功,但会堆栈不平衡造成程序崩溃)12345678910111213141516171819202122#include <windows.h>#include <stdio.h>#pragma optimize("",off)void empty(){ printf("1:empty\n");}int main(){ _asm { mov eax, empty mov [ebp + 4], eax } printf("2:stack\n");}#pragma optimize("",on)
2.通过C语言裸函数内联汇编隐藏调用函数,将需要调用的地址放到[ebp+4]的位置,使用[ebp+4]的值前将[ebp+4]的值赋予[ebp+8]1234567891011121314151617 ...
