C++获取指定程序的IAT

今天学习导入表,于是便通过程序将获取IAT的过程实现一下,各位看官发现什么问题,请多指教。谢谢!废话不多说,下面是代码:

#include <iostream>
#include <windows.h>
#include <winnt.h>

using namespace std;

int main(int argc, char* argv[])
{

	if (argc != 2)
	{
		cout << "Usage: " << argv[0] <<" "<<argv[1]<<endl;
		exit(1);
	}

	HANDLE hFile = NULL;
	IMAGE_DOS_HEADER * pDosHeader = NULL;

	cout << argv[0] << "  " << argv[1] << endl;
	WCHAR  pwchar[255] = {0};
	MultiByteToWideChar(CP_ACP, 0, argv[1], sizeof(argv[1]) + 1, pwchar, sizeof(pwchar)/sizeof(pwchar[0]));
	//hFile = CreateFile("D:\\project\\PEInfo\\Debug\\Loadsys.exe", GENERIC_READ, FILE_SHARE_READ| FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
		cout << "CreateFile Error" << GetLastError() << endl;
	HANDLE hMap = 0;
	hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
	if (!hMap)
		cout << "CreatefileMapping Error !" << endl;

	void * lpMemory = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
	pDosHeader = (IMAGE_DOS_HEADER *)lpMemory;

	if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
		cout << "This File is not a PE File !" << endl;

	IMAGE_NT_HEADERS* pNtHeader = (IMAGE_NT_HEADERS*)((BYTE*)pDosHeader + pDosHeader->e_lfanew);

	cout << "----------------------------------------------------------------------" << endl;
	cout << "Number of Section: " << pNtHeader->FileHeader.NumberOfSections << endl;

	for (int i = 0; i < pNtHeader->FileHeader.NumberOfSections; ++i)
	{
		IMAGE_SECTION_HEADER * pSectionHeader = (IMAGE_SECTION_HEADER *)((pNtHeader->FileHeader.SizeOfOptionalHeader + 24 + (BYTE*)pNtHeader) + i * 0x28);
		cout << "Setction Name: " << pSectionHeader->Name << endl;
	}

	cout << "----------------------------------------------------------------------" << endl;
	IMAGE_IMPORT_DESCRIPTOR * pImportTabe = (IMAGE_IMPORT_DESCRIPTOR *)(pNtHeader->OptionalHeader.DataDirectory[1].VirtualAddress + (BYTE*)pDosHeader);
	IMAGE_IMPORT_DESCRIPTOR* pOriginalImportTable = pImportTabe;
	IMAGE_THUNK_DATA * pThunk = nullptr;
	IMAGE_IMPORT_BY_NAME* pINT = nullptr;
	DWORD n = 0;
	while (pImportTabe->Name)
	{
		cout <<"+-------------------------------------------------------------------"<< endl;

		cout << "+动态库:" << pImportTabe->Name + (BYTE*)pDosHeader << endl;

		cout << "                     +----导入函数名称表:" << endl;

		pThunk = (IMAGE_THUNK_DATA *)(pImportTabe->OriginalFirstThunk + (BYTE*)pDosHeader);
		while (pThunk->u1.Function)
		{

			pINT = (IMAGE_IMPORT_BY_NAME*)(pThunk->u1.Function + (BYTE*)pDosHeader);
			cout <<"                                     |------"<< pINT->Hint << " : " << pINT->Name << endl;
			cout << ((DWORD*)(pImportTabe->FirstThunk + (BYTE*)pDosHeader) + n)<<endl;
			//printf("%x \n", ((DWORD*)(pImportTabe->FirstThunk + (BYTE*)pDosHeader) + n));
			n++;
			pThunk = (IMAGE_THUNK_DATA*)((BYTE*)pThunk + 4);

		}

		pImportTabe = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)pImportTabe + 20);
	}

	cout << "----------------------------------------------------------------------" << endl;

	return 0;
}
时间: 2024-10-28 06:07:32

C++获取指定程序的IAT的相关文章

获取当前程序路径

1. 本来想用java中的方式的,网上查到一些信息,我的测试代码如下: 1 String str = System.getProperty("java.class.path"); 2 String strUsrDir = System.getProperty("usr.dir"); 3 URL url = this.getClass().getResource(""); // **Test1.class 即 Class.forName("

简介(1)-概述、一个简单的时间获取客户程序

1.概述 大多数网络应用划分:客户(client)和服务器(server) 一些复杂的网络应用:异步回调通信,即服务器向客户发起请求消息. 协议栈:应用协议.TCP协议.IP协议.以太网协议 局域网(local area network,LAN),广域网(wide area network,WAN). 路由器是广域网的架构设备. 因特网:当今最大的广域网. POSIX:一种被多数厂商采纳的标准. 2.一个简单的时间获取客户程序 1)创建套接字 socket函数 2)指定服务器的IP地址和端口 s

c# 获取当前程序运行根目录

//获取绝对路径,调用如 string fileName = string.Format("~/RuleConfigFiles/Campaign_{0}.JSON", CampaignID);var localFile = Utilities.MapPath(fileName); static public string MapPath(string url) { if (HttpContext.Current != null) return HttpContext.Current.S

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

jQuery -&gt; 获取指定上下文中的DOM元素

作者 : 卿笃军 一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中.您也许会使用+来串联字符串以达到附加新字符或字符串 的目的,但+会产生一个新的String实例.如果程序对这种附加字符串的需求很频繁,并不建议使用+来进行字符串的串联.在面向对象程序设计中,最好是 能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为.J2SE 5.0提供java.lang.StringBuilder类,使用这个类所产生的

VC 获取指定文件夹路径的方法小结

VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath(NULL,buf,CSIDL_PROGRAM_FILES,NULL);AfxMessageBox(buf); 2 获取应用程序数据路径的文件夹 TCHAR bufApplicateData[_MAX_PATH];SHGetSpecialFolderPath(NULL,bufApplicateData

递归获取指定盘符下的所有文件及文件夹

 /// <summary>         /// 递归获取指定盘符下的所有文件及文件夹         /// 存在部分文件夹访问权限问题         /// </summary>         /// <param name="path">string path = @"G:\"; </param>         /// <param name="filter">strin

Java中获取指定日为星期几及其他日期操作

摘自:http://blog.csdn.net/cselmu9/article/details/8625530#t6 在开发中经常会使用到一些日期方面的操作,下面例子展示几个常用的操作. 1.取得指定日期是星期几 取得指定日期是星期几可以采用下面两种方式取得日期是星期几: a.使用Calendar类 1 //根据日期取得星期几 2 public static String getWeek(Date date){ 3 String[] weeks = {"星期日","星期一&q

WinAPI: GetClassName - 获取指定窗口的类名

WinAPI: GetClassName - 获取指定窗口的类名 //声明: GetClassName( hWnd: HWND; {指定窗口句柄} lpClassName: PChar; {缓冲区} nMaxCount: Integer {缓冲区大小} ): Integer; {返回类名大小; 失败返回 0} -------------------------------------------------------------------------------- //测试1: 新建一个工程