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;
}