Segurança – Quebrando senhas de projetos VBA do Microsoft Office

Essa é uma informação um pouco perigosa, devo admitir. Ela compromete uma série de desenvolvedores de aplicativos baseados em VBA, principalmente no contexto de produto.

Mas como considero isso mais uma “falha” do que um “macete”, publicarei aqui a informação para registro e possíveis providências.

O lado bom

Os desenvolvedores VBA recorrem geralmente à proteção de seus projetos pelo mecanismo de proteção padrão oferecido pelo editor. Clicando com o botão direito sobre o projeto, selecione o opção VBAProject Properties (Propriedades do Projeto VBA):

Quebrando senha VBA

A seguinte janela será mostrada após a seleção da aba Protection (Proteção):

Quebrando senha VBA

Até aqui é o tradicional. Basta informar a senha nos dois campos e travar o projeto para visualização (lock project for viewing) que teremos nosso projeto VBA bloqueado para visualização e edição na próxima vez em que o arquivo for aberto.

O lado mau

Qualquer veterano na linguagem VBA sabe que existem uma série de programas que “quebram” as senhas destes projetos. Na verdade eles a sobrescrevem de alguma forma. O resultado é que os projetos, mesmo protegidos por senha ficam vulneráveis.

Geralmente estes softwares usam de artimanhas que vão desde a força bruta (tentativa e erro) ou eles entram mesmo no âmago do arquivo mexem no que não devem, substituindo assim a o dado devido.

Esses softwares são pagos na maioria das vezes, o que pelo menos caracteriza um pouco de profissionalismo por parte de seus fabricantes.

Concordo que em alguns casos existe o esquecimento por parte do autor, mas diria que este são a minoria. Geralmente alguém que tem conhecimento em VBA suficiente para construir um projeto que precisa ser protegido por senha, costuma ser organizado com este tipo de coisa. Temos uma outra situação onde empresas geralmente sofrem com funcionários de má fé que vão embora e largam arquivos bloqueados.

Estes são os únicos casos em que vejo necessidade da existência deste tipo de aplicativo, pois trata-se de cuidar da propriedade intectual do proprietário do código fonte.

Tirando isso, o resto pode ser caracterizado como violação de propriedade.

Bom, posto isso, vem aí a má notícia.

Quebrando o projeto VBA

É um pouco assustador, mas vamos lá.

Para ter acesso ao código de um projeto VBA, é fácil e barato. Basta baixar o Open Office neste endereço:

http://www.broffice.org/download

Para quem não sabe, o Open Office é uma suíte de aplicativos de escritório concorrente do Microsoft Office, assim como o Star Office. Não vou discutir as capacidades do Open Office, além da importante característica que ele possui de também ter disponível um suíte de programação muito semelhante ao VBA, também baseada no Visual Basic, capaz de construir aplicações da mesma forma.

Quando você abre um arquivo do Excel ou Word no aplicativos respectivos no Open Office (Calc e Writer), você tem acesso a todo o conteúdo do arquivo da mesma forma, bem como a todo o projeto VBA, incluindo módulos e formulários.

Muito bem, isso tudo é muito bom pois significa uma compatibilidade quase que universal entre arquivos e aplicativos. Com isso não seria necessário conversões na hora de trocar arquivos com outros sistemas.

O problema é que o Open Office abre o projeto em VBA, mesmo que ele esteja protegido por senha.

isso dá a qualquer um acesso completo a todo o código do projeto.

Não há como demonstrar isso aqui, mas para testar:

  • crie um novo arquivo no Excel ou Word
  • abra o VBA
  • adicione alguns módulos e formulários
  • adicione alguns controles a estes formulários e alguns códigos simples
  • depois disso, proteja o projeto com senha e bloqueie-o para visualização (como mostrado acima)
  • salve e feche o arquivo
  • abra-o novamente no Microsoft Office para certificar-se de que o projeto está mesmo bloqueado para visualização
  • após certificar-se, abra o Open Office Calc para abrir o arquivo de Excel ou o Open Office Calc para o abrir o arquivo do Word
  • através do menu ferramentas, abra a tela de macros e selecione um objeto do projeto VBA e clique em editar para visualizar o código

Seguindo estes passos fica provado o fato do acesso extremamente facilitado ao projeto VBA através de um software livre e gratuito.

Conclusões e comentários

Contra a tecnologia não há nada que se possa fazer. Pelo menos com aquilo que veio da tecnologia.

Não dá para saber de quem é a culpa, se é que há algum culpado nesta história.

Da Microsoft por não promover um esquema de segurança mais eficaz?

Da fundação Open Office por não respeitar o esquema de segurança promovido pelo Microsoft Office?

Eu tenho minha opinião. Fica aqui o protesto pelo fato e o agradecimento a blogosfera por permitir descobrir e divulgar a informação.

Abraços

Tomás

Comentários

comentários

35 thoughts on “Segurança – Quebrando senhas de projetos VBA do Microsoft Office”

  1. Olá!
    Achei muito interessante seus comentários, gotaria de saber existe algum software que descobra a senha do projeto visual basic do Access. Você pode me ajudar?

    Grato,
    Augusto.

  2. Mateus,

    Sou iniciante no VBA, e gostaria de saber, já que a modos de se quebrar essa senha.. qual a melhor maneira de proteger um programa desenvolvido em VBA??

    Obrigado

  3. Artur,

    Hoje em dia eu utilizo a proteção tradicional. Os leigos não se atreverão a mexer nisso e os experts não comprometerão um aplicativo desses em produção O farão por pura curiosidade. Agora, se o código contém informações sigilosas ou uma regra muito particular, eu não faria em VBA. Mesmo que utilizasse Excel, eu faria um aplicativo em código compilado, usando C++, Visual Basic ou .NET. Todos estes integram facilmente com os aplicativos no Office.

    No seu caso, analise o quanto é necessário proteger este projeto. Em muitos casos, vi pessoas criarem “monstros” onde eles não existiam, compremetendo o andamento de um projeto com um cuidade desnecessário.

    Abraços
    Tomás

  4. Tomas,

    Proteçao tradicional que vc diz é só a senha?? ou tem alguma outra coisa?? estava pesquisando e descobri que existe um ofuscador de codigos.. mas nao achei nenhum pra VBA, vc conhece algum free??

    No meu caso tem uma regra particular ( uma rotina de calculos), mas eu uso na área academica e quero proteger a idéia…. mas quero distribuir o software… e nao tenho familiariadade com outras linguagens

    Obrigado pela ajuda

    Abraço

    Artur

  5. Artur,

    Sim, é só a senha. Quanto a ofuscar o código, isso não é possível no VBA pois ele não é compilado. Precisa ser em alguma linguagem nativa que já citei anteriormente. Quanto a sua regra, pense bem o quanto ela deve ser protegida. Como comentei, às vezes não vale a pena criar um transtorno sobre algo que não deveria sê-lo. Já escrevi isso uma vez. Tente pensar da seguinte forma:

    Se você escrever em um documento a palavra “CONFIDENCIAL”, ele não chamará mais a atenção do que se ele não tivesse essa tarja?

    Abraços
    Tomás

  6. Bom dia Tomás,

    Sou programador em VBA para Excel e tenho uma empresa de consultoria, desenvolvo planilhas de custo e diversos controles financeiros, e hoje de manhã descobri através de um funcionário de um cliente meu que você publicou esse artigo e já existe várias cópias dos meus projetos abertos utilizando essa sua dica. Muito obrigado pela força que você me deu. Sobrevivo disso, tenho familia pra criar, passei anos estudando custo, excel, vba pra você agora esinar como quebrar a senha de um projeto em vba.

  7. Alexandre,

    Por favor, leia e releia o artigo. Veja minha opinião sobre o assunto. Depois, julgue a quem deve culpar, se é que existe algum culpado nessa história. Além disso, existem outras mil formas de quebrar senhas de projetos VBA. Acreditar que seus aplicativos estavam seguros e o deixaram de ser depois da publicação deste artigo seria ingenuidade profissional.

    Um conselho: Como também consultor independente em VBA e outras tecnologias, preferi criar outros meios de comercialização de meus aplicativos ao invés de colocar a culpa em alguém.

    Abraços e sucesso
    Tomás

  8. Sem dúvidas o artigo é muito interessante e importante, porque precisamos conhecer essas vulnerabilidades a fim de nos precavermos da melhor forma possível.
    É óbvio que achar que o mundo desabou depois deste post é uma grande bobagem, até onde eu sei, não foi o dono do blog que desenvolveu nem o MS Excel nem o Open Office. Se for pra culpar alguém, pode começar a correr atrás da MS ou da BROffice…

  9. Alexandre, você pode começar a estudar outras formas de ganhar dinheiro com seus custos em planilhas excel, é uma mera ferramenta que usamos no dia dia em casa e de pequenos escritórios.
    Seja mais profissional, estude mais um pouquinho que você faz um sistema só seu e ninguém vai mais te atormentar,
    com notícias de vunerabilidades, todo mundo sabe que office é coisa de primário, seja profissional faça algo compilado. existe várias plataformas e linguagens para desenvolver esses tipos de projetos da tua area velho!!!!
    e mais outra, Tu vai fazer entrevista de um novo emprego e tu diz que é programador de Excel, vão rir na sua cara

    Corra que ainda há tempo!

  10. Jhon,

    Agradeço a colaboração. Concordo com a parte do Alexandre profissionalizar o serviço. Mas quanto a achar que o Excel é pouco profissional, desculpe, vou ter que discordar.

    A quantidade de consultorias que existem especializadas em Excel com VBA é bastante relevante. Veja pelos anúncios do site, por exemplo. Acompanho também com frequência vagas de emprego e a procura por analistas VBA ainda é grande, principalmente (pasmem) em bancos.

    Concordo que é mais seguro desenvolver sistemas compilados, mas o mesmo pode ser feito utilizando o Office.

    Da mesma forma que fez com o colega, recomendo que corra atrás disso.

    Outra coisa. Se não tem coragem de se identificar, por favor, fique calado.

    Abraços

  11. Olá Prof. Tomás,
    eu assim como muito trabalho a anos com Excel e iniciei minhas planilhas utilizando VBA.
    Já sabia de códigos que tiravam a senhas das planilhas e do próprio BROffice pra acesso às planilhas e códigos. O que me desanimou muito.
    Assim peço algumas dicas de criar um DLL (se for esse o caso) para acesso pelo Excel, como complemento e conseqüente “proteção” do código.
    Agradeço desde já qualquer retorno.
    Atenciosamente,
    Rogério dos Santos Ferreira

  12. Olá Tomas!

    Fiz o procedimento conforme indica esse artigo, porém ele não abriu o VBA via BrOffice. Tem alguma dica além do apresentado?

    Abraço
    Thiago

  13. Thiago,

    Não sei quanto às versões mais novas. Tente nas que estavam vigentes na publicação deste artigo. Mas por favor, leia todas as recomendações acima sobre violação de direitos autorais, se for este o caso.

    Abraços
    Tomás

  14. Tomás e demais leitores deste blog.

    Também faço algumas planilhas em excel utilizando VBA e a proteção destas planilhas me tem dado dor de cabeça. Também já conhecia como muitos alguns programas que tiram as senhas de diversos tipos de arquivos, os mais variados, mas desconhecia que o broffice fizesse isso, apesar de os ter usado por um tempo, com intuito de teste. Então agradeço o esclarecimento.
    Quero também discordar de nosso amigo que acha que fazer alguns tipos de trabalho no excel não é profissional. Quero relatar um fato que aconteceu comigo, será rápido e ilustrará bem.
    Um cliente procurava um programador para criar um soft para ele executar determinada atividade, pois não existe nada parecido no mercado. Após consultar um monte de gente, que cobravam caro e pediam muito tempo para entregar o programa pronto ele decidiu fechar com o cara que prometeu entregar mais rápido, já que ele tinha uma certa pressa, quero salientar que não era o mais barato. Após vencido o prazo dado o cara entregou uma versão para teste cheia de erros e incoerências. Um colega meu conversando com ele passou meu telefone e ele entrou em contato comigo. Meu conhecimento em programação é muito pouco, então indiquei um colega programador que me tira algumas dúvidas de vez em quando, mas deixei claro que se ele quisesse algo no excel que lhe atendesse eu faria em menos de 30 dias.
    Após falar com esse meu colega programador os dois me ligaram. O colegar pra dizer que o que o cara queria fazer era impossível de fazer tão rápido e não seria nada barato, o cliente pra me perguntar por quanto eu o faria. Fechei o preço com ele e entreguei o “programinha” em 20 dias para ele fazer os primeiros testes. Após algumas correções rápidas sugeridas por ele estava pronto, e a contento. Ele o utiliza até hoje e já me indicou vários outros clientes.

    Voltando ao assunto principal seria muito mais interessante para todos se ao invés de você só mostrar as falhas desse umas dicas para como melhor se proteger. Fica aqui a dica e garanto que será um post bem mais visitado e comentado.

    Até outra oportunidade!!!

  15. Ozires,

    Muitíssimo obrigado pelo seu relato. Ele com certeza é um alívio e prova de que as aplicações VBA podem e devem ser levadas a sério. Quanto a segurança, coloco sempre dicas, comentários, posts e tópicos no fórum sobre o assunto. Confira por exemplo estes dois:

    https://www.tomasvasquez.com.br/blog/microsoft-office/vba-verificando-se-o-projeto-vbaproject-esta-protegido
    https://www.tomasvasquez.com.br/blog/microsoft-office/vba-excluindo-um-modulo-vba-programaticamente

    São artigos que impactam diretamente em técnicas de segurança para proteger seus projetos. Com o tempo, outros serão produzidos. Se quiser colaborar, será um honra tê-lo como autor de artigos.

    Parabéns pelo blog!
    Abraços
    Tomás

  16. Grande White,

    Sempre tem um jeito, não? Apesar da maioria achar que são artimanhas para desbloquear aplicativos, para mim são mais alertas para os desenvolvedores estarem atentos a essa realidade.

    Valeu a colaboração
    Abraços
    Tomás

  17. Algúem poderia descobrir porque esta rotina VBA não funciona Ela é para instalar a PLANILHA somente em computadores identificados pelo nome …ela identifica o nome : Cole esta rotina em um um módulo VBA e teste pela macro Sub ProgramRights
    Option Explicit

    Private Declare Function GetUserName Lib “advapi32.dll” _
    Alias “GetUserNameA” (ByVal lpBuffer As String, nSize As Long) As Long
    Private Declare Function GetComputerName Lib “kernel32” Alias _
    “GetComputerNameA” (ByVal lpBuffer As String, ByRef nSize As Long) As Long
    Private Declare Function lOpen Lib “kernel32” Alias “_lopen” _
    (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
    Private Declare Function lClose Lib “kernel32” _
    Alias “_lclose” (ByVal hFile As Long) As Long
    Private Declare Function DisplaySize Lib “user32” Alias _
    “GetSystemMetrics” (ByVal nIndex As Long) As Long
    Private Declare Function FindWindow Lib “user32” Alias “FindWindowA” _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetSystemMenu Lib “user32” _
    (ByVal hwnd As Long, ByVal bRevert As Long) As Long

    Private Const SC_CLOSE As Long = &HF060
    Private Const OF_SHARE_EXCLUSIVE = &H10
    Private Const SM_CXSCREEN = 0
    Private Const SM_CYSCREEN = 1

    Sub ComputerCheck()
    Dim CompName As String

    CompName = ComputerName
    ‘ If CompName “W7-NOT” Then
    ‘ MsgBox “This application does not have the right to run on this computer.”
    ‘ ActiveWorkbook.Close SaveChanges:=False
    ‘ End If
    MsgBox Prompt:=CompName, Buttons:=vbOKOnly, Title:=”Computador Nome”
    End Sub
    Private Function UserName() As String
    Dim sName As String * 256
    Dim cChars As Long

    cChars = 256
    If GetUserName(sName, cChars) Then
    UserName = Left$(sName, cChars – 1)
    End If
    End Function

    Sub ProgramRights()
    Dim NameofUser As String

    NameofUser = UserName
    Select Case NameofUser
    Case Is = “W7-NOT”
    MsgBox “Planilha LIberada pra este Computador”
    Case Else
    MsgBox “Planilha NÃO Liberada para este Computador”
    End Select
    ThisWorkbook.Close SaveChanges:=False
    End Sub

    Private Function ComputerName() As String
    Dim stBuff As String * 255, lAPIResult As Long
    Dim lBuffLen As Long

    lBuffLen = 255
    lAPIResult = GetComputerName(stBuff, lBuffLen)
    If lBuffLen > 0 Then ComputerName = Left(stBuff, lBuffLen)
    End Function

    Se alguém descrobrir como fazê-la funcionar e publicar ai no blog, ficarei grato

  18. rbortone

    Por destino ou conhecidência, o seu codigo era o que eu estava procurando… e como eu uso o Excel x64 tive q adpatar o código mas, o que aconteceu aqui foi o seguinte, todas as “(aspas) e ‘(apostrofes) tiveram q ser substituidos, pois estavam em um padrão diferente do VBA e a string “ThisWorkbook.Close SaveChanges:=False” da SUB programRights deve vir abaixo do evento “Case Else” assim:

    Sub ProgramRights()
    Dim NameofUser As String
    NameofUser = UserName
    Select Case NameofUser
    Case Is = “Bruno”
    MsgBox “Planilha LIberada pra este Computador”
    Case Else
    MsgBox “Planilha NÃO Liberada para este Computador”
    ThisWorkbook.Close SaveChanges:=False
    End Select

    End Sub

    Caso contrário o arquivo fecha do mesmo jeito.

    e para liberar basta colocar o nome do usuario (não do computador) na string Case Is = “NOME DO USUARIO”.

    Mas ainda sim é muito falho, cada usuario tem uma identifição unica, uma chave no registro do tipo {A658-H545……} mas como só tenho um mes em VBA ainda não sei como acessar tal chave e compará-la.

    Se alguem quiser dar um Help o Local da Chave é:

    HKEY_CURRENT_USER\Identities\
    Chave: Default UserID

    Tomás, irei postar no forum mas como tá tarde, ou cedo, posto quando acordar!

    O Codigo completo com algumas melhorias tanto x86 como x64:

    Option Explicit

    Private Declare PtrSafe Function GetUserName Lib “advapi32.dll” _
    Alias “GetUserNameA” (ByVal lpBuffer As String, nSize As Long) As Long

    Private Declare PtrSafe Function GetComputerName Lib “kernel32” Alias _
    “GetComputerNameA” (ByVal lpBuffer As String, ByRef nSize As Long) As Long

    Private Declare PtrSafe Function lOpen Lib “kernel32” Alias “_lopen” _
    (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

    Private Declare PtrSafe Function lClose Lib “kernel32” _
    Alias “_lclose” (ByVal hFile As Long) As Long

    Private Declare PtrSafe Function DisplaySize Lib “user32” Alias _
    “GetSystemMetrics” (ByVal nIndex As Long) As Long

    Private Declare PtrSafe Function FindWindow Lib “user32” Alias “FindWindowA” _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Declare PtrSafe Function GetSystemMenu Lib “user32” _
    (ByVal hwnd As Long, ByVal bRevert As Long) As Long

    Private Const SC_CLOSE As Long = &HF060
    Private Const OF_SHARE_EXCLUSIVE = &H10
    Private Const SM_CXSCREEN = 0
    Private Const SM_CYSCREEN = 1
    Sub ComputerCheck()
    Dim CompName As String
    Dim UsrName As String
    Dim Usuario As String

    Usuario = Usuario:
    CompName = ComputerName
    UsrName = UserName
    ‘ If CompName “W7-NOT” Then
    ‘ MsgBox “This application does not have the right to run on this computer.”
    ‘ ActiveWorkbook.Close SaveChanges:=False
    ‘ End If
    MsgBox Prompt:=CompName & vbCrLf & UsrName, Buttons:=vbOKOnly, Title:=”Nome do Computador”
    End Sub
    Private Function UserName() As String
    Dim sName As String * 256
    Dim cChars As Long
    cChars = 256
    If GetUserName(sName, cChars) Then
    UserName = Left$(sName, cChars – 1)
    End If
    End Function
    Sub ProgramRights()
    Dim NameofUser As String
    NameofUser = UserName
    Select Case NameofUser
    Case Is = “Bruno”
    MsgBox “Planilha LIberada pra este Computador”
    Case Else
    MsgBox “Planilha NÃO Liberada para este Computador”
    ThisWorkbook.Close SaveChanges:=False
    End Select

    End Sub
    Private Function ComputerName() As String
    Dim stBuff As String * 255, lAPIResult As Long
    Dim lBuffLen As Long
    lBuffLen = 255
    lAPIResult = GetComputerName(stBuff, lBuffLen)
    If lBuffLen > 0 Then ComputerName = Left(stBuff, lBuffLen)
    End Function

  19. A senha do projeto VBA podem ser removidas com um editor hexadecimal. Feche o livro e abra o arquivo pasta de trabalho no editor hexadecimal. Encontrar a string “DPB” e mude para “DPX”. Salve o arquivo. Abra o livro e clique em OK até que a pasta de trabalho está aberto (uma ou mais caixas de diálogo são exibidas descrevendo vários problemas com o projeto VBA). Pressione ALT + F11, escolha o menu Ferramentas-> comando Propriedades VBAProject, navegue até a guia Proteção, e alterar a senha, mas não removê-lo (note a nova senha). Salve, feche e abra novamente a pasta de trabalho. Pressione ALT + F11 e digite a nova senha. Escolha Ferramentas-> Propriedades VBAProject, navegue até a guia Proteção e remover a senha. Guarde o livro.

Comments are closed.