示例#1
0
文件: fs.c 项目: vampuk/fsys
int deleteFile(const char* path) {
    fileDes *fileNode, *dirNode;
    char* data;
    char* preparedData;
    char *dir = getDirName(path);

    int dirNodeNum = getfileDes(dir, &dirNode);
    int fNodeNum = getfileDes(path, &fileNode);
    int size = readData(dirNode, &data);

    preparedData = (char *)malloc(size - sizeof(int));
    int i = 0, j = 0;
    while (i < size / sizeof(int)) {
        if (((int *)data)[i] != fNodeNum)
            ((int *) preparedData)[j++] = ((int *)data)[i];
        i++;
    }

    writeData(dirNode, preparedData, size, 0);
    dirNode->dataSize = size - sizeof(int);
    writefileDes(dirNodeNum);

    free(data);
    free(dir);

    return 0;
}
示例#2
0
int
main(int argc, char *argv[])
{
    if (argc < 3) {
        fprintf(stderr,
                "usage:\n"
                "  inject <dllname.dll> <command> [args] ...\n"
                "  inject <dllname.dll> <process-id>\n"
                "  inject <dllname.dll> !<process-name>\n"
        );
        return 1;
    }

    BOOL bAttach = FALSE;
    DWORD dwProcessId = ~0;
    if (isNumber(argv[2])) {
        dwProcessId = atol(argv[2]);
        bAttach = TRUE;
    } else if (argv[2][0] == '!') {
        const char *szProcessName = &argv[2][1];
        if (!getProcessIdByName(szProcessName, &dwProcessId)) {
            fprintf(stderr, "error: failed to find process %s\n", szProcessName);
            return 1;
        }
        bAttach = TRUE;
        fprintf(stderr, "dwProcessId = %lu\n", dwProcessId);
    }

    HANDLE hSemaphore = NULL;
    const char *szDll = argv[1];
    if (!USE_SHARED_MEM) {
        SetEnvironmentVariableA("INJECT_DLL", szDll);
    } else {
        hSemaphore = CreateSemaphore(NULL, 1, 1, "inject_semaphore");
        if (hSemaphore == NULL) {
            fprintf(stderr, "error: failed to create semaphore\n");
            return 1;
        }

        DWORD dwWait = WaitForSingleObject(hSemaphore, 0);
        if (dwWait == WAIT_TIMEOUT) {
            fprintf(stderr, "info: waiting for another inject instance to finish\n");
            dwWait = WaitForSingleObject(hSemaphore, INFINITE);
        }
        if (dwWait != WAIT_OBJECT_0) {
            fprintf(stderr, "error: failed to enter semaphore gate\n");
            return 1;
        }

        SetSharedMem(szDll);
    }

    BOOL bAttachDwm = FALSE;
    PROCESS_INFORMATION processInfo;
    HANDLE hProcess;
    if (bAttach) {
        BOOL bRet;
        HANDLE hToken   = NULL;
        bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
        if (!bRet) {
            fprintf(stderr, "error: OpenProcessToken returned %u\n", (unsigned)bRet);
            return 1;
        }

        LUID Luid;
        bRet = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid);
        if (!bRet) {
            fprintf(stderr, "error: LookupPrivilegeValue returned %u\n", (unsigned)bRet);
            return 1;
        }

        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = Luid;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        bRet = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof tp, NULL, NULL);
        if (!bRet) {
            fprintf(stderr, "error: AdjustTokenPrivileges returned %u\n", (unsigned)bRet);
            return 1;
        }

        DWORD dwDesiredAccess =
            PROCESS_CREATE_THREAD |
            PROCESS_QUERY_INFORMATION |
            PROCESS_QUERY_LIMITED_INFORMATION |
            PROCESS_VM_OPERATION |
            PROCESS_VM_WRITE |
            PROCESS_VM_READ |
            PROCESS_TERMINATE;
        hProcess = OpenProcess(
            dwDesiredAccess,
            FALSE /* bInheritHandle */,
            dwProcessId);
        if (!hProcess) {
            logLastError("failed to open process");
            return 1;
        }

        char szProcess[MAX_PATH];
        DWORD dwRet = GetModuleFileNameEx(hProcess, 0, szProcess, sizeof szProcess);
        assert(dwRet);
        if (dwRet &&
            stricmp(getBaseName(szProcess), "dwm.exe") == 0) {
            bAttachDwm = TRUE;
        }
    } else {
        std::string commandLine;
        char sep = 0;
        for (int i = 2; i < argc; ++i) {
            const char *arg = argv[i];

            if (sep) {
                commandLine.push_back(sep);
            }

            if (needsQuote(arg)) {
                quoteArg(commandLine, arg);
            } else {
                commandLine.append(arg);
            }

            sep = ' ';
        }

        STARTUPINFO startupInfo;
        memset(&startupInfo, 0, sizeof startupInfo);
        startupInfo.cb = sizeof startupInfo;

        // Create the process in suspended state
        if (!CreateProcessA(
               NULL,
               const_cast<char *>(commandLine.c_str()), // only modified by CreateProcessW
               0, // process attributes
               0, // thread attributes
               TRUE, // inherit handles
               CREATE_SUSPENDED,
               NULL, // environment
               NULL, // current directory
               &startupInfo,
               &processInfo)) {
            DWORD dwLastError = GetLastError();
            fprintf(stderr, "error: failed to execute %s (%lu)\n",
                    commandLine.c_str(), dwLastError);
            if (dwLastError == ERROR_ELEVATION_REQUIRED) {
                fprintf(stderr, "error: target program requires elevated priviledges and must be started from an Administrator Command Prompt, or UAC must be disabled\n");
            }
            return 1;
        }

        hProcess = processInfo.hProcess;
    }

    /*
     * XXX: Mixed architecture don't quite work.  See also
     * http://www.corsix.org/content/dll-injection-and-wow64
     */
    {
        typedef BOOL (WINAPI *PFNISWOW64PROCESS)(HANDLE, PBOOL);
        PFNISWOW64PROCESS pfnIsWow64Process;
        pfnIsWow64Process = (PFNISWOW64PROCESS)
            GetProcAddress(GetModuleHandleA("kernel32"), "IsWow64Process");
        if (pfnIsWow64Process) {
            BOOL isParentWow64 = FALSE;
            BOOL isChildWow64 = FALSE;
            if (pfnIsWow64Process(GetCurrentProcess(), &isParentWow64) &&
                pfnIsWow64Process(hProcess, &isChildWow64) &&
                isParentWow64 != isChildWow64) {
                fprintf(stderr, "error: binaries mismatch: you need to use the "
#ifdef _WIN64
                        "32-bits"
#else
                        "64-bits"
#endif
                        " apitrace binaries to trace this application\n");
                TerminateProcess(hProcess, 1);
                return 1;
            }
        }
    }

    if (bAttachDwm && IsWindows8OrGreater()) {
        // Switch to Microsoft Basic Display Driver before injecting, so that
        // we don't trace with it.
        devconDisable(DEVCON_CLASS_DISPLAY);
        Sleep(1000);
    }

    const char *szDllName;
    szDllName = "injectee.dll";

    char szDllPath[MAX_PATH];
    GetModuleFileNameA(NULL, szDllPath, sizeof szDllPath);
    getDirName(szDllPath);
    strncat(szDllPath, szDllName, sizeof szDllPath - strlen(szDllPath) - 1);

#if 1
    if (!injectDll(hProcess, szDllPath)) {
        TerminateProcess(hProcess, 1);
        return 1;
    }
#endif

    DWORD exitCode;

    if (bAttach) {
        if (bAttachDwm) {
            restartDwmComposition(hProcess);
        }

        exitCode = 0;
    } else {
        // Start main process thread
        ResumeThread(processInfo.hThread);

        // Wait for it to finish
        WaitForSingleObject(hProcess, INFINITE);

        if (pSharedMem && !pSharedMem->bReplaced) {
            fprintf(stderr, "warning: %s was never used: application probably does not use this API\n", szDll);
        }

        exitCode = ~0;
        GetExitCodeProcess(hProcess, &exitCode);

        CloseHandle(processInfo.hThread);
    }

    CloseHandle(hProcess);

    if (hSemaphore) {
        ReleaseSemaphore(hSemaphore, 1, NULL);
        CloseHandle(hSemaphore);
    }

    return (int)exitCode;
}
示例#3
0
LLDir_Linux::LLDir_Linux()
{
    mDirDelimiter = "/";
    mCurrentDirIndex = -1;
    mCurrentDirCount = -1;
    mDirp = NULL;

    char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */
    if (getcwd(tmp_str, LL_MAX_PATH) == NULL)
    {
        strcpy(tmp_str, "/tmp");
        llwarns << "Could not get current directory; changing to "
                << tmp_str << llendl;
        if (chdir(tmp_str) == -1)
        {
            llerrs << "Could not change directory to " << tmp_str << llendl;
        }
    }

    mExecutableFilename = "";
    mExecutablePathAndName = "";
    mExecutableDir = tmp_str;
    mWorkingDir = tmp_str;
    mAppRODataDir = tmp_str;
    mOSUserDir = getCurrentUserHome(tmp_str);
    mOSUserAppDir = "";
    mLindenUserDir = tmp_str;

    char path [32];	/* Flawfinder: ignore */

    // *NOTE: /proc/%d/exe doesn't work on FreeBSD. But that's ok,
    // because this is the linux implementation.

    snprintf (path, sizeof(path), "/proc/%d/exe", (int) getpid ());
    int rc = readlink (path, tmp_str, sizeof (tmp_str)-1);	/* Flawfinder: ignore */
    if ( (rc != -1) && (rc <= ((int) sizeof (tmp_str)-1)) )
    {
        tmp_str[rc] = '\0'; //readlink() doesn't 0-terminate the buffer
        mExecutablePathAndName = tmp_str;
        char *path_end;
        if ((path_end = strrchr(tmp_str,'/')))
        {
            *path_end = '\0';
            mExecutableDir = tmp_str;
            mWorkingDir = tmp_str;
            mExecutableFilename = path_end+1;
        }
        else
        {
            mExecutableFilename = tmp_str;
        }
    }

    mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin";

#ifdef APP_RO_DATA_DIR
    const char* appRODataDir = APP_RO_DATA_DIR;
    if(appRODataDir[0] == '/')
    {
        // We have a full path to the data directory.
        mAppRODataDir = appRODataDir;
    }
    else if(appRODataDir[0] != '\0')
    {
        // We have a relative path to the data directory.  Search
        // for it in each potential install prefix containing the
        // executable.
        for(std::string prefix = getDirName(mExecutableDir);
                !prefix.empty(); prefix = getDirName(prefix))
        {
            std::string dir = prefix + "/" + appRODataDir;
            if(fileExists(dir + "/app_settings"))
            {
                mAppRODataDir = dir;
                break;
            }
        }
    }
#endif

    // *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something.
    mTempDir = "/tmp";
}