青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 33,  comments - 33,  trackbacks - 0

 編譯過(guò)的二進(jìn)制代碼本身是一種數(shù)據(jù)結(jié)構(gòu),在代碼被載入內(nèi)存執(zhí)行的時(shí)候,由操作系統(tǒng)對(duì)這種數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,具體到Win32平臺(tái),就是所謂的PE文件頭。
 對(duì)于Windows系統(tǒng),源代碼是如何轉(zhuǎn)化為二進(jìn)制代碼?全局變量存儲(chǔ)在什么地方,如何初始化?共享變量是如何工作?理解PE文件格式能更好地理解上面的問(wèn)題.舉個(gè)例子,我們使用C++編寫(xiě)源代碼,這些源代碼被編譯器翻譯成obj格式的目標(biāo)文件,每一個(gè)目標(biāo)文件都包含著全局變量、常量數(shù)據(jù)、資源、可執(zhí)行代碼、用于鏈接的符號(hào)名以及調(diào)試信息。模塊的目標(biāo)文件通過(guò)鏈接器與庫(kù)鏈接在一起,而庫(kù)自身是一種將目標(biāo)文件組合在一起的格式。此外,鏈接器將所有已經(jīng)初始化的全局變量合并到一個(gè)段中,將所有未初始化的全局變量合并到另一個(gè)段中,再將所有的執(zhí)行代碼放入到另一個(gè)段中等。為什么要將目標(biāo)文件的不同部分進(jìn)行分組分段呢?主要是保護(hù)資源和優(yōu)化資源的使用。例如常數(shù)和可執(zhí)行代碼是只讀的,如果操作系統(tǒng)檢測(cè)到對(duì)這部分內(nèi)存進(jìn)行寫(xiě)操作時(shí),就會(huì)發(fā)出錯(cuò)誤。又例如,所有的Win32程序都是用同一個(gè)gdi32.dll,這樣就優(yōu)化了內(nèi)存的使用,gdi32.dll的可執(zhí)行代碼段自在內(nèi)存中存儲(chǔ)一次。
 PE文件格式

PE格式保留了多個(gè)目錄,通??梢钥吹降哪夸浻袑?dǎo)入、綁定導(dǎo)入、延遲導(dǎo)入、到處、重定位、資源和調(diào)試信息。將這些段和目錄組合在一起,

加上兩個(gè)頭,就成為了PE文件。
 -----------------
|IMAGE_DOS_HEADER | : 兼容DOS程序運(yùn)行
|-----------------|
|DOS 存根程序     | : 小程序,用于顯示錯(cuò)誤信息的軟件中斷然后退出,
|-----------------|
|PE Header        | : 真正的PE頭
|-----------------|
|Section Table    |  : 段表
|-----------------|
|Section 1        |
|-----------------|
|Section 2        |
|-----------------|
|Section ...      |
|-----------------|
|Section n        |
 --------------
對(duì)于DOS存根程序,由于存根程序長(zhǎng)度不定,所以要DOS頭的e_lfanew確定偏移。
段的名稱和作用如下:
節(jié)名   作用
.arch  最初的構(gòu)建信息(Alpha Architecture Information)
.bss   未經(jīng)初始化的數(shù)據(jù)
.CRT   C運(yùn)行期只讀數(shù)據(jù)
.data   已經(jīng)初始化的數(shù)據(jù)
.debug   調(diào)試信息
.didata  延遲輸入文件名表
.edata  導(dǎo)出文件名表
.idata  導(dǎo)入文件名表
.pdata      異常信息(Exception Information)
.rdata  只讀的初始化數(shù)據(jù)
.reloc  重定位表信息
.rsrc  資源
.text   .exe或.dll文件的可執(zhí)行代碼
.tls  線程的本地存儲(chǔ)器
.xdata  異常處理表

PE文件存儲(chǔ)的地址有些以虛擬地址的形式存儲(chǔ),不過(guò)一旦其相應(yīng)模塊被加載,它們就可以使用。下面編寫(xiě)一個(gè)簡(jiǎn)單的PEFile的C++類,來(lái)說(shuō)明
PE文件的使用。
我們要實(shí)現(xiàn)一個(gè)小小的鉤子程序,將MessageBoxA改成我們自己設(shè)定的程序中去,由于程序比較簡(jiǎn)單,不再贅述,詳見(jiàn)程序中的注釋。
PEFile.h

 

#ifndef PE_FILE_H
#define PE_FILE_H

class PEFile
{
public:
    PEFile(HMODULE _hModule);
    
const void* getDirectory(int _id);
    PIMAGE_IMPORT_DESCRIPTOR getImportDescriptor(LPCSTR _pDllName);
    
const unsigned * getFunctionPtr(PIMAGE_IMPORT_DESCRIPTOR _pImport,LPCSTR _pProcName);
    FARPROC setImportAddress(LPCSTR _pDllName,LPCTSTR _pProcName,FARPROC _pNewProc);
    FARPROC setExportAddress(LPCSTR _pProcName,FARPROC _pNewProc);
private:
    
const char* m_pModule;//模塊
    PIMAGE_DOS_HEADER m_pDOSHeader;//DOS頭
    PIMAGE_NT_HEADERS m_pNTHeader;//NT頭
}
;
#endif


PEFile.cpp

#include <Windows.h>
#include 
"PEFile.h"

PEFile::PEFile(HMODULE _hModule)
{
    m_pModule 
= (const char*)_hModule;
    
if (IsBadReadPtr(m_pModule,sizeof(IMAGE_DOS_HEADER)))
    
{
        m_pDOSHeader 
= 0;
        m_pNTHeader 
= 0;
    }

    
else
    
{
        m_pDOSHeader 
= (PIMAGE_DOS_HEADER)m_pModule;
        
if (IsBadReadPtr(m_pModule + m_pDOSHeader->e_lfanew,sizeof(IMAGE_NT_HEADERS)))
        
{
            m_pNTHeader 
= 0;
        }

        
else
        
{
            m_pNTHeader 
= (PIMAGE_NT_HEADERS)(m_pModule + m_pDOSHeader->e_lfanew);
        }

    }

}


const void* PEFile::getDirectory(int _id)
{
    
return m_pModule + (m_pNTHeader->OptionalHeader.DataDirectory[_id].VirtualAddress);
}


//返回引入的模塊
PIMAGE_IMPORT_DESCRIPTOR PEFile::getImportDescriptor(LPCSTR _pDllName)
{
    PIMAGE_IMPORT_DESCRIPTOR pImport 
= (PIMAGE_IMPORT_DESCRIPTOR)getDirectory(IMAGE_DIRECTORY_ENTRY_IMPORT);
    
if (pImport == 0)
    
{
        
return 0;
    }

    
//一個(gè)一個(gè)查找
    while(pImport->FirstThunk)
    
{
        
if (stricmp(_pDllName,m_pModule + pImport->Name) == 0)
        
{
            
return pImport;
        }

        
++pImport;
    }

    
return 0;
}


//返回引入的函數(shù)
const unsigned * PEFile::getFunctionPtr(PIMAGE_IMPORT_DESCRIPTOR _pImport,LPCSTR _pProcName)
{
    PIMAGE_THUNK_DATA pThunk 
= (PIMAGE_THUNK_DATA)(m_pModule + _pImport->OriginalFirstThunk);
    
//一個(gè)一個(gè)查找
    for (int i = 0; pThunk->u1.Function ; ++i)
    
{
        
bool isMatch = false;
        
if (pThunk->u1.Ordinal & 0x80000000)
        
{
            isMatch 
= (pThunk->u1.Ordinal & 0xFFFF== ((DWORD)_pProcName);
        }

        
else
        
{
            isMatch 
= stricmp(_pProcName,(m_pModule + ((unsigned)pThunk->u1.AddressOfData +2 ))) == 0;
        }


        
if (isMatch)
        
{
            
return ((unsigned *)(m_pModule + _pImport->FirstThunk)) + i;
        }

        
++pThunk;
    }

    
return 0;
}


//設(shè)定導(dǎo)入的函數(shù)地址
FARPROC PEFile::setImportAddress(LPCSTR _pDllName,LPCTSTR _pProcName,FARPROC _pNewProc)
{
    PIMAGE_IMPORT_DESCRIPTOR pImport 
= getImportDescriptor(_pDllName);
    
if (pImport)
    
{
        
//拿到某模塊的某函數(shù)地址
        const unsigned* pfn = getFunctionPtr(pImport,_pProcName);
        
if (IsBadReadPtr(pfn,sizeof(DWORD)))
        
{
            
return 0;
        }

        FARPROC oldproc 
= (FARPROC)*pfn;

        
//寫(xiě)入自定的函數(shù)地址
        DWORD dwWritten;
        WriteProcessMemory(GetCurrentProcess(),(
void*)pfn,&_pNewProc,sizeof(DWORD),&dwWritten);
        
return oldproc;
    }

    
return 0;
}


//導(dǎo)出目錄
FARPROC PEFile::setExportAddress(LPCSTR _pProcName,FARPROC _pNewProc)
{
    PIMAGE_EXPORT_DIRECTORY pExport 
= (PIMAGE_EXPORT_DIRECTORY)getDirectory(IMAGE_DIRECTORY_ENTRY_EXPORT);
    
if (pExport == 0)
    
{
        
return 0;
    }

    unsigned ord 
= 0;
    
if ((unsigned)_pProcName < 0xFFFF)
    
{
        ord 
= (unsigned)_pProcName;
    }

    
else
    
{
        
const DWORD* pNames = (const DWORD*)(m_pModule + pExport->AddressOfNames);
        
const WORD* pOrds = (const WORD*)(m_pModule + pExport->AddressOfNameOrdinals);
        
for (unsigned i = 0; i < pExport->AddressOfNames; ++i)
        
{
            
if (stricmp(_pProcName,m_pModule + pNames[i]) == 0)
            
{
                ord 
= pExport->Base + pOrds[i];
                
break;
            }

        }

    }

    
if ( (ord < pExport->Base) || (ord > pExport->NumberOfFunctions))
    
{
        
return 0;
    }

    DWORD 
*pRVA = ((DWORD*)(m_pModule + pExport->AddressOfFunctions)) + ord - pExport->Base;
    DWORD rslt 
= *pRVA;
    DWORD dwWritten 
= 0;
    DWORD newRVA 
= (DWORD)_pNewProc - (DWORD)m_pModule;
    WriteProcessMemory(::GetCurrentProcess(),pRVA,
&newRVA,sizeof(DWORD),&dwWritten);
    
return (FARPROC)(m_pModule + rslt);
}


測(cè)試代碼:

#include <Windows.h>
#include 
"PEFile.h"


int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR pText,LPCSTR pCaption,UINT uType)
{
    
char buf1[128];
    
char buf2[128];
    strcpy(buf1,pCaption);
    strcat(buf1,
"  -  catch!");

    strcpy(buf2,pText);
    strcat(buf2,
"  -  catch!");

    
return MessageBoxExA(hWnd,buf2,buf1,uType,0);
}


int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
    
{
        PEFile pe(hInstance);
        pe.setImportAddress(
"user32.dll","MessageBoxA",(FARPROC)MyMessageBoxA);
        MessageBoxA(
0,"Test","SetImportAddresss",MB_OK);
    }

    HMODULE hUser 
= GetModuleHandle("user32.dll");
    PEFile user32(hUser);
    FARPROC oldproc 
= GetProcAddress(hUser,"MessageBoxA");
    user32.setExportAddress(
"MessageBoxA",(FARPROC)MyMessageBoxA);
    FARPROC newproc 
= GetProcAddress(hUser,"MessageBoxA");
    
char temp[64];
    wsprintf(temp, 
"GetProcAddress(MessageBoxA)\n"
        
"changes from %x to %x", oldproc, newproc);
    MessageBoxA(NULL, temp, 
"SetExportAddress", MB_OK);
    
return 0;
}


運(yùn)行一下可以發(fā)現(xiàn),MessageBoxA已經(jīng)變成自定義的函數(shù),并且使用導(dǎo)出目錄的方法導(dǎo)出函數(shù),GetProcAddress將返回新函數(shù)的地址,將來(lái)DLL載入此進(jìn)程時(shí)也會(huì)和新函數(shù)鏈接。



 

posted on 2011-09-02 20:18 bennycen 閱讀(2379) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Windows Programming
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产乱码最新视频| 伊人久久亚洲热| 性色av一区二区三区在线观看| 麻豆9191精品国产| 榴莲视频成人在线观看| 久久久激情视频| 久久久久久一区二区三区| 久久久久久久精| 免费观看成人www动漫视频| 欧美jizz19性欧美| 亚洲国产网站| 9色porny自拍视频一区二区| 夜夜嗨av一区二区三区免费区| 一区二区高清在线观看| 亚洲欧美国产va在线影院| 欧美一区观看| 老鸭窝91久久精品色噜噜导演| 欧美11—12娇小xxxx| 欧美巨乳在线| 国产精品一二三视频| 一区二区三区在线视频免费观看| 亚洲国产一区二区三区a毛片| 最新国产乱人伦偷精品免费网站| 亚洲精品日韩在线观看| 亚洲主播在线| 麻豆久久精品| 99热这里只有成人精品国产| 午夜亚洲视频| 欧美精品色网| 国产视频一区在线| 亚洲精品一区二区三区不| 午夜视频久久久| 麻豆亚洲精品| 99av国产精品欲麻豆| 久久国产精品久久w女人spa| 欧美精品v日韩精品v国产精品| 国产精品永久免费在线| 亚洲精品美女在线| 久久经典综合| 亚洲视频导航| 欧美黄免费看| 国产一区二区三区视频在线观看 | 亚洲一区在线播放| 久久九九全国免费精品观看| 欧美激情在线有限公司| 亚洲视频视频在线| 免费在线亚洲欧美| 国产专区欧美精品| 亚洲一区二区在线免费观看| 欧美成在线视频| 午夜欧美视频| 国产麻豆精品theporn| 99国内精品久久| 欧美激情网友自拍| 美国成人毛片| 亚洲国产精品久久久久秋霞蜜臀| 久久精品成人一区二区三区| 亚洲先锋成人| 国产精品视频网站| 欧美综合国产精品久久丁香| 亚洲一区二区三区四区五区午夜| 欧美日韩视频在线一区二区| 亚洲茄子视频| 欧美黑人国产人伦爽爽爽| 久久综合色影院| 精品动漫一区二区| 欧美高清日韩| 欧美激情亚洲一区| 亚洲视频精选| 亚洲午夜三级在线| 国产伦一区二区三区色一情| 欧美一区二区性| 小黄鸭精品aⅴ导航网站入口| 国产日韩欧美a| 久久精品视频在线看| 久久gogo国模裸体人体| 国产亚洲成年网址在线观看| 久久久久久久成人| 久久se精品一区二区| 亚洲性av在线| 国产伦精品一区二区三区免费| 国产日韩欧美不卡在线| 久久久久.com| 午夜精品久久久久久久| 国产精品免费观看在线| 亚洲一区www| 亚洲深爱激情| 国产精品一区二区在线观看不卡| 一区二区三区不卡视频在线观看| 亚洲高清视频一区| 模特精品裸拍一区| 亚洲国产精品悠悠久久琪琪| 欧美91视频| 美女精品国产| 99精品国产热久久91蜜凸| 91久久精品国产91久久性色tv| 欧美成人官网二区| 99精品欧美一区二区蜜桃免费| 午夜在线一区二区| 美女91精品| 一区二区三区导航| 亚洲午夜激情| 久久久水蜜桃| 亚洲福利国产精品| 亚洲九九精品| 国产精品免费aⅴ片在线观看| 欧美1区2区3区| 欧美日韩国产首页| 欧美一级淫片播放口| 欧美一区二区三区久久精品茉莉花 | 亚洲美女网站| 久久国产精彩视频| 91久久精品www人人做人人爽| 亚洲欧洲日本mm| 国产女主播一区| 嫩草国产精品入口| 欧美日韩国产欧| 久久久久国产精品午夜一区| 每日更新成人在线视频| 亚洲二区在线视频| 欧美一区二区成人| 日韩系列欧美系列| 香蕉久久夜色| 99re6这里只有精品视频在线观看| 一区二区三区精品国产| 欲色影视综合吧| 一区二区三区国产| 中日韩美女免费视频网址在线观看 | 久久精品最新地址| 一本综合久久| 久久嫩草精品久久久精品| 国产欧美精品一区aⅴ影院| 夜夜精品视频一区二区| 在线免费日韩片| 夜夜嗨av一区二区三区中文字幕 | 开元免费观看欧美电视剧网站| 一区二区三区国产盗摄| 亚洲一级一区| 国产人成精品一区二区三| 亚洲国产精品久久久久久女王| 国产精品亚洲欧美| 亚洲人成网站色ww在线| 影音先锋日韩资源| 小辣椒精品导航| 亚洲黄色有码视频| 欧美激情国产高清| 免费观看30秒视频久久| 国产日韩欧美a| 亚洲一区二区在线视频 | 美女脱光内衣内裤视频久久网站| 亚洲综合日本| 欧美日韩精品综合在线| 久久久国产一区二区| 国精品一区二区三区| 久久久久久亚洲精品杨幂换脸| 欧美日韩一区二区在线| 亚洲福利国产| 亚洲欧洲免费视频| 免费欧美视频| 欧美中在线观看| 亚洲成人在线| 另类天堂视频在线观看| 美女日韩在线中文字幕| 国内精品嫩模av私拍在线观看| 亚洲深夜影院| 性欧美大战久久久久久久免费观看 | 中文精品在线| 亚洲天堂免费在线观看视频| 欧美区国产区| 亚洲麻豆视频| 亚洲一区二区三区三| 国产精品高潮呻吟视频| 一区二区三区**美女毛片| 亚洲欧美日本日韩| 欧美成人在线网站| 亚洲精品字幕| 亚洲香蕉成视频在线观看| 国产精品毛片va一区二区三区| 亚洲一区二区免费| 久久精品国产视频| 永久久久久久| 久久精品国产免费| 亚洲人午夜精品免费| 在线视频免费在线观看一区二区| 欧美区国产区| 欧美一区视频| 亚洲高清在线精品| 亚洲一区视频在线观看视频| 欧美精品久久99| 久久精品理论片| 亚洲第一区在线| 亚洲午夜激情网站| 国产视频欧美视频| 欧美成人午夜视频| 夜夜嗨av色综合久久久综合网| 午夜激情综合网| 国产一二三精品| 欧美激情一区二区三区在线视频| 在线亚洲免费| 欧美国产日产韩国视频|