首页 电脑 电脑学堂 查看内容

用进程注入来实现一个壳

2006-5-25 00:05 603 0

摘要: 作者: Simonzh2000[US] 感谢 too2y , 老王.这是我在学习老王的壳后, 参考网上的一些例子做的。比老王的壳差的太远, 希望各位不要见笑.如果各位写出了类似的加壳器, 希望发一个...
关键词: nbsp DWORD return 老王 TCHAR HANDLE OutputDebugStrin include lpidprocesses 加壳

#include #include #include #include #include #include #pragma comment ( lib, "ws2_32.lib" )#define NT_HANDLE_LIST 16#define MAX_HANDLE_LIST_BUF 0x200000typedef struct _HandleInfo{USHORT dwPid;   USHORT CreatorBackTraceIndex; BYTE  ObjType;BYTE  HandleAttributes;USHORT HndlOffset;DWORD dwKeObject;ULONG GrantedAccess;}HANDLEINFO, *PHANDLEINFO;typedef struct _IO_STATUS_BLOCK {DWORD Status;ULONG Information;} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;typedef struct _LSA_UNICODE_STRING {  USHORT Length;  USHORT MaximumLength;  PWSTR Buffer;} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef LSA_UNICODE_STRING UNICODE_STRING, *PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES {ULONG Length;HANDLE RootDirectory;  UNICODE_STRING *ObjectName;ULONG Attributes;PSECURITY_DESCRIPTOR SecurityDescriptor;PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;} OBJECT_ATTRIBUTES,*POBJECT_ATTRIBUTES;// 申明NtQuerySystemInformation()函数typedef DWORD (CALLBACK* NTQUERYSYSTEMINFORMATION)( DWORD, PDWORD, DWORD, PVOID );NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;typedef VOID (CALLBACK* RTLINITUNICODESTRING)(PUNICODE_STRING,PCWSTR);RTLINITUNICODESTRING RtlInitUnicodeString;typedef DWORD (CALLBACK* ZWOPENSECTION)(PVOID, DWORD,POBJECT_ATTRIBUTES); ZWOPENSECTION ZwOpenSection;typedef VOID(CALLBACK* INITIALIZEOBJECTATTRIBUTES)(POBJECT_ATTRIBUTES,PUNICODE_STRING,ULONG,HANDLE,PSECURITY_DESCRIPTOR);INITIALIZEOBJECTATTRIBUTES InitializeObjectAttributes;typedef DWORD (CALLBACK* ZWOPENFILE)(PHANDLE,DWORD,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG);ZWOPENFILE ZwOpenFile;DWORD getmap(PHANDLEINFO get1,LPVOID addr,HANDLE pm,char * buf){DWORD readset;LPVOID pmaddr1;int i;readset = (get1->dwKeObject>>0x16); readset = *((LPDWORD)((DWORD)addr + 4*readset));if((readset&0x000000ff)==1){  return 0;}else{ if((readset&0x000000ff)==0x80) {  pmaddr1 = MapViewOfFile(pm,4,0,readset&0xfffff000,0x1000);  readset = (get1->dwKeObject>>0x0c) & 0x3ff;   readset = *((LPDWORD)((DWORD)pmaddr1 + 4*readset));  UnmapViewOfFile(pmaddr1);  readset = readset & 0x0FFFFF000; } else {  readset=(readset&0xfffff000)+(get1->dwKeObject&0x003ff000); } pmaddr1 =MapViewOfFile(pm,4,0,readset,0x1000); if(pmaddr1!=NULL) {  readset = get1->dwKeObject&0x00000fff;  readset = (DWORD)pmaddr1+readset;  for(i=0;i  buf[i] = *((char *)(readset + i));  UnmapViewOfFile(pmaddr1); } else {  return 0; }}return readset;}int main( ){DWORD readset1;DWORD readset2;DWORD readset3;OVERLAPPED la;HMODULE hNtdll = NULL;DWORD dwNumEntries;PHANDLEINFO pHandleInfo;HANDLE htcp;HANDLE pmy;HANDLE hudp;HANDLE myhand;HANDLE h1=NULL;hNtdll = LoadLibrary( "ntdll.dll" );DWORD status;LPVOID pmaddr;TOKEN_PRIVILEGES NewState;DWORD dwNumBytes = MAX_HANDLE_LIST_BUF;PDWORD pdwHandleList;PDWORD pdwHandInfo;DWORD dwNumBytesRet; HANDLE hToken;BOOL isok;UNICODE_STRING dn;IO_STATUS_BLOCK ch3;int port1;int port2;HANDLE hProc;wchar_t * ch1 = L"\\Device\\Tcp";wchar_t * ch2 = L"\\Device\\Udp"; OBJECT_ATTRIBUTES ofs;DWORD i;DWORD p=0;char buf1[0x70];char buf2[0x70];char buf3[0x70];char in[0x18];char in1[0x18];char out[0x38];char out1[0x30];PHANDLEINFO tcpdnum;PHANDLEINFO udpdnum;if ( !hNtdll ){ printf( "LoadLibrary( NTDLL.DLL ) Error:%d\n", GetLastError() ); return false;}NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION) GetProcAddress( hNtdll, "NtQuerySystemInformation");RtlInitUnicodeString = (RTLINITUNICODESTRING) GetProcAddress( hNtdll, "RtlInitUnicodeString");ZwOpenSection = (ZWOPENSECTION) GetProcAddress( hNtdll, "ZwOpenSection");;InitializeObjectAttributes = (INITIALIZEOBJECTATTRIBUTES) GetProcAddress( hNtdll, "InitializeObjectAttributes");ZwOpenFile = (ZWOPENFILE) GetProcAddress( hNtdll, "ZwOpenFile");;RtlInitUnicodeString(&dn,L"\\Device\\PhysicalMemory");OBJECT_ATTRIBUTES udm= {     sizeof(OBJECT_ATTRIBUTES),     // Length     NULL,                // RootDirectory     &dn,                // ObjectName     0,                 // Attributes     NULL,                // SecurityDescriptor     NULL,                // SecurityQualityOfService     };status = ZwOpenSection(&h1,SECTION_MAP_READ,&udm);if(status == 0){ pmy = GetCurrentProcess(); pmaddr =MapViewOfFile(h1,4,0,0x30000,0x1000); NewState.PrivilegeCount=1; NewState.Privileges[0].Attributes=2; NewState.Privileges[0].Luid.HighPart=0; NewState.Privileges[0].Luid.LowPart=0; isok=LookupPrivilegeValue(0,SE_DEBUG_NAME,&NewState.Privileges[0].Luid); isok=OpenProcessToken(pmy,0x20,&hToken); isok=AdjustTokenPrivileges(hToken,0,&NewState,0x10,0,0); CloseHandle(hToken); RtlInitUnicodeString(&dn,ch1); ofs.SecurityDescriptor = 0;  ofs.ObjectName = &dn;  ofs.Length =0x18; ofs.RootDirectory = 0;  ofs.Attributes =0x40; ofs.SecurityQualityOfService =0; status=ZwOpenFile(&htcp,0x100000,&ofs,&ch3,3,0); RtlInitUnicodeString(&dn,ch2); ofs.ObjectName = &dn;  status=ZwOpenFile(&hudp,0x100000,&ofs,&ch3,3,0);  pdwHandleList = (PDWORD)malloc(dwNumBytes); pdwHandInfo = (PDWORD)malloc(2048); dwNumBytesRet = 0x10; isok = (*NtQuerySystemInformation)(0x10,pdwHandleList,dwNumBytes,&dwNumBytesRet); if( !isok) {  dwNumEntries = pdwHandleList[0];  pHandleInfo = (PHANDLEINFO)( pdwHandleList + 1 );  for (i = 0; i   {  if(pHandleInfo->dwPid == GetCurrentProcessId() && pHandleInfo->HndlOffset ==(int)htcp)  {   tcpdnum = pHandleInfo;   break;  }  pHandleInfo++;   }  pHandleInfo = (PHANDLEINFO)( pdwHandleList + 1 );  for (i = 0; i   {  if(pHandleInfo->dwPid == GetCurrentProcessId() && pHandleInfo->HndlOffset ==(int)hudp)  {   udpdnum = pHandleInfo;   break;  }  pHandleInfo++;   }  ZeroMemory(buf1,0x70);  ZeroMemory(buf2,0x70);  readset1 = getmap(tcpdnum,pmaddr,h1,buf1);  if(readset1==0)  {  printf("map tcp faile\n");  return 0;  }  readset2 = getmap(udpdnum,pmaddr,h1,buf2);  if(readset2==0)  {  printf("map udp faile\n");  return 0;  }  la.hEvent = CreateEvent(0,1,0,0);;  la.Internal = 0;  la.InternalHigh=0;  la.Offset = 0;  la.OffsetHigh = 0;  pHandleInfo = (PHANDLEINFO)( pdwHandleList + 1 );  for (i = 0; i   {  ZeroMemory(buf3,0x70);  if(pHandleInfo->ObjType == tcpdnum->ObjType)  {   readset3 = getmap(pHandleInfo,pmaddr,h1,buf3);   if(readset3==0)   {   pHandleInfo++;   continue;   }   if(buf3[4]==buf1[4] && buf3[5]==buf1[5]&& buf3[6]==buf1[6]&& buf3[7]==buf1[7])   {   if((buf3[16]==1 || buf3[16]==2) && buf3[17]==0 && buf3[18]==0 && buf3[19]==0)    {    hProc = OpenProcess(0x40,0,pHandleInfo->dwPid);    if(hProc==NULL)    {    pHandleInfo++;    continue;    }    DuplicateHandle(hProc,(HANDLE)pHandleInfo->HndlOffset,pmy,&myhand,0,0,2);    CloseHandle(hProc);    if(myhand==NULL)    {    pHandleInfo++;    continue;    }    ZeroMemory(out1,0x30);    ZeroMemory(out,0x38);    ZeroMemory(in,0x18);    ZeroMemory(in1,0x18);    in[0x10] = 4;    in1[0x10]=3;    if(buf3[16]==2)    {    p = 0;    isok = DeviceIoControl(myhand,0x210012,&in,0x18,&out,0x38,&p,&la);    if(isok==FALSE)    {     pHandleInfo++;     continue;    }    }    isok = DeviceIoControl(myhand,0x210012,&in1,0x18,&out1,0x30,&p,&la);    if(isok)      {    port1 = out1[12];    if(port1     port1 = 256 + port1;    port1 = port1*256;    port2 = out1[13];    if(port2     port1 = port1 + 256 + port2;    else     port1 = port1 + port2;    printf("TCP    PID:%d;      PORT:%d\n",pHandleInfo->dwPid,port1);     }    CloseHandle(myhand);   }        }        }    pHandleInfo++;  }  pHandleInfo = (PHANDLEINFO)( pdwHandleList + 1 );  for (i = 0; i   {  ZeroMemory(buf3,0x70);  if(pHandleInfo->ObjType == udpdnum->ObjType)  {   readset3 = getmap(pHandleInfo,pmaddr,h1,buf3);   if(readset3==0)   {   pHandleInfo++;   continue;   }   if(buf3[4]==buf2[4] && buf3[5]==buf2[5]&& buf3[6]==buf2[6]&& buf3[7]==buf2[7])   {   if((buf3[16]==1 || buf3[16]==2) && buf3[17]==0 && buf3[18]==0 && buf3[19]==0)    {    hProc = OpenProcess(0x40,0,pHandleInfo->dwPid);    if(hProc==NULL)    {    pHandleInfo++;    continue;    }    DuplicateHandle(hProc,(HANDLE)pHandleInfo->HndlOffset,pmy,&myhand,0,0,2);    CloseHandle(hProc);    if(myhand==NULL)    {    pHandleInfo++;    continue;    }    ZeroMemory(out1,0x30);    ZeroMemory(out,0x38);    ZeroMemory(in,0x18);    ZeroMemory(in1,0x18);    in[0x10] = 4;    in1[0x10]=3;    if(buf3[16]==2)    {    p = 0;    isok = DeviceIoControl(myhand,0x210012,&in,0x18,&out,0x38,&p,&la);    if(isok==FALSE)    {     pHandleInfo++;     continue;    }    }    isok = DeviceIoControl(myhand,0x210012,&in1,0x18,&out1,0x30,&p,&la);    if(isok)      {    port1 = out1[12];    if(port1     port1 = 256 + port1;    port1 = port1*256;    port2 = out1[13];    if(port2     port1 = port1 + 256 + port2;    else     port1 = port1 + port2;    printf("UDP    PID:%d;    PORT:%d\n",pHandleInfo->dwPid,(unsigned short)port1);     }    CloseHandle(myhand);   }        }       }  pHandleInfo++;  }    CloseHandle(la.hEvent);  free(pdwHandleList);  free(pdwHandInfo);  CloseHandle(h1);  CloseHandle(pmy);  CloseHandle(htcp);  CloseHandle(hudp);  UnmapViewOfFile(pmaddr); } else  printf("error open handlelist\n");}else printf("error open physcalmemory\n");return true;}前面的端口影射的有点小问题,修改如下呵呵,否则在一些启动过多程序下会抱不出来另外wssport的程序写的有问题,一个问题就是他的物理内存重影射也是错的,在一些机器上列不出来,另外他把UDP最后一个列的搞掉了。DWORD getmap(PHANDLEINFO get1,LPVOID addr,HANDLE pm,char * buf){DWORD readset;LPVOID pmaddr1;int i;readset = (get1->dwKeObject>>0x16); readset = *((LPDWORD)((DWORD)addr + 4*readset));if((readset&0x000000ff){  return 0;}if((readset&0x000000ff){ pmaddr1 = MapViewOfFile(pm,4,0,readset&0xfffff000,0x1000); readset = (get1->dwKeObject>>0x0c) & 0x3ff;  readset = *((LPDWORD)((DWORD)pmaddr1 + 4*readset)); UnmapViewOfFile(pmaddr1); readset = readset & 0x0FFFFF000;  }else{ readset=(readset&0xfffff000)+(get1->dwKeObject&0x003ff000);}pmaddr1 =MapViewOfFile(pm,4,0,readset,0x1000);if(pmaddr1!=NULL){ readset = get1->dwKeObject&0x00000fff; readset = (DWORD)pmaddr1+readset; for(i=0;i  buf[i] = *((char *)(readset + i)); UnmapViewOfFile(pmaddr1);}else{ return 0;}// }return readset;}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部