visual c++に基づくwindowsコアプログラミングコード分析(44)任意のプログラム関数の開始アドレスを監視する


多くの場合、プログラムのフレームワークを分析して、その関数に関する情報を理解しなければなりません.どのようにその関数情報を理解しなければなりませんか.
関数の開始アドレス,終了アドレス,コード長などの情報を監視しなければならない.
どうすればいいのでしょうか.プログラミングで実現します.
 
#include <windows.h>
#include <iostream.h>

DWORD code()
{
	//////////////////////////////////////////////////////////////////////////
	//	*******    *******
	//	**dwCodeBegin	:        
	//	**dwCodeEnd		:        
	//	**dwMyCodeAddr	:           
	//////////////////////////////////////////////////////////////////////////
	DWORD dwCodeBegin , dwCodeEnd , dwMyCodeAddr;

	//	*******    *******
	PBYTE pMove = NULL;

	//	*******               *******
	_asm
	{
		call	A
A:
		pop		eax

		mov		dwMyCodeAddr , eax
	}

	//	*******       *******
	pMove = (PBYTE)dwMyCodeAddr;

	//	*******               *******
	while(!((*pMove == 0x55) && (*(pMove + 1) == 0x8B)))
	{
		pMove --;
	}
	
	//	*******  pMove       push ebp *******
	dwCodeBegin = (DWORD)pMove;

	cout << "     :" << hex << dwCodeBegin << endl;

	//	*******            *******
	pMove = (PBYTE)dwMyCodeAddr;

	while (!((*(pMove + 1) == 0xc3) && (*pMove == 0x5D) && (*(pMove - 1) == 0xE5)))
	{
		pMove ++;
	}

	//	*******  pMove  ret      pop ebp *******
	dwCodeEnd = (DWORD)pMove;

	cout << "     :" << hex << dwCodeEnd << endl;

	return 0;
}

void main()
{
	//////////////////////////////////////////////////////////////////////////
	//	*******    *******
	//	**dwFunBegAddr	:       
	//	**dwFunEndAddr	:       
	//	**dwFunCodeLen	:    
	//	**dwJmpOff		:jmp        
	//////////////////////////////////////////////////////////////////////////
	DWORD dwFunBegAddr , dwJmpOff , dwFunEndAddr , dwFunCodeLen;

	//////////////////////////////////////////////////////////////////////////
	//	*******             *******
	//////////////////////////////////////////////////////////////////////////

	//	*******       *******
	PBYTE pMove = NULL;
	
	//	*******       jmp  *******
	pMove = (PBYTE)code;
	
	//	*******   jmp      *******
	pMove ++;

	//	*******        *******
	dwJmpOff = *(PDWORD)pMove;

	//	*******jmp        (code + 5)+             *******
	dwFunBegAddr = (DWORD)code + 5 + dwJmpOff;

	cout << "     :" << hex << dwFunBegAddr << endl;

	//////////////////////////////////////////////////////////////////////////
	//	*******      ,       *******
	//////////////////////////////////////////////////////////////////////////

	//	*******              *******
	pMove = (PBYTE)dwFunBegAddr;

	//	*******    ,    *******
	while (!((*(pMove + 1) == 0xc3) && (*pMove == 0x5D) && (*(pMove - 1) == 0xE5)))
	{
		pMove ++;
	}

	//	*******  pMove  ret     *******
	dwFunEndAddr = (DWORD)pMove;

	cout << "       :" << hex << dwFunEndAddr << endl;

	//	*******          ,      *******
	dwFunCodeLen = dwFunEndAddr - dwFunBegAddr;

	cout << "      :" << (int)dwFunCodeLen << endl;

	//	*******    *******
	code();

	return;
}