获取任意一个程序的输入表
2014-05-27 14:46
375 查看
// 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; }
相关文章推荐
- 编写一个程序,对用户输入的任意一组数字字符如{3,1,4,7,2,1,1,2,2},输出其中出现次数最多的字符,并显示其出现次数。如果有多个字符出现次数均为最大且相等,则输出最先出现的那个字符和它出现
- 写一个程序,输入一个长整型数,输入一任意一个长整数,请用函数一求出长整数所有之和,用函数二求出长整型数的逆序数。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 写一个程序,输入一个长整型数,输入一任意一个长整数,请用函数一求出长整数所有之和,用函数二求出长整型数的逆序数。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 编写一个词法分析,对于输入的一段程序,可以获取该程序的单词符号。
- 写一个程序,输入一个长整型数,输入一任意一个长整数,请用函数一求出长整数所有之和,用函数二求出长整型数的逆序数。
- 写一个程序,输入一个长整型数,输入一任意一个长整数,请用函数一求出长整数所有之和,用函数二求出长整型数的逆序数。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- c++编程:编写程序,任意输入一个字符串,将其中的最大字符放在字符串的第二个
- Java程序练习:设计用户输入界面,获取网址采集规则
- 一个设置任意窗口透明度的命令行Delphi程序
- 我写的一个从百度服务器获取应答的程序_本来想获取百度首页的源代码的
- 获取串中的参数段,比如你输入一个字符串 set_tcp 127.0.0.1,9999; 这里有三个参数
- 一个输入数字转化为大写的小程序(用到递归)(转)
- 1. 请用C#的面向对象语言 实现 一个计算器控制台程序,要求输入两个数和运算符号,得到结果
- 一个不错的日历输入程序
- 一个日历输入空间的程序,我改的,加上了小时、分钟的输入
- 输入N个点的坐标,由程序判断该N个点是否能构成一个凸多边形。(VB)