Saber q api's usa el task manager

Iniciado por ~~, 20 Noviembre 2007, 16:42 PM

0 Miembros y 2 Visitantes están viendo este tema.

~~

Hola

No se muy bien si esto va aki, pero supongo q si ;)

Alguien podria indicarme q apis utiliza el administrador de tareas de windows (o decirme como puedo saberlo) para llenar la lista de procesos??

Saludos  ;)

Shaddy

Cita de: E0N en 20 Noviembre 2007, 16:42 PM
Hola

No se muy bien si esto va aki, pero supongo q si ;)

Alguien podria indicarme q apis utiliza el administrador de tareas de windows (o decirme como puedo saberlo) para llenar la lista de procesos??

Saludos  ;)

No esta mal la pregunta :).

Bueno el encargado de ejecutar el administrador de tareas es el "taskmgr.exe", y si quieres saber que APIs utilizas, jeje, mi consejo es o bien lo miras en OllyDBG, o bien si te resulta muy complicado utilizas el API Spy.

Ya nos contarás tus avances ;).

Salu2..
"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com

~~

Ok, pues me bajaré el Api Spy a ver si lo consigo sacar, por q con el Olly no lo e logrado (tambien es por q soy muuuuuuuuuuuuuuy newi en la ing inversa, para q negarlo  :xD)

Gracias por la info
Saludos

Karman

para no perder tiempo debuggeando el TASKMAN acabo de ir a la fuente (si, el código fuente del programa que lo bajé junto con todo el código fuente de Win2K), y lo que hace es trabajar con métodos COM bastantes complicados... que al parecer llegan hasta el kernel... pero era muy largo como para seguir todo el recorrido... te recomiendo te bajes el source del win2k si podes y te fijes ahí directamente...

S2

Eternal Idol

Lo que yo hago normalmente es empezar por lo mas simple.

Ver las DLLs y funciones importadas: Dependency Walker.

Si con eso somos capaces de identificar las probables despues solo nos queda abrir el WinDbg ...

En este caso mi apuesta es por una simple funcion: NtQuerySystemInformation, paso a cambiar su codigo por:

ntdll!ZwQuerySystemInformation:
7c90e1aa b8220000c0      mov     eax,0C0000022h
7c90e1af c21000          ret     10h

Y veo que no se actualiza mas la barra de procesos  ;D
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

~~

Gracias a todos ;)

Probaré a hookear el api q comentas Eternal Idol a ver si consigo resultados, si no tendre q hacer lo q dice Karman....

Saludos

Eternal Idol

Cita de: E0N en 21 Noviembre 2007, 13:31 PM
Gracias a todos ;)

Probaré a hookear el api q comentas Eternal Idol a ver si consigo resultados, si no tendre q hacer lo q dice Karman....

Saludos

Probalo, el Task Manager (como la mayoria de programas - aunque no directamente -) usa esa funcion para enumerar los procesos.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Karman

tenía razón Eternal Idol, esa es la función y acá tenés la referencia de como se usa:


/*++ CProcPage::GetProcessInfo
Class Description:
    Reads the process info table into a virtual alloc'd buffer, resizing the buffer if needed
Arguments:
Return Value:
Revision History:
      Nov-16-95 Davepl  Created
--*/

static const int PROCBUF_GROWSIZE = 4096;

HRESULT CProcPage::GetProcessInfo(){
    HRESULT  hr = S_OK;
    NTSTATUS status;
    while(hr == S_OK){
        if (m_pvBuffer){
            status = NtQuerySystemInformation(SystemProcessInformation,
                                              m_pvBuffer,
                                              m_cbBuffer,
                                              NULL);
            // If we succeeded, great, get outta here.  If not, any error other
            // than "buffer too small" is fatal, in which case we bail
            if (NT_SUCCESS(status)) break;
            if (status != STATUS_INFO_LENGTH_MISMATCH){
                hr = E_FAIL;
                break;
            }
        }
        // Buffer wasn't large enough to hold the process info table, so resize it
        // to be larger, then retry.
        if (m_pvBuffer){
            VirtualFree(m_pvBuffer, 0, MEM_RELEASE);
            m_pvBuffer = NULL;
        }
        m_cbBuffer += PROCBUF_GROWSIZE;
        m_pvBuffer = VirtualAlloc (NULL,m_cbBuffer,MEM_COMMIT,PAGE_READWRITE);
        if (m_pvBuffer == NULL){
            hr = E_OUTOFMEMORY;
            break;
        }
    }
    return hr;
}


Y para obtener los nombres de los usuarios:


// Reviewed by alhen 9 - 3 - 98
HRESULT CProcInfo::SetProcessUsername(const FILETIME *pCreateTime){
    DWORD dwError = NO_ERROR;
    // SetProcessUsername should get called only for terminal servers.
    if( !IsTerminalServer() ){
        return E_FAIL;
    }
    // in case we could not get the proc address from winsta.dll
    // set the user name to error or something.
    __try
    {
        // in case of wow tasks assign username same as its parent process's
        if( IsWowTask( ) ){
            if( m_pWowParentProcInfo->m_pszUserName != NULL ){
                m_pszUserName = ( LPTSTR )new TCHAR[ lstrlen(m_pWowParentProcInfo->m_pszUserName ) + 1 ];
                if( m_pszUserName != NULL ){
                    lstrcpy( m_pszUserName , m_pWowParentProcInfo->m_pszUserName );
                    return S_OK;
                }else{
                    return E_OUTOFMEMORY;
                }
            } else{
                return E_FAIL;
            }
        }

        if( m_UniqueProcessId == 0 )     // this is a system idle process.
        {
            const TCHAR *szIdleProcessOwner = TEXT( "SYSTEM" );
            m_pszUserName = ( LPTSTR )new TCHAR[ 7 ];
            if( m_pszUserName != NULL ){
                lstrcpy(m_pszUserName, szIdleProcessOwner);
            }
        } else {
            PSID pUserSid = NULL;
            DWORD dwSize = 0;
            if( !(*gpfnWinStationGetProcessSid)( NULL , GetRealPID( ) , *pCreateTime, ( PBYTE )pUserSid , &dwSize ) ){
                pUserSid = ( PSID ) new BYTE[ dwSize ];
                if( pUserSid != NULL ){
                    if( (*gpfnWinStationGetProcessSid)( NULL , GetRealPID( ) , *pCreateTime, ( PBYTE )pUserSid , &dwSize ) ){
                        if( IsValidSid( pUserSid ) ){
                            TCHAR szTmpName[MAX_PATH];
                            DWORD dwTmpNameSize = MAX_PATH;
                            (*gpfnCachedGetUserFromSid)( pUserSid , szTmpName , &dwTmpNameSize );
                            m_pszUserName = ( LPTSTR )new TCHAR[ sizeof( szTmpName ) + 1 ];
                            if( m_pszUserName != NULL ){
                                lstrcpy(m_pszUserName, szTmpName);
                            }
                        }
                    }
                    delete [] pUserSid;
                }else{
                    dwError = GetLastError();
                }
            } // this would mean that a sid of size zero was returned
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        // dprintf(TEXT("exception occured: %d",), GetExceptionCode());
        dwError = GetExceptionCode();
    }
    return HRESULT_FROM_WIN32(dwError);
}


S2

Eternal Idol

Cita de: Karman en 21 Noviembre 2007, 16:55 PM
tenía razón Eternal Idol, esa es la función y acá tenés la referencia de como se usa:

Me quedo con mi metodo, es mas generico (y mas legal ademas) ya que no solemos contar con el codigo de los programas que queremos analizar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

~~

Hola, peron por la tardanza...

Eternal Idol, a riesgo de meter la pata, NtQuerySystemInformation es una api para ser usada desde el kernel? por q yo en mi msdn no la veo, ademas por google vi esto:

CitarNtQuerySystemInformation is used to check some system informations avaiable only in KernelMode (above 0x80000000). All avaiable (or all known) information classes are described in SYSTEM_INFORMATION_CLASS.



De ser para kernel tendré q seguir buscando ya  q estoy hookeando en ring 3...

Saludos