Preciso ajustar privilégios de token para chamar com sucesso o CreateRemoteThread?
Eu estou desenvolvendo um recurso de depuração para o meu aplicativo para me ajudar a diagnosticar deadlocks. O aplicativo é executado nas máquinas do meu cliente e, portanto, espero uma ampla gama de sistemas operacionais, políticas de segurança, etc.
A técnica que estou usando é implementar uma função no aplicativo de destino que gera rastreamentos de pilha para todos os encadeamentos, junto com outras informações de diagnóstico. Isso é então gravado em um arquivo mapeado na memória. Eu também estou criando um aplicativo utilitário que é usado para acionar a criação do relatório de diagnóstico e, em seguida, lê-lo do arquivo de memória mapeada.
Como o aplicativo de destino deve estar inativo, o programa utilitário não pode enviar uma mensagem para acionar a coleta de diagnósticos. Em vez disso eu estou usandoCreateRemoteThread
para que eu possa ter certeza de obter um thread ao vivo para fazer o trabalho.
Observe que isso é diferente dos métodos de injeção de DLL que normalmente usamLoadLibrary
como o segmento proc paraCreateRemoteThread
. Meu thread proc é um ponto de entrada no aplicativo de destino. Então, eu não preciso ligarWriteProcessMemory
.
Eu implementei isso e nos meus ambientes de teste funciona bem. De acordo com a documentação doCreateRemoteThread
, Preciso de um identificador de processo com os seguintes direitos de acesso:
PROCESS_CREATE_THREAD
, PROCESS_QUERY_INFORMATION
, PROCESS_VM_OPERATION
, PROCESS_VM_WRITE
ePROCESS_VM_READ
Então, passei essas bandeiras ao chamarOpenProcess
.
Agora, finalmente, para minha pergunta: que privilégios eu preciso que meu símbolo tenha para que a chamadaOpenProcess
ter sucesso?
No meu ambiente de teste (Windows 7, habilitado para UAC, usuário admin), não encontrei problemas com apenas um token padrão. Eu vi vários códigos de exemplo que adquirem oSE_DEBUG_NAME
privilégio antes de chamarOpenProcess
. Meu palpite é que é necessário paraWriteProcessMemory
ao fazer a injeção de DLL e não preciso desse privilégio. Existem cenários em que eu precisaria ajustar os privilégios do meu token?
Eu não sei exatamente nada sobre a segurança do Windows, então eu realmente aprecio as palavras sábias de qualquer um que faça isso!