Como definir o ponto de interrupção no início da execução do programa

Como posso parar o programa antes de carregar qualquer uma das DLLs vinculadas?

Eu tentei definir function LoadLibraryExW na opção de debugging Break At Function e ele pára nessa function, mas antes disso eu tenho o seguinte nas janelas de saída do Visual Studio:

 'test.exe': Carregado 'C: \ Windows \ System32 \ ntdll.dll', símbolos carregados (informações de origem removidas).
 'test.exe': Carregado 'C: \ Windows \ System32 \ kernel32.dll', símbolos carregados (informações de origem removidas).
 'test.exe': Carregado 'C: \ Windows \ System32 \ KernelBase.dll', símbolos carregados (informações de origem removidas).
 'test.exe': Carregado 'C: \ Windows \ System32 \ uxtheme.dll', símbolos carregados (informações de origem removidas).
 'test.exe': Carregado 'C: \ Windows \ System32 \ msvcrt.dll', símbolos carregados (informações de origem removidas).
 ---- mais cerca de 30 DLLs ---

Então, como posso parar o programa no depurador antes de carregar o ntdll.dll ? Ok, não antes de carregar, mas antes de executar qualquer uma das funções do DllMain e antes de inicializar qualquer object estático.

Você pode fazer isso adicionando uma chave do Registro a “Opções de Execução de Arquivo de Imagem” com o nome do seu exe. Adicione um valor do tipo string chamado “Debugger” e defina-o como vsjitdebugger.exe para iniciar o diálogo just-in-time do depurador. O que permite escolher um dos depuradores disponíveis, incluindo o Visual Studio. Esta checkbox de diálogo é acionada logo após o Windows ter carregado o EXE, antes que qualquer código comece a ser executado.

Aqui está um exemplo de arquivo .reg que aciona a checkbox de diálogo quando você inicia o notepad.exe. Modifique o nome da chave para o seu .exe:

 REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] "Debugger"="vsjitdebugger.exe" 

Em vez de começar com F5, basta iniciar a debugging com F11 ou F10.

Usando Gflags e WinDbg, você pode append automaticamente ao seu aplicativo de destino e definir um ponto de interrupção ANTES de qualquer DLL ser carregado.

Para fazer isso, você precisará do “Debugging Tools for Windows” instalado. Você pode obter isso gratuitamente da Microsoft. Inclui GFlags e WinDbg. Você pode encontrá-lo em: http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

Use GFlags para definir as opções de debugging automática no seu programa de destino. Essa é a maneira mais fácil de configurar seu sistema para iniciar um depurador que será iniciado automaticamente quando o aplicativo de destino for iniciado. Não há necessidade de brincar com o registro, ele fará todas as mudanças necessárias para você.

Use GFlags para definir o WinDbg para ser iniciado como o depurador. Altere os filtros de events para o WinDbg no evento “Criar processo” de “Ignorar” para “Ativado”. Por padrão, o WinDbg não interrompe a criação do processo do seu destino. Mas se você precisar ou quiser definir um ponto de interrupção no processo de criação, poderá alterar essa opção de evento. A maneira mais fácil de alterar essa opção é deixar o WinDbg iniciar em seu aplicativo, usar sua GUI para alterar a opção através do item de menu “DEBUG | Event Filters …” e sua checkbox de diálogo, salvar seu espaço de trabalho e parar a debugging. Em seguida, comece o que quer que leve ao seu aplicativo de destino e, a partir desse momento, para esse destino de debugging específico, o WinDbg quebrará em “Criar processo”.

Existem outras maneiras de definir essa opção automaticamente no WindDbg, mas elas não são tão fáceis quanto usar sua GUI. Você pode definir as opções da linha de comando para sua chamada para ativar o evento Criar Processo. Você pode ter WinDbg executar um arquivo de script que irá definir a opção para você. Você pode definir a variável de ambiente TOOLS do WinDbg para apontá-la para seu arquivo “Tools.ini” e habilitar o evento create process lá. E há mais alguns methods para definir a opção de evento para ativar um ponto de interrupção em Criar Processo.

O link acima inclui links para ajuda de Depuração com GFlags e WinDbg.

Para a maioria das necessidades de debugging, os desenvolvedores não precisam nem querem um ponto de interrupção na criação do processo (antes que todas as DLLs básicas e necessárias para execução sejam carregadas). Mas se o fizer, o WinDbg e vários outros depuradores gratuitos fornecidos pela Microsoft podem fazê-lo. Você só precisa alterar o padrão para esse evento de ignorado para ativado.

O ntdll.dll é carregado pelo kernel durante a criação do processo. Eu não sei sobre as outras dlls especificamente, mas elas provavelmente também são carregadas pelo kernel.

Até onde eu sei, o que você está tentando fazer não pode ser feito, a menos que você tenha que escrever um rootkit para sobrescrever parte do código de criação do processo. Mesmo assim, não tenho certeza se o processo que está sendo criado é realmente considerado um processo antes que essas bibliotecas sejam carregadas.

Eu não acho que você pode fazer isso com o depurador normal do modo de usuário no Visual Studio. A Microsoft fornece um kit de ferramentas gratuito de outras ferramentas de debugging, incluindo kd (depurador de kernel) e windbg, que podem interromper o carregamento, mas duvido que você possa inspecionar o processo antes de carregar o ntdll. Não é realmente um processo nesse ponto.

O que você está tentando realizar?

Não há como fazer isso porque as DLLs das quais seu executável de PE depende são carregadas pelo sistema (não pelo seu processo) antes que o processo seja criado. O processo inicia somente quando o executável está vinculado a todas as funções importadas de outras DLLs.

ADICIONAR: Mas é claro que as rotinas DllMain estão sendo executadas para cada DLL apenas quando o processo é iniciado e você pode depurá-las.