2000下可執(zhí)行文件修改自身
2000下可執(zhí)行文件修改自身pjf(jfpan20000@sina.com)
總有人問起這個老問題,其實在2年前在bbs上貼過的有關(guān)windows
內(nèi)核句柄的帖子就詳細寫了改寫正運行程序的方法,原理一樣。為了減
少郵箱信件,所以再整理一下放到一個google一下就可發(fā)現(xiàn)的地方:)
另創(chuàng)一個程序改自己當然不是這里說的。NT系統(tǒng)中程序修改自身,
只需做下面幾步:
1、先只讀打開程序(自然也可以是其他程序)自身,獲取一句柄。
2、從EPROCESS開始,訪問句柄表的數(shù)據(jù)結(jié)構(gòu),找出該句柄掩碼。
3、修改掩碼,此刻已可通過該句柄對正在運行的可執(zhí)行文件進行
修改了。
4、做需要的文件操作。
關(guān)于句柄表的簡單描述,請搜尋以前的貼過的有關(guān)的帖子,不再贅訴。
下面是一簡單的示例程序:
#include<windows.h>
#include<stdio.h>
#include"rwpm.h"
void ModifyProt2000(HANDLE h)
{
USHORT pointer1, pointer2, pointer3;
ULONG addr;
ULONG index = (ULONG)h;
addr = GetData((PVOID)0xffdff124);
addr = GetData((PVOID)(addr+0x22c));
addr = GetData((PVOID)(addr+0x128));
pointer3 = (USHORT)(index&0x000003FF);
pointer2 = (USHORT)((index&0x0003FC00)>>10);
pointer1 = (USHORT)((index&0x03FC0000)>>18);
addr = GetData((PVOID)(addr+8));
addr = GetData((PVOID)(addr+pointer1*4));
addr = GetData((PVOID)(addr+pointer2*4));
//以上是步驟2,下面是步驟3
SetData((PVOID)(addr+(pointer3/2+1)*4), 0xffffffff);
}
int main()
{
HANDLE h;
char buf[MAX_PATH];
DWORD ret;
GetModuleFileName( NULL, buf, MAX_PATH );
h = CreateFile( buf, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, \
FILE_ATTRIBUTE_NORMAL, 0 );
if ( h == INVALID_HANDLE_VALUE )
return 0;
if ( !InitLib() )
{
printf( "init failed\n" );
return 0;
}
ModifyProt2000( h );
WriteFile( h, "AAAAAA", 6, &ret, 0 );
CloseHandle( h );
ExitLib();
return 0;
}
在windows2000下執(zhí)行后可以看到文件開始變?yōu)?#8220;AAAAAA”。
其中用到的InitLib/GetData等函數(shù)在那個進程隱藏代碼中已給出,不重復(fù)貼了。
至于在XP等系統(tǒng)上的代碼,這里就不給出了,要修改的部分是句柄掩碼的
定位(句柄表結(jié)構(gòu)有變化)、InitLib中頁目錄的定位。有了思路自己hack是比
較簡單的。
好短,確實簡單了點。
ULONG GetData(PVOID addr)
{
ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);
PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, 4, 0, phys & 0xfffff000, 0x1000);
if (tmp==0)
return 0;
ULONG ret=tmp[(phys & 0xFFF)>>2];
UnmapViewOfFile(tmp);
return ret;
}
BOOL SetData(PVOID addr,ULONG data)
{
ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);
PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, FILE_MAP_WRITE, 0, phys & 0xfffff000, 0x1000);
if (tmp==0)
return FALSE;
tmp[(phys & 0xFFF)>>2]=data;
UnmapViewOfFile(tmp);
return TRUE;
}
posted on 2007-05-14 00:55 葉子 閱讀(797) 評論(0) 編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)安全