none
Abrir programa apenas internamente RRS feed

  • Pergunta

  • Ola.

    Gostaria de abrir um dos meus programas internamente através de outro, ou seja, crio dois projetos normais, adiciono um botão no programa 1 que abre o programa 2. So que gostaria que o programa 2 não pude-se ser aberto externamento (abrir/executar).

    Poderia usar Shell ou Process.Start para abrir, mas e como bloquear o acesso externo? 

    Desde já agradeço.

    sexta-feira, 31 de julho de 2015 20:19

Respostas

  • Ora bem, por não usa a linha de comando?

    Assim quando quiser executar esse aplicativo terá de indicar uma espécie de comando ou password num parâmetro na linha de comando, ou ele simplesmente fecha. E até pode gravar esse comando externamente e gerir pelo aplicativo principal...

    • Marcado como Resposta Eliseu5 terça-feira, 4 de agosto de 2015 21:40
    segunda-feira, 3 de agosto de 2015 18:25

Todas as Respostas

  • Uma maneira eficaz de "escravizar" um programa(executável) seria distribuir uma versão dele com a extensão alterada e corrompido. Assim, tua aplicação possui o controle total na execução.

    Exemplo: altere a extensão dele para .dat e escreva as letras ZM nos dois primeiros bytes dele, isto faz com que mesmo o usuário alterando a extensão não consiga rodar o programa.

    Quando tua aplicação chamar(ela é credenciada), você copia o dat corrompido para uma pasta temporária, corrige a extensão e escreve as letras MZ nos dois primeiros bytes do programa, assim ele roda normal(depois exclui).

    Se você conhecer a estrutura do executável(PE), é possível fazer muitas técnicas interessantes para este tipo de demanda.

    Para conhecimento: se você chama uma aplicação pela linha de comando(cmd), não importa com qual extensão ela esteja, roda normalmente, desde que não esteja corrompida.

    Interessante é utilizar thread para rodar o outro aplicativo.

    http://stackoverflow.com/questions/14912320/run-external-exe-under-thread



    domingo, 2 de agosto de 2015 07:11
  • Ola, agradeço pela ajuda.

    Eu poderia fazer sim, mas pode ser facilmente corrigido com um editor hexadecimal, alem disso pode ser copiado quando esta em execução, não resolvendo meu problema :(

    domingo, 2 de agosto de 2015 21:50
  • Ok, foi apenas uma ideia de dificuldade nível 1 para o trapaceiro.

    Você pode inverter os dados do executável(nível dificuldade 2) ou corromper o entry point(nível dificuldade 3), por exemplo e assim vai...

    Fazer a mesma técnica dos compressores de executável como o UPX que descomprime o executável quando carregado na memória(no caso você corrige os dados na memória e roda o módulo).

    Ele utiliza APIs como VirtualAlloc e VirtualProtect para este artifício.

    Para o trapaceiro efetuar um dump do processo em execução e extrair os dados do executável para replicar sua versão original também não é impossível.

    Talvez a ideia seja ultrapassada.

    Não sei se você consegue com o AppLocker:

    http://www.howtogeek.com/howto/6317/block-users-from-using-certain-applications-with-applocker/

    Você poderia ter um usuário credenciado para acesso à aplicação e o teu executável principal chamar ela com impersonation do usuário(credenciado).

    Espero que surjam soluções melhores.



    segunda-feira, 3 de agosto de 2015 02:18
  • Ora bem, por não usa a linha de comando?

    Assim quando quiser executar esse aplicativo terá de indicar uma espécie de comando ou password num parâmetro na linha de comando, ou ele simplesmente fecha. E até pode gravar esse comando externamente e gerir pelo aplicativo principal...

    • Marcado como Resposta Eliseu5 terça-feira, 4 de agosto de 2015 21:40
    segunda-feira, 3 de agosto de 2015 18:25
  • Ola Nando,  é exatamente isso que eu preciso. :)

    No programa 1 adiciono o codigo a baixo para chamar o 2:

    Dim p As Process = New Process
    p.StartInfo.FileName = "C:\Arquivo1.exe"
    p.StartInfo.Arguments = " /extract_all" 'Exemplo
    p.StartInfo.RedirectStandardOutput = False
    p.StartInfo.UseShellExecute = False
    p.StartInfo.CreateNoWindow = False
    p.Start()
    p.Close()
    p.Dispose()


    No programa 2 que sera chamado, adiciono no evento Load:

     Dim argumentos() As String = Environment.GetCommandLineArgs
    
            If Environment.GetCommandLineArgs.Length > 1 Then
                TextBox1.Lines = argumentos
                If TextBox1.Text.Contains("extract_all") Then
                    MsgBox(":)", MsgBoxStyle.Information) 'Mantem aberto
                Else
                    Close 'Fecha o programa
                End If
            Else
                Close() 'Fecha o programa
            End If

    So nao conseguir converter o "Environment.GetCommandLineArgs" para argumento. Ex.:

          If Environment.GetCommandLineArgs.Contains("extract_all") Then

    Dai tive que passar para um TextBox para poder verificar se contem o "extract_all".

    • Editado Eliseu5 segunda-feira, 3 de agosto de 2015 19:58
    segunda-feira, 3 de agosto de 2015 19:15
  • Ola Michael,

    Agradeço pela ajuda, mas tenho um programa que ta meio pesado, gostaria de separar os módulos, tipo calculadora, gerador de recibos, etc, cada qual separado mas que pudessem ser chamados por um painel (tipo TuneUpUtilities), não podendo ser usados separados.

    segunda-feira, 3 de agosto de 2015 19:23
  • Olá Eliseu5,

    Tudo bem?

    A dúvida inicial da thread já foi tirada?

    "Poderia usar Shell ou Process.Start para abrir, mas e como bloquear o acesso externo? "

    Se sim, por gentileza marque a reposta do usuário que te auxiliou a tirar a sua dúvida.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 4 de agosto de 2015 19:40