使用CBrother的CLIB库调用windows的API
时间:2019-11-18
本文章向大家介绍使用CBrother的CLIB库调用windows的API,主要包括使用CBrother的CLIB库调用windows的API使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用CBrother的CLIB库调用windows的API
2.1.0版本CBrother加入了CLib库,最新需要写一个工具,根据路径查杀一个Windows进程,研究了一下,CLib库的用法,感觉还是比较灵活的。
首先我要明确每一个API在系统的哪一个dll里面,我一般都是去微软官网查这个API。(https://docs.microsoft.com/zh-cn/windows/win32/api/),
比如我查OpenProcess这个API,查到如下内容
在Kernel32.dll里面,其他用到的API也都是这样获取信息,下面就可以写代码了。
1 import CBCLib.code 2 3 var g_kernel32_init = false; //kernel32.dll 是否初始化 4 var g_kernel32 = null; //Kernel32.dll 句柄 5 var g_kernel32_OpenProcess = null; //OpenProcess函数 6 var g_kernel32_CloseHandle = null; //CloseHandle函数 7 var g_kernel32_GetModuleFileNameExA = null; //GetModuleFileNameExA函数 8 var g_kernel32_GetLogicalDriveStringsA = null; //GetLogicalDriveStringsA函数 9 var g_kernel32_QueryDosDeviceA = null; //QueryDosDeviceA函数 10 11 var g_psapi_init = false; //psapi.dll 是否初始化 12 var g_psapi = null; //psapi.dll 句柄 13 var g_psapi_GetProcessImageFileNameA = null; //GetProcessImageFileNameA函数 14 15 const MAX_PATH = 1024; 16 17 //获取kernel32.dll里面的函数 18 function initkernel32() 19 { 20 if (g_kernel32_init) 21 { 22 return; 23 } 24 25 g_kernel32_init = true; 26 27 g_kernel32 = new CLib("kernel32.dll"); 28 if(!g_kernel32.load()) 29 { 30 print "kernel32.dll load err!"; 31 return; 32 } 33 34 //根据函数原型和CLib库类型对应关系写参数列表 35 g_kernel32_OpenProcess = g_kernel32.findFunc("OpenProcess","pointer","int","bool","int"); 36 g_kernel32_CloseHandle = g_kernel32.findFunc("CloseHandle","bool","int"); 37 g_kernel32_GetModuleFileNameExA = g_kernel32.findFunc("K32GetModuleFileNameExA","int","pointer","pointer","pointer","int"); 38 g_kernel32_GetLogicalDriveStringsA = g_kernel32.findFunc("GetLogicalDriveStringsA","int","int","pointer"); 39 g_kernel32_QueryDosDeviceA = g_kernel32.findFunc("QueryDosDeviceA","int","string","pointer","int"); 40 }
我还用到了psapi.dll里面的函数
1 //Psapi.dll里面的函数 2 function initpsapi() 3 { 4 if (g_psapi_init) 5 { 6 return; 7 } 8 g_psapi_init = true; 9 10 g_psapi = new CLib("Psapi.dll"); 11 if (!g_psapi.load()) 12 { 13 print "Psapi.dll load err!"; 14 return; 15 } 16 17 //根据函数原型和CLib库类型对应关系写参数列表 18 g_psapi_GetProcessImageFileNameA = g_psapi.findFunc("GetProcessImageFileNameA","int","pointer","pointer","int"); 19 }
下面是根据进程pid获取进程路径
1 const STANDARD_RIGHTS_REQUIRED = 0x000F0000; 2 const SYNCHRONIZE = 0x00100000; 3 function GetProcessPath(pid) 4 { 5 initkernel32(); 6 7 //打开目标进程 8 var hProcess = g_kernel32_OpenProcess.callFunc(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF,false,pid); 9 if (hProcess.isNull()) 10 { 11 print "openprocess err! " + pid; 12 return; 13 } 14 15 //构建一个buffer,GetModuleFileNameExA会把路径写进这个buffer里 16 var pathBuff = new CLibPointer(); 17 pathBuff.malloc(MAX_PATH); 18 19 var res = g_kernel32_GetModuleFileNameExA.callFunc(hProcess,null,pathBuff,MAX_PATH); 20 if(res > 0) 21 { 22 //GetModuleFileNameExA获取成功 23 res = pathBuff.readString(); 24 } 25 else 26 { 27 //有些系统获取不成功,需要使用另外一种方法。32位程序获取64位进程也需要用这种方法。 28 res = GetProcessPathByPsapi(hProcess); 29 } 30 31 //释放buffer 32 pathBuff.free(); 33 34 //关闭目标进程句柄 35 g_kernel32_CloseHandle.callFunc(hProcess); 36 return res; 37 }
如果GetModuleFileNameExA获取失败了,需要使用GetProcessImageFileNameA获取dos路径,然后转化成绝对路径
1 //使用GetProcessImageFileNameA获取进程路径 2 function GetProcessPathByPsapi(hProcess) 3 { 4 initkernel32(); 5 initpsapi(); 6 7 var newPath = ""; 8 var tempBuff = new CLibPointer(); 9 tempBuff.malloc(MAX_PATH); 10 var res = g_psapi_GetProcessImageFileNameA.callFunc(hProcess,tempBuff,MAX_PATH); 11 if(res > 0) 12 { 13 var driveStr = new CLibPointer(); 14 driveStr.malloc(MAX_PATH); 15 //获取所有盘符 16 if(g_kernel32_GetLogicalDriveStringsA.callFunc(MAX_PATH,driveStr)) 17 { 18 var dospath = tempBuff.readString(); 19 var driveName = new CLibPointer(); 20 driveName.malloc(MAX_PATH); 21 var copydriveStr = driveStr.copyAddr(); 22 23 //遍历盘符,和DOS盘符名称对照 24 while (1) 25 { 26 var szDrive = copydriveStr.readString(); 27 szDrive = strget(szDrive,0,2); 28 if(g_kernel32_QueryDosDeviceA.callFunc(szDrive,driveName,MAX_PATH)) 29 { 30 var dname = driveName.readString(); 31 var namelen = strlen(dname); 32 if(strnicmp(dname,dospath,namelen) == 0) 33 { 34 //对上了,说明就是这个路径 35 newPath = szDrive; 36 newPath += strget(dospath,namelen); 37 break; 38 } 39 40 //盘符指针向前加4获取下一个盘符 41 copydriveStr.addAddr(4); 42 } 43 else 44 { 45 break; 46 } 47 } 48 49 driveName.free(); 50 } 51 driveStr.free(); 52 } 53 54 tempBuff.free(); 55 return newPath; 56 }
下面就是在main函数使用
1 var g_path = "E:\\111\\test.exe"; //进程路径 2 var g_name = "test.exe"; //进程名 3 function main(params) 4 { 5 //这个函数是CBrother提供的,根据进程名获取pid,存到array里 6 var pidarr = GetProcessByName(g_name); 7 for (var i = 0; i < pidarr.size() ; i++) 8 { 9 //根据pid获取进程路径 10 var path = GetProcessPath(pidarr[i]); 11 if (path == g_path) 12 { 13 //如果路径匹配上了,杀掉。这个函数也是CBrother提供的,根据进程ID查杀进程 14 KillProcessByID(pidarr[i]); 15 } 16 } 17 }
上面这个api的用法我已经把代码发给作者了,作者说后续会加入lib库里,后续慢慢扩展成所有的api,这样在windows下使用api的就更方便了。
原文地址:https://www.cnblogs.com/aibiancheng123/p/11882569.html
- python中的递归函数
- 对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
- 玩转数据地图系列之——地图上的迷你条形图
- 树上倍增求LCA及例题
- 深度强化学习-DDPG算法原理和实现
- 你绝对想不到,数据地图还能这么玩~
- TensorFlow从0到1 - 17 - Step By Step上手TensorBoard
- 深度强化学习-Actor-Critic算法原理和实现
- 深度强化学习-Policy Gradient基本实现
- TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑
- 买卖股票算法题的后续!
- 一个例子教你如何与出题人斗智斗勇
- 用数据来聊聊国产电影~
- 如何买卖股票?不要慌,我有妙招!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)
- 深入探讨 JavaScript 逻辑赋值运算符
- Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?
- 谈谈volatile
- 【V-REP自学笔记(八)】控制youBot抓取和移动物体
- Gson 简单使用姿势小结
- 【SpringBoot WebFlux 系列】WebFlux 之 Path 参数解析与 url 映射
- 「推荐」阿里开源的分布式事务框架 Seata
- BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?
- 【SpringBoot WebFlux 系列】 header 参数解析
- MySQL为什么还有kill不掉的语句?
- 【SpringBoot DB 系列】h2databse 集成示例 demo
- 在grant语句之后要跟着flush privileges吗?
- Python实现数据写入 Excel 的三种模块!
- redis的两种持久化的机制,你真的了解么?