以前从没听说过这个东西,这是在做HOOK API时知道的概念,书上有个例子,通过PE文件,找到了程序所有的导入函数名和地址,但自己不是很懂,能帮忙描述下PE文件吗,最好推荐本书,上面对PE文件介绍的比较详细,因为我手上这本书支PE文件的描述就几句话,我想知道关于PE文件的更多的知识..
谢谢!!
谢谢!!
解决方案 »
- pcap 线程里奇怪的问题?
- 汉字本身是全角字符,还是半角字符呀,输入中文时,在全角状态下输入汉字与在半角状态下输入汉字,我看没有区别呀?纯汉字(不含数字)有全角半角之分吗?
- html标签中的size属性和width属性怎样进行转换?有比率吗?
- 如何实现对软件的保护,如限制使用时间等?
- 请教一个“宏定义”的问题
- 哪位大哥能给个用API函数加载自定义图标和位图的简单源码,能运行就行.谢谢
- 请高手指点:操作CString对象时,经常出现:UnHanlded Exception: 0x00000005 access violation!
- 请教各位大侠一个简单的InstallShield问题,小女子这厢有礼了
- 有谁对CISCO路由器有研究?帮帮兄弟。
- 有人知道如何将.wdl 文档转换成.doc
- 公司今天考核,要做一个通讯录,里面要求图标有五种形态,100求解
- error LNK2005
http://www.pediy.com/tutorial/chap8/Chap8-1-7.htm
http://www.codesky.net/showhtml/4178.htm
up up
study study
anyone who can introduce the personal view about the "PE" ??
第2章
自己写了个代理函数,
void __stdcall MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType)
但是,如果我去掉 __stdcall 把这个代理函数声明为
void MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType)
就会在运行时出错,下面是源码,程序没问题,我想知道的是为什么加了 "__stdcall",程序就没问题// Test3.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <windows.h>
#include <imagehlp.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ImageHlp")//HOOK API
void SetHook();
//代理函数
//如果把 __stdcall 去掉 改成下面形式就会出错
//void MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType);void __stdcall MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType);HMODULE g_hMod;int main(int argc, char* argv[])
{
//应用程序句柄
g_hMod = GetModuleHandle(NULL);
//调用系统的函数MessageBox
MessageBox(NULL, "Hello World!", "", MB_OK);
//HOOK API
SetHook();
//再次调用MessageBox
MessageBox(NULL, "Hello World!", "", MB_OK);
system("pause");
return 0;
}//代理函数,去掉__stdcall,就出现错误
//void MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType)
void __stdcall MyMessage(HWND hWnd , LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
printf("Hello World!\n");
}void SetHook()
{
//得到导入表的头指针
IMAGE_IMPORT_DESCRIPTOR* pImportDes ;
DWORD dwSize;
pImportDes = (IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(g_hMod,
TRUE,
IMAGE_DIRECTORY_ENTRY_IMPORT,
&dwSize);
//得到模块 USER32.dll
while (pImportDes->FirstThunk)
{
//得到模块名称
char* pszDllName = (char*)((BYTE*)g_hMod + pImportDes->Name);
if (strcmp(pszDllName, "USER32.dll") == 0)
{
break;
}
pImportDes++;
}
//在USER32.dll模块中,找到函数MessageBoxA
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)g_hMod + pImportDes->OriginalFirstThunk);
while (pThunk->u1.Function)
{
//函数名
char* pszFuncName = (char*)((BYTE*)g_hMod + (DWORD)pThunk->u1.AddressOfData + 2);
if (strcmp(pszFuncName, "MessageBoxA") == 0)
{
break;
}
pThunk++;
}
//修改导入地址表, 使导入地址表中MessageBoxA的地址指向代理函数的地址
DWORD* pszFuncAddr = (DWORD*)((BYTE*)g_hMod + pImportDes->FirstThunk );
DWORD* MyFuncAddr = (DWORD*)MyMessage;
WriteProcessMemory(GetCurrentProcess(), pszFuncAddr, &MyFuncAddr, sizeof(DWORD), NULL);
}
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
网上有人说是 调用约定申明不一致 是不是以后要HOOK windows API,在声明代理函数时,都要写成__stdcall形式??
在做Hook时,要根据被Hook的函数的原型来定义Hook函数。(目前Windows API都是WINAPI类型,也就是__stdcall)
Get It..