Usuário com melhor resposta
Abrir programa apenas internamente

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.
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
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
- Editado André Renato Furtado domingo, 2 de agosto de 2015 07:13
-
-
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.
- Editado André Renato Furtado segunda-feira, 3 de agosto de 2015 02:21
- Sugerido como Resposta Marcos SJ segunda-feira, 3 de agosto de 2015 13:01
-
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
-
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
-
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.
-
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.