Tag Archives: Proteção

Word – Recuperando um documento bloqueado quando se perde a senha

Word protegido
Word protegido?

Sempre tomo cuidado com esse tipo de post, dada polêmica que estes geram. Mas o fato é que este não é o primeiro site que vai divulgar esta façanha e nem será o último. Portanto, vamos a ela.

A situação ocorreu recentemente comigo, vindo da digníssima, que protegeu um documento de Word para edição e, claro, depois de um tempo, esqueceu qual era a senha.

Resultado, pediu socorro e fui atrás de saber como é que resolveria o problema (depois de dar uma bela bronca, claro!). Pensei nas soluções ditas “sujas” que normalmente são utilizadas, mas antes disso insisti num método mais limpo, primeiro pela facilidade de aplicá-lo, segundo, para me sentir menos culpado.

😉

Por fim,uma dica no fórum de suporte da própria Microsoft (UAU!) explicava um macete para recuperar o conteúdo do documento, sem vioá-lo. Ou seja, você recupera o trabalho, mas não interfere no arquivo original. Melhor impossível! Como fazer isso?

Supondo que seu arquivo tenha o nome Protegido.docx e ele esteja com a estrutura bloqueada (é esse caso que estamos tratando), basta você abrir o Word num documento em branco, selecionar a opção Inserir->Objeto->Texto do Arquivo. Quando a caixa de diálogo de selecionar arquivo abrir, basta selecionar o local onde está seu arquivo Protegido.docx e clicar em Inserir.

Voilá! Seu documento está lá, com todo conteúdo. O máximo que vai acontecer é alguma perda de formatação, mas em vista do trabalho recuperado, é uma mão na roda!

Bom proveito!

Referência

http://social.technet.microsoft.com/Forums/office/en-US/a60b2669-87f4-4b97-b741-649c6debbe13/how-can-i-unlock-a-protected-document-if-i-forgot-my-password?forum=word

Excel – Desbloqueando Planilhas

Esse é um dos posts “indesejados” por aqueles que trabalham com Excel em seu dia a dia, mas que precisam estar na base de conhecimento de todos eles, pois uma das características de qualquer bom sistema, é saber de suas fragilidades.

O Excel possui nativamente um sistema de proteção de planilhas baseados em senha, mas que é um pouco frágil, do ponto de vista técnico/avançado. Tão frágil que existe um código em VBA que é quase uma convenção entre os programadores da linguagem para desbloquear planilhas de forma rápida. Abaixo segue o mesmo:

Sub DesprotegerEstaPlanilha()
 
    Dim i, i1, i2, i3, i4, i5, i6 As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer
    On Error Resume Next
    For i = 65 To 66
        For j = 65 To 66
            For k = 65 To 66
                For l = 65 To 66
                    For m = 65 To 66
                        For i1 = 65 To 66
                            For i2 = 65 To 66
                                For i3 = 65 To 66
                                    For i4 = 65 To 66
                                        For i5 = 65 To 66
                                            For i6 = 65 To 66
                                                For n = 32 To 126
                                                    ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                                    If ActiveSheet.ProtectContents = False Then
                                                        MsgBox "Planilha " & ActiveSheet.Name & " debloqueada sob a senha: " & Chr(i) & Chr(j) & _
                                                               Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
                                                               Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                                        Exit Sub
                                                    End If
                                                Next
                                            Next
                                        Next
                                    Next
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
    Next
End Sub

O motivo da facilidade do desbloqueio está na simplicidade do algoritmo de encriptação da senha. Conforme anunciado pela própria especificação do Office Open XML specification, a mesma se baseia em um hash de 16 bits. Uma lida rápida em documentações de criptografia nos leva a constatação de que o algoritmo hash produz resultados “sem volta”, ou seja, é impossível obter o valor original a partir de “seu hash”, mas também que a base em 16 bit é quebrável sem muito esforço computacional. A função acima quebra a senha fazendo uso de força bruta, o que comprova a fragilidade do método utilizado.

Disso, dá para tirar algumas conclusões e cuidados que devemos tomar quando falamos de aplicativos e planilhas sérias em nosso dia a dia:

  • Use o recurso de proteção de planilhas somente para bloqueio de nevegação ou algo parecido
  • Se quiser proteger efetivamente, use proteção de senha do arquivo
  • Use senhas fortes sempre que possível

Para projetos VBA:

  • Use sempre proteção de senha para os projetos
  • Siga as dicas deste blog e do nosso fórum sobre técnicas de segurança para projetos VBA

Mais algumas dicas:

http://www.oraxcel.com/projects/encoffice/help/How_safe_is_Excel_encryption.html

Referências


http://kohei.us/2008/01/18/excel-sheet-protection-password-hash/

VBA – Aumente a segurança de seus projetos VBA

 

Logo VBA

Código de autoria do colega Felipe Dasi, colaborador do blog e do nosso fórum.

O conjunto de código abaixo serve para proteger seu arquivo de projeto VBA. Ele faz com que, caso o projeto VBA esteja desprotegido, todo os conteúdo de código dos módulos e planilha sejam excluídos, dificultando o hackeamento de seu aplicativo.

O código abaixo promove a proeza. Os comentários auxiliam na orientações deste e são do próprio autor.

Colocar em Estapasta_de_trabalho:

Option Explicit
 
Private Sub Workbook_Open()
      If Application.Version > 9 Then
            Dim VisualBasicProject As Object
            On Error Resume Next
            Set VisualBasicProject = ActiveWorkbook.VBProject
            If Not Err.Number = 0 Then
 
      End If
      'DESABILITA ESC E INICIA RELOGIO
      Application.EnableCancelKey = xlDisabled
      Run "IniciaRelogio"
      End If
End Sub
 
'
'TODAS AS POSSIBILIDADES
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
      Run "ParaRelogio"
      'PODE COLOCAR CODIGO PROPRIO AQUI
      Run "IniciaRelogio"
End Sub
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      Run "ParaRelogio"
      'PODE COLOCAR CODIGO PROPRIO AQUI
      Run "IniciaRelogio"
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
      Run "ParaRelogio"
      'PODE COLOCAR CODIGO PROPRIO AQUI
      Run "IniciaRelogio"
End Sub
 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      Run "ParaRelogio"
      'PODE COLOCAR CODIGO PROPRIO AQUI
      Run "IniciaRelogio"
End Sub
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Run "ParaRelogio"
      'PODE COLOCAR CODIGO PROPRIO AQUI'
End Sub

Colocar em um módulo VBA:

'Se a senha em A1 for igual a 123
'Se a senha em Comentários em propriedades da Planilha = 456
'Se a senha do VBA = 123
'RESULTADO O projeto VBA é aberto
'Resumindo, se uma das senha não bater o VBA é apagado
'Se você tirar a senha de A1 e Salvar, a planilha pode ser usada normalmente, mas
' se o usuário quebrar a senha, ao acessar o modulo o VBA serás apagado.
Option Explicit
 
Public IdleTime As Date
 
Private Sub DeletaVBA()
      With ThisWorkbook
            If Plan1.[A1] = "123" _
               And .BuiltinDocumentProperties("Comments") = "456" Then
                  'COLOCANDO A SENHA CORRETA DO VBA E MANTENDO AS OUTRAS DUAS EM A1 E EM PROPRIEDADES O RELOGIO NÃO É ATIVADO.
               'CASO CONTRARIO O RELOGIO É ATIVADO E EM 5 SEGUNDOS O PROJETO VBA SERÁ APAGADO.
                  Run "ParaRelogio"
                  Exit Sub
            Else
                  If .VBProject.Protection = 0 Then   'unlocked
                        Run "ParaRelogio"
 
                        Dim Component As Object
 
                        ' AQUI DELETA TODOS MODULOS DO VBA
                        For Each Component In .VBProject.VBComponents
                              With Component.CodeModule
                                    .DeleteLines 1, .CountOfLines
                              End With
                        Next
 
                        'SALVA AS ALTERAÇÕES FEITAS NA PLANILHA
                        .Save
                        'SE QUISER COLOCAR UMA MENSAGEM
                          MsgBox "SENHA(S) INCORRETA(S) - " & _
                               "TODOS OS MODULOS SERÃO APAGADOS... :o)"
                        Workbooks.Open (.FullName)
                        .Close
                  Else
                        'INICIA A CONTAGEM DO RELOGIO SE VBA FOR QUEBRADO
                        Run "IniciaRelogio"
                  End If
            End If
      End With
      Exit Sub
 
End Sub
 
Private Sub IniciaRelogio()           
      If Plan1.[A1] = "123" _
         And ThisWorkbook.BuiltinDocumentProperties("Comments") = "456" _
         Then Exit Sub
 
            'AQUI É O TEMPO DE ABERTURA DO VBA
      IdleTime = Now + TimeValue("00:00:05")
 
      Application.OnTime IdleTime, "DeletaVBA"
End Sub
 
Private Sub ParaRelogio()
      On Error Resume Next
      Application.OnTime EarliestTime:=IdleTime, _
                         Procedure:="DeletaVBA", Schedule:=False
End Sub

O código e melhorias estão sendo discutidas em nosso fórum:

http://www.tomasvasquez.com.br/forum/viewtopic.php?f=6&t=249&start=10

Bom proveito! Valeu Felipe!

VBA – Verificando se o projeto (VBAProject) está protegido

Mais uma que pode ajudar a proteger seus projetos em VBA. Com essa verificação, é possível fazer com que a proteção do projeto seja requisito para seu funcionamento.

Bom, vamos ao código:

'É necessário adicionar referência ao
'Microsoft Visual Basic for Applications Extensibilty Library
Function VBAProjectIsProtected() As Boolean
    Dim oVBP As VBIDE.VBProject
    Dim IsProtected As Boolean
 
    'Verifica se o projeto está bloqueado
    IsProtected = (Application.VBE.ActiveVBProject.Protection = vbext_pp_locked)
 
    VBAProjectIsProtected = IsProtected
End Function

Como é uma Function, é possível testar seu funcionamento em uma célula do Excel, bastando digitar: =VBAProjectIsProtected(). O resultado é o valor VERDADEIRO caso o projeto esteja protegido, FALSO do contrário.

O mais bacana é que o resultado só é verdadeiro se o projeto estiver além de protegido por senha, fechado para visualização. Se o projeto for aberto para visualização, indo ao VBA e informando a senha de acesso, a função passa a retornar FALSO. Com isso, tem-se a total garantia de que o projeto esteja mesmo na condição de protegido, podendo a partir daí, tomar qualquer providência, desde mostrar uma mensagem, fechar o aplicativo ou até mesmo excluir um módulo do VBA.

Referências:

http://www.mrexcel.com/forum/showthread.php?t=18539

Bom proveito!