【软件安全】显示选中进程的API函数
来源:互联网 发布:大恒软件 编辑:程序博客网 时间:2024/06/05 15:10
1.显示当前的所有进程:
//显示所有进程 void getAllProcess(HANDLE handle){ //HANDLE handle1; //定义要结束进程句柄 PROCESSENTRY32 *info; //定义PROCESSENTRY32结构字指 //PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32) info=new PROCESSENTRY32; info->dwSize=sizeof(PROCESSENTRY32); //调用一次 Process32First 函数,从快照中获取进程列表 Process32First(handle,info); //重复调用 Process32Next,直到函数返回 FALSE为止,打印进程信息 while(Process32Next(handle,info)!=FALSE){ info->szExeFile; //指向进程名字 printf("ProcessName:%s\n",info->szExeFile); printf("ProcessID: %d\n\n",info->th32ProcessID); } //通过进程号选中进程 int processID; printf("请输入你需要的进程号:"); scanf("%d",&processID); //再次调用 Process32First 函数,获取进程列表 Process32First(handle,info); //重复调用 Process32Next,直到函数返回 FALSE为止,对比进程号,找出指定进程 while(Process32Next(handle,info)!=FALSE){ if(processID==info->th32ProcessID){ HANDLE hfilename = NULL ; hfilename = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,info->th32ProcessID ); MODULEENTRY32 pes; //这个结构描述了一个条目从一个列表,列举了一个指定的进程所使用的模块。 pes.dwSize = sizeof(MODULEENTRY32); if (hfilename == NULL ){ printf("文件名字访问失败!"); } BOOL i = Module32First(hfilename,&pes); char* ppath=pes.szExePath; printf("ProcessDir: %s\n",ppath); printf("ProcessName:%s\nProcessID:%d\n",info->szExeFile,info->th32ProcessID); //FALSE=可继承,info->th32ProcessID=进程ID } } CloseHandle(handle); return; }
2.通过进程路径获取该进程,映射到本进程,从而再获取本进程加载的API函数 :
int main(){ HANDLE handle; //定义CreateToolhelp32Snapshot系统快照句柄 handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得系统快照句柄 getAllProcess(handle); char s[255]; printf("请输入文件绝对路径(ProcessDir):\n"); scanf("%s",s); HANDLE hFile=(HANDLE)CreateFile(s,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(hFile==INVALID_HANDLE_VALUE){//无效句柄 hFile=NULL; TCHAR *buffer; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,(LPTSTR)&buffer,0,NULL); MessageBox(0,buffer,TEXT("Error"),MB_OK); //无法打开该进程 CloseHandle(hFile); printf("handle失败\n"); return 0; } else{ printf("handle有效\n"); } //创建一个新的进程映射到内核对象 HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,100,NULL); if(!hFileMap){ TCHAR *buffer; printf("hFileMap失败\n"); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,(LPTSTR)&buffer,0,NULL); MessageBox(0,buffer,TEXT("Error"),MB_OK); CloseHandle(hFileMap); return 0; } else{ printf("新的进程映射到内核对象\n"); } //映射文件视图到调用进程的地址空间,返回值是映射视图的开始位置 LPVOID lpMemory=MapViewOfFile(hFileMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0); HMODULE hModule = ::GetModuleHandleA(NULL); IMAGE_DOS_HEADER* pDosHeader=(IMAGE_DOS_HEADER*)hModule; IMAGE_OPTIONAL_HEADER* pOpNtHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)hModule+pDosHeader->e_lfanew+24); //这里加24 IMAGE_IMPORT_DESCRIPTOR* pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModule +pOpNtHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); while (pImportDesc->FirstThunk){ char* pszDllName=(char*)((BYTE*)hModule+pImportDesc->Name); printf("模块名称:%s\n",pszDllName); DWORD n = 0; //一个IMAGE_THUNK_DATA就是一个导入函数 IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModule + pImportDesc->OriginalFirstThunk); while (pThunk->u1.Function){ //取得函数名称 char* pszFuncName = (char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2); //函数名前面有两个.. printf("function name:%-25s, ", pszFuncName); //取得函数地址 PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImportDesc->FirstThunk) + n; //从第一个函数的地址,以后每次+4字节 printf("addrss:%X\n", lpAddr); n++; //每次增加一个DWORD pThunk++; } printf("\n"); pImportDesc++; } //停止当前程序的一个内存映射 UnmapViewOfFile(lpMemory); //关掉该新建的文件映射 CloseHandle(hFileMap); //关掉原文件句柄 CloseHandle(hFile); system("pause"); return 0;}
3.依旧存在的问题:
- 涉及需要提升权限才可以操作的进程,在CreateFile时报错:拒绝访问,使用管理员身份运行也不可以;
- 一些进程的dir显示不出来;
- 正打开的进程无法映射,在CreateFile时报错:另一个程序正在使用此文件,进程无法访问;
- 显示的API函数是将我们需要的进程映射到当前进程而来,不是单独的选中的进程,不知是否可以利用文件的内存结构,获取IAT表的位置并进行读取。
4.部分结果截图:
最后,欢迎大家到我的个人主页http://jiaqianli.cn/,有更为详细的介绍,希望一起交流、学习,一起进步~
阅读全文
0 0
- 【软件安全】显示选中进程的API函数
- Revit API 开发 (2): 显示选中的图元(element)
- 【软件安全】API HOOK
- 与进程相关的API函数
- 关于界面显示的Windows API函数
- DataGrid 显示选中的item
- 用CreateProcess API函数来创建相应的进程
- 利用CreateProcess API函数来创建相应的进程
- 用CreateProcess API函数来创建相应的进程
- 进程与线程函数(API)
- SystemParametersInfo API 函数,此功能的状态可以被选中,启用,或禁用根据需要
- arcgis flex api 由于沙箱安全的原因 无法显示地图 的解决办法
- 简单的API函数调用实例(隐藏/显示任务栏)
- 进程相关的API
- 杀死进程的API
- 常用 API 函数: 进程和线程函数
- 关于API的安全控制
- 相对安全的 restful api
- Java多线程开发
- POJ 1681 Painter's Problem 笔记
- 5月
- eclipse下载,安装,配置教程(多图)
- 按层遍历二叉树
- 【软件安全】显示选中进程的API函数
- getch() getchar()
- 关闭win10的IIS
- [BZOJ 1853][Scoi2010]幸运数字:容斥原理
- Hibernate学习总结(二)
- Vladik and Memorable Trip CodeForces
- CaysnPrinter
- java影院票务管理系统项目开发计划
- 一个网站 Code/Android/