获取任意一个程序的输入表
来源:互联网 发布:银行家算法代码java 编辑:程序博客网 时间:2024/06/13 04:41
// testPE.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>/************************************************************************//* 函数名:RVAToOffset/* 函数功能:根据RVA计算出磁盘文件偏移/* 函数参数:lpBase:磁盘文件映射到内存后的起始地址VirtualAddress:RVA地址/* 函数返回值:成功返回磁盘文件偏移.否则返回0/************************************************************************/DWORD RVAToOffset(LPVOID lpBase,DWORD VirtualAddress){IMAGE_DOS_HEADER *dosHeader;IMAGE_NT_HEADERS *ntHeader;IMAGE_SECTION_HEADER *SectionHeader;int NumOfSections;dosHeader=(IMAGE_DOS_HEADER*)lpBase;ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);NumOfSections=ntHeader->FileHeader.NumberOfSections;for (int i=0;i<NumOfSections;i++){SectionHeader=(IMAGE_SECTION_HEADER*)((BYTE*)lpBase+dosHeader->e_lfanew+sizeof(IMAGE_NT_HEADERS))+i;if(VirtualAddress>SectionHeader->VirtualAddress&&VirtualAddress<SectionHeader->VirtualAddress+SectionHeader->SizeOfRawData){DWORD AposRAV=VirtualAddress-SectionHeader->VirtualAddress;DWORD Offset=SectionHeader->PointerToRawData+AposRAV;return Offset;}}return 0;}int _tmain(int argc, _TCHAR* argv[]){HANDLE hFile;HANDLE hMap;LPVOID lpBuffer= NULL;IMAGE_DOS_HEADER* lpDosHeader;IMAGE_NT_HEADERS* lpNTHeader;IMAGE_IMPORT_DESCRIPTOR * lpImportDesc;IMAGE_THUNK_DATA* lpThunkData;IMAGE_IMPORT_BY_NAME * lpImportByName;//获取文件句柄hFile=CreateFile(//L"d://notepad.exe", argv[1], GENERIC_ALL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){printf("open file error !%d",GetLastError());return 0;}//创建文件映射内核对象hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);if(hMap == INVALID_HANDLE_VALUE){printf("open map error !");CloseHandle(hFile);return 0;}//将一个文件映射对象映射到当前应用程序的地址空间lpBuffer=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,NULL,NULL,NULL);if (lpBuffer == NULL){printf("MapViewOfFile error ! %d",GetLastError());CloseHandle(hMap);CloseHandle(hFile);return 0;}//获取PE DOS 头lpDosHeader = (IMAGE_DOS_HEADER*)lpBuffer;if(lpDosHeader->e_magic != IMAGE_DOS_SIGNATURE){printf("this file not pe file !");CloseHandle(hMap);CloseHandle(hFile);UnmapViewOfFile(lpBuffer);return 0;}//获取NT头部lpNTHeader = (IMAGE_NT_HEADERS*)((BYTE *)lpBuffer+lpDosHeader->e_lfanew);if (lpNTHeader->Signature != IMAGE_NT_SIGNATURE){printf("this file not pe file !");CloseHandle(hMap);CloseHandle(hFile);UnmapViewOfFile(lpBuffer);return 0;}//获取导入表lpImportDesc=(IMAGE_IMPORT_DESCRIPTOR *)((BYTE*)lpBuffer+RVAToOffset(lpBuffer,lpNTHeader->OptionalHeader.DataDirectory[1].VirtualAddress));while (lpImportDesc->FirstThunk){char* DllName = (char*)((BYTE*)lpBuffer + RVAToOffset(lpBuffer,lpImportDesc->Name));lpThunkData = (IMAGE_THUNK_DATA*)((BYTE*)lpBuffer + RVAToOffset(lpBuffer,lpImportDesc->OriginalFirstThunk));while (lpThunkData->u1.Function){if (((lpThunkData->u1.Ordinal & IMAGE_ORDINAL_FLAG32) == 1)){printf("从%s模块导出的函数序号为%x\n",DllName,lpThunkData->u1.Ordinal&0xFFFF);}else{lpImportByName = (IMAGE_IMPORT_BY_NAME*)((BYTE*)lpBuffer + RVAToOffset(lpBuffer,lpThunkData->u1.AddressOfData));printf("从%s模块导出的函数为:%s\n",DllName,lpImportByName->Name);}lpThunkData++;}lpImportDesc++;}UnmapViewOfFile(lpBuffer);CloseHandle(hFile);CloseHandle(hMap);system("pause");return 0;}
0 0
- 获取任意一个程序的输入表
- 任意输入一个整数,输出这个值的加法表
- 然后程序输出它对应的2进制数 c语言程序:任意输入一个10进制数(小于255)
- 获取SQLite中任意的一个行
- c++编程:编写程序,任意输入一个字符串,将其中的最大字符放在字符串的第二个
- 编写一个词法分析,对于输入的一段程序,可以获取该程序的单词符号。
- 输入任意一个整数,返回它的阶乘
- 输入一个任意位数的整数进行逆序输出
- 任意输入一个正整数,计算其各个位的平方和
- 输入任意一个整数,编程判断这个数的奇偶性。
- 任意输入一个整数,编程判断它的奇偶性。
- 任意数组的输入
- 获取任意一个storyboard的视图控制器的方法
- Java--程序--获取任意一年的二月有多少天
- 获取一个字符串任意长度的子序列
- 获取一个字符串任意长度的子序
- 获取任意一个元素的高度和宽度
- 一个“发送到任意文件夹快捷方式”的脚本程序
- 第十三周 程序阅读
- eclipse配置weblogic时,提示does not contain a valid WebLogic Server install
- 对象的创建过程(来自《java编程思想》)
- 学徒浅析Android开发:第六讲——屏幕分辨率自适应
- ARM C C++内存对齐
- 获取任意一个程序的输入表
- 第三篇——第二部分——第二文 计划搭建SQL Server镜像
- 十四.1 吠叫吧,小动物们!!!
- 利用jquery实现wizard向导整理资料
- 在Hadoop中重写FileInputFormat类以处理二进制格式存储的整数
- 第十四周项目四立体类族共有的抽象类
- WinCE支持大容量(4G及以上)SD卡的解决办法
- 第14周 阅读程序,对照结果,定义成纯虚函数
- ElasticSearch的各种服务的URL(转)