wslyz640 发表于 2012-11-23 00:19:41

求指导 调用函数功能没实现

本帖最后由 wslyz640 于 2012-11-23 00:21 编辑


麻烦大家帮我看下这代码这是原版源码


我用的是VC2010    使用的Unicode字符集   最后我把字符都转过来了但是在调用MySystem函数的时候 一直没有实现功能麻烦打击帮帮忙

马大哈 发表于 2012-11-23 12:52:53

// ss.cpp: 主项目文件。
#include <windows.h>
#include <tlhelp32.h>
#include <aclapi.h>
#include <Psapi.h>
#pragma comment(lib,"Psapi.lib")


int ProcessExit(LPCTSTR szProcName,int x)
{
        PROCESSENTRY32        pe;
        DWORD        dwRet;
        BOOL        bFound = FALSE;
        HANDLE hProcess;
        char fileName = {0};
        HANDLE hSP = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSP)
        {
                pe.dwSize = sizeof(pe);

                for (dwRet = Process32First(hSP, &pe);
                        dwRet;
                        dwRet = Process32Next(hSP, &pe))
                {
                        if(x){
                                if (lstrcmpi( szProcName, pe.szExeFile) == 0)
                                {
                                        bFound = TRUE;
                                        break;
                                }
                        }
                        else
                        {
                                hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pe.th32ProcessID);
                                if(hProcess)
                                {
                                        Sleep(1);
                                        GetModuleFileNameEx(hProcess,NULL, (LPSTR)fileName,sizeof(fileName));
                                        Sleep(1);
                                        if (lstrcmpi( szProcName, fileName) == 0)
                                        {
                                                bFound = TRUE;
                                                break;
                                        }
                                }
                                CloseHandle(hProcess);
                        }
                }
                CloseHandle(hSP);       
        }
        return bFound;
}
BOOL EnableDebugPriv( LPCTSTR szPrivilege )
{

        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;

        if ( !OpenProcessToken( GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
                &hToken ) )
        {
                return FALSE;
        }
        if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
        {
                CloseHandle( hToken );
                return FALSE;
        }

        tkp.PrivilegeCount = 1;
        tkp.Privileges.Luid = sedebugnameValue;
        tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;

        if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
        {
                CloseHandle( hToken );
                return FALSE;
        }

        return TRUE;
}


DWORD GetProcessId( LPCTSTR szProcName )
{
        PROCESSENTRY32 pe;
        DWORD dwPid;
        DWORD dwRet;
        BOOL bFound = FALSE;

        //
        // 通过 TOOHLP32 函数枚举进程
        //

        HANDLE hSP = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        if ( hSP )
        {
                pe.dwSize = sizeof( pe );

                for ( dwRet = Process32First( hSP, &pe );
                        dwRet;
                        dwRet = Process32Next( hSP, &pe ) )
                {
                        if ( lstrcmpi(szProcName, pe.szExeFile) == 0 )
                        {
                                dwPid = pe.th32ProcessID;
                                bFound = TRUE;
                                break;
                        }
                }

                CloseHandle( hSP );

                if ( bFound == TRUE )
                {
                        return dwPid;
                }
        }

        return NULL;
}


BOOL MySystem( LPTSTR szProcessName )
{
        HANDLE hProcess;
        HANDLE hToken, hNewToken;
        DWORD dwPid;

        PACL pOldDAcl = NULL;
        PACL pNewDAcl = NULL;
        BOOL bDAcl;
        BOOL bDefDAcl;
        DWORD dwRet;

        PACL pSacl = NULL;
        PSID pSidOwner = NULL;
        PSID pSidPrimary = NULL;
        DWORD dwAclSize = 0;
        DWORD dwSaclSize = 0;
        DWORD dwSidOwnLen = 0;
        DWORD dwSidPrimLen = 0;

        DWORD dwSDLen;
        EXPLICIT_ACCESS ea;
        PSECURITY_DESCRIPTOR pOrigSd = NULL;
        PSECURITY_DESCRIPTOR pNewSd = NULL;

        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        BOOL bError;

        if (!EnableDebugPriv("SeDebugPrivilege"))
        {
                bError = TRUE;
                goto Cleanup;
        }

        if ( ( dwPid = GetProcessId("WINLOGON.EXE") ) == NULL )
        {
                bError = TRUE;
                goto Cleanup;
        }

        hProcess = OpenProcess( MAXIMUM_ALLOWED, FALSE, dwPid );
        if ( hProcess == NULL )
        {
                bError = TRUE;
                goto Cleanup;
        }

        if ( !OpenProcessToken( hProcess, READ_CONTROL | WRITE_DAC, &hToken ) )
        {
                bError = TRUE;
                goto Cleanup;
        }

        ZeroMemory( &ea, sizeof( EXPLICIT_ACCESS ) );
        BuildExplicitAccessWithName( &ea,
                "Everyone",
                TOKEN_ALL_ACCESS,
                GRANT_ACCESS,
                0 );

        if ( !GetKernelObjectSecurity( hToken,
                DACL_SECURITY_INFORMATION,
                pOrigSd,
                0,
                &dwSDLen ) )
        {

                if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
                {
                        pOrigSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwSDLen );
                        if ( pOrigSd == NULL )
                        {
                                bError = TRUE;
                                goto Cleanup;
                        }

                        if ( !GetKernelObjectSecurity( hToken,
                                DACL_SECURITY_INFORMATION,
                                pOrigSd,
                                dwSDLen,
                                &dwSDLen ) )
                        {
                                bError = TRUE;
                                goto Cleanup;
                        }
                }
                else
                {
                        bError = TRUE;
                        goto Cleanup;
                }
        }

        if ( !GetSecurityDescriptorDacl( pOrigSd, &bDAcl, &pOldDAcl, &bDefDAcl ) )
        {
                bError = TRUE;
                goto Cleanup;
        }


        dwRet = SetEntriesInAcl( 1, &ea, pOldDAcl, &pNewDAcl );
        if ( dwRet != ERROR_SUCCESS )
        {
                pNewDAcl = NULL;

                bError = TRUE;
                goto Cleanup;
        }

        if ( !MakeAbsoluteSD( pOrigSd,
                pNewSd,
                &dwSDLen,
                pOldDAcl,
                &dwAclSize,
                pSacl,
                &dwSaclSize,
                pSidOwner,
                &dwSidOwnLen,
                pSidPrimary,
                &dwSidPrimLen ) )
        {

                if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
                {
                        pOldDAcl = ( PACL ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwAclSize );
                        pSacl = ( PACL ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwSaclSize );
                        pSidOwner = ( PSID ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwSidOwnLen );
                        pSidPrimary = ( PSID ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwSidPrimLen );
                        pNewSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
                                HEAP_ZERO_MEMORY,
                                dwSDLen );

                        if ( pOldDAcl == NULL ||
                                pSacl == NULL ||
                                pSidOwner == NULL ||
                                pSidPrimary == NULL ||
                                pNewSd == NULL )
                        {
                                bError = TRUE;
                                goto Cleanup;
                        }

                        if ( !MakeAbsoluteSD( pOrigSd,
                                pNewSd,
                                &dwSDLen,
                                pOldDAcl,
                                &dwAclSize,
                                pSacl,
                                &dwSaclSize,
                                pSidOwner,
                                &dwSidOwnLen,
                                pSidPrimary,
                                &dwSidPrimLen ) )
                        {
                                bError = TRUE;
                                goto Cleanup;
                        }
                }
                else
                {
                        bError = TRUE;
                        goto Cleanup;
                }
        }

        if ( !SetSecurityDescriptorDacl( pNewSd, bDAcl, pNewDAcl, bDefDAcl ) )
        {
                bError = TRUE;
                goto Cleanup;
        }

        if ( !SetKernelObjectSecurity( hToken, DACL_SECURITY_INFORMATION, pNewSd ) )
        {
                bError = TRUE;
                goto Cleanup;
        }

        if ( !OpenProcessToken( hProcess, TOKEN_ALL_ACCESS, &hToken ) )
        {
                bError = TRUE;
                goto Cleanup;
        }

        if ( !DuplicateTokenEx( hToken,
                TOKEN_ALL_ACCESS,
                NULL,
                SecurityImpersonation,
                TokenPrimary,
                &hNewToken ) )
        {
                bError = TRUE;
                goto Cleanup;
        }


        ZeroMemory( &si, sizeof( STARTUPINFO ) );
        si.cb = sizeof( STARTUPINFO );

        ImpersonateLoggedOnUser( hNewToken );

        if ( !CreateProcessAsUser( hNewToken,
                NULL,
                szProcessName,
                NULL,
                NULL,
                FALSE,
                NULL, //NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
                NULL,
                NULL,
                &si,
                &pi ) )
        {
                bError = TRUE;
                goto Cleanup;
        }

        bError = FALSE;

Cleanup:
        if ( pOrigSd )
        {
                HeapFree( GetProcessHeap(), 0, pOrigSd );
        }
        if ( pNewSd )
        {
                HeapFree( GetProcessHeap(), 0, pNewSd );
        }
        if ( pSidPrimary )
        {
                HeapFree( GetProcessHeap(), 0, pSidPrimary );
        }
        if ( pSidOwner )
        {
                HeapFree( GetProcessHeap(), 0, pSidOwner );
        }
        if ( pSacl )
        {
                HeapFree( GetProcessHeap(), 0, pSacl );
        }
        if ( pOldDAcl )
        {
                HeapFree( GetProcessHeap(), 0, pOldDAcl );
        }

        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
        CloseHandle( hToken );
        CloseHandle( hNewToken );
        CloseHandle( hProcess );

        if ( bError )
        {
                return FALSE;
        }

        return TRUE;
}
int main(int argc, char* argv[])
{
        MySystem("cmd.exe");
        return 0;
}
帮你把代码发上来.

论坛里玩VS2010的好象不多,帮顶顶

lxl1638 发表于 2013-2-9 18:51:19

粗略看了一下,这份源码在网上见过,但我没有调试,有一点可以肯定的,就是使用Unicode字符集绝对不能通过
页: [1]
查看完整版本: 求指导 调用函数功能没实现