• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            讓EXE導(dǎo)出函數(shù)

            Posted on 2009-10-24 22:12 S.l.e!ep.¢% 閱讀(285) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): RootKit
            標(biāo) 題: 【原創(chuàng)】讓EXE導(dǎo)出函數(shù)
            作 者: ylp1332
            時(shí) 間: 2007-12-20,21:33
            鏈 接: http://bbs.pediy.com/showthread.php?t=56840

            初步搞定。

            問(wèn)題來(lái)源:
            偶然發(fā)現(xiàn)OllyDBG.exe導(dǎo)出了一堆函數(shù),這些函數(shù)都是供其插件調(diào)用的。對(duì)這種體系結(jié)構(gòu)很感
            興趣,想弄清楚它的實(shí)現(xiàn)原理。后來(lái)又看到梁肇新的書(shū)《編程高手箴言》第278頁(yè)提到的調(diào)用
            門(mén),覺(jué)得都應(yīng)該差不多。


            三種不同的解決辦法(原理可能是一樣的,:)):

            1)在導(dǎo)出函數(shù)聲明之前加上__declspec(dllexport)。例:
            __declspec(dllexport) int Add(int a, int b);
            __declspec(dllexport) int Sub(int a, int b);
            __declspec(dllexport) int Mul(int a, int b);
            __declspec(dllexport) int Div(int a, int b);

            2)在鏈接器參數(shù)中設(shè)置。例:
            #pragma comment(linker, "/EXPORT:_Add,@1,NONAME")
            #pragma comment(linker, "/EXPORT:_Sub,@2,NONAME")
            #pragma comment(linker, "/EXPORT:_Mul,@3,NONAME")
            #pragma comment(linker, "/EXPORT:_Div,@4,NONAME")

            3)添加一個(gè)def文件,例:
            EXPORTS
            ?? Add??????? @1?? NONAME
            ?? Sub??????? @2?? NONAME
            ?? Mul??????? @3?? NONAME
            ?? Div??????? @4?? NONAME
            另需要在鏈接器命令行參數(shù)中指定def文件名:
            /DEF:Callee.def
            注意:在def文件中不要有
            LIBRARY [library][BASE=address]
            這樣的語(yǔ)句。

            相比較而言,后兩種方法可以設(shè)置更多的參數(shù)。


            函數(shù)舉例:

            extern "C"
            {

            ?? int Add(int a, int b)
            ?? {
            ???? return (a + b);
            ?? }

            ?? int Sub(int a, int b)
            ?? {
            ???? return (a - b);
            ?? }

            ?? int Mul(int a, int b)
            ?? {
            ???? return (a * b);
            ?? }

            ?? int Div(int a, int b)
            ?? {
            ???? if (b == 0)
            ?????? return 0;
            ???? else
            ?????? return (a / b);
            ?? }

            }

            編譯時(shí)會(huì)自動(dòng)生成相應(yīng)的導(dǎo)出庫(kù)(lib)文件,供調(diào)用者使用。


            調(diào)用方法和普通的動(dòng)態(tài)鏈接庫(kù)調(diào)用一樣。
            調(diào)用者必須能夠找到被調(diào)用者的位置,否則報(bào)錯(cuò),被調(diào)用者是否運(yùn)行不影響。

            調(diào)用代碼舉例:

            extern "C"
            {
            ?? int Add(int a, int b);
            ?? int Sub(int a, int b);
            ?? int Mul(int a, int b);
            ?? int Div(int a, int b);
            }

            #pragma comment (lib, "Callee.lib")

            void CCallerDlg::OnBnClickedCalculate()
            {
            ?? // TODO: Add your control notification handler code here
            ?? UpdateData(TRUE);

            ?? switch (((CComboBox *)GetDlgItem(IDC_COMBO_OPERATOR))->GetCurSel())
            ?? {
            ?? case ADD:
            ???? {
            ?????? m_iResult = Add(m_iNum1, m_iNum2);
            ?????? break;
            ???? }
            ?? case SUB:
            ???? {
            ?????? m_iResult = Sub(m_iNum1, m_iNum2);
            ?????? break;
            ???? }
            ?? ...
            ?? ...


            我在OD中跟了一下,發(fā)現(xiàn)這跟調(diào)用動(dòng)態(tài)鏈接庫(kù)也差不多。
            不過(guò)那幾個(gè)函數(shù)被映射到下面的地址處:

            003810F0 >?? 8B4424 08????????????????? mov????? eax, dword ptr [esp+8]
            003810F4???? 8B4C24 04????????????????? mov????? ecx, dword ptr [esp+4]
            003810F8???? 03C1?????????????????????? add????? eax, ecx
            003810FA???? C3???????????????????????? retn
            003810FB???? CC???????????????????????? int3
            003810FC???? CC???????????????????????? int3
            003810FD???? CC???????????????????????? int3
            003810FE???? CC???????????????????????? int3
            003810FF???? CC???????????????????????? int3
            00381100 >?? 8B4424 04????????????????? mov????? eax, dword ptr [esp+4]
            00381104???? 2B4424 08????????????????? sub????? eax, dword ptr [esp+8]
            00381108???? C3???????????????????????? retn
            00381109???? CC???????????????????????? int3
            0038110A???? CC???????????????????????? int3
            0038110B???? CC???????????????????????? int3
            0038110C???? CC???????????????????????? int3
            0038110D???? CC???????????????????????? int3
            0038110E???? CC???????????????????????? int3
            0038110F???? CC???????????????????????? int3
            00381110 >?? 8B4424 04????????????????? mov????? eax, dword ptr [esp+4]
            00381114???? 0FAF4424 08??????????????? imul???? eax, dword ptr [esp+8]
            00381119???? C3???????????????????????? retn
            0038111A???? CC???????????????????????? int3
            0038111B???? CC???????????????????????? int3
            0038111C???? CC???????????????????????? int3
            0038111D???? CC???????????????????????? int3
            0038111E???? CC???????????????????????? int3
            0038111F???? CC???????????????????????? int3
            00381120 >?? 8B4C24 08????????????????? mov????? ecx, dword ptr [esp+8]
            00381124???? 85C9?????????????????????? test???? ecx, ecx
            00381126???? 75 03????????????????????? jnz????? short 0038112B
            00381128???? 33C0?????????????????????? xor????? eax, eax
            0038112A???? C3???????????????????????? retn

            跟常規(guī)的動(dòng)態(tài)鏈接庫(kù)被映射到高地址處略有不同。
            還不知道是什么原因。

            結(jié)論:
            EXE完全可以和DLL一樣導(dǎo)出函數(shù),一樣被調(diào)用。

            進(jìn)一步的工作:
            我發(fā)現(xiàn)這個(gè)例子跟OllyDbg.exe還是有些不同,跟“調(diào)用門(mén)”的說(shuō)法也有不同。這里實(shí)際上還是
            跟DLL差不多的原理。下一步爭(zhēng)取實(shí)現(xiàn)一個(gè)跟OllyDbg.exe差不多的例子。

            致謝:
            感謝海風(fēng)月影、北極星2003、默數(shù)悲傷所提供的思路。
            久久久国产精品| 久久精品成人免费国产片小草| av色综合久久天堂av色综合在| 久久综合鬼色88久久精品综合自在自线噜噜 | 综合久久国产九一剧情麻豆| 国产成人精品久久| 国产精品一久久香蕉国产线看观看| 一本色道久久88综合日韩精品| 91久久精品无码一区二区毛片| 国产精品久久午夜夜伦鲁鲁| 亚洲国产精品一区二区久久hs| 久久综合九色综合欧美就去吻| 国产精品久久久久久久久久免费| 99久久成人国产精品免费| 久久天天躁狠狠躁夜夜96流白浆| 一97日本道伊人久久综合影院| 久久亚洲视频| 精品国产乱码久久久久软件| 久久夜色精品国产亚洲| 久久久国产精华液| 国内精品久久久人妻中文字幕 | 久久99精品久久久久久hb无码| 久久精品国产亚洲AV无码偷窥| 国产亚洲精久久久久久无码| 国产精品久久久福利| 久久久久亚洲AV成人网| 伊人久久亚洲综合影院| 欧美一区二区三区久久综合| 91久久精一区二区三区大全| 国产成人久久精品二区三区| 久久综合成人网| 99精品久久久久久久婷婷| 97久久久精品综合88久久| 国产精品日韩深夜福利久久| 国产香蕉久久精品综合网| 国产综合久久久久| 久久午夜综合久久| 久久精品中文闷骚内射| 久久99精品国产麻豆蜜芽| 婷婷久久久亚洲欧洲日产国码AV| 久久香蕉综合色一综合色88|