IN THE SPOTLIGHT: MDE to MDB Conversion Service
(also supports: ACCDE to ACCDB, ADE to ADP, etc)
IN THE SPOTLIGHT: Access Database Repair Service
An in-depth repair service for corrupt Microsoft Access files
IN THE SPOTLIGHT: vbWatchdog
VBA error handling just got easier...
" vbWatchdog is off the chart. It solves a long standing problem of how to consolidate error handling into one global location and avoid repetitious code within applications. "
- Joe Anderson,
Microsoft Access MVP
Meet Shady, the vbWatchdog mascot watching over your VBA code →
(courtesy of Crystal Long, Microsoft Access MVP)
IN THE SPOTLIGHT: vbMAPI
An Outlook / MAPI code library for VBA, .NET and C# projects
Get emails out to your customers reliably, and without hassle, every single time.
Use vbMAPI alongside Microsoft Outlook to add professional emailing capabilities to your projects.
IN THE SPOTLIGHT: Code Protector
Standard compilation to MDE/ACCDE format is flawed and reversible.
Let's take a simple VBA function (taken from Northwind sample database) and look at the results of normal reverse engineering versus reverse engineering after protecting the file with our Code Protector.
The original source code:
Function OpenStartup() As Boolean
Dim blnHideStartupForm As Boolean
On Error GoTo OpenStartup_Err
If IsItAReplica() Then
DoCmd.Close
Else
If (CurrentDb().Properties("StartupForm") = "Startup" Or _
CurrentDb().Properties("StartupForm") = "Form.Startup") Then
blnHideStartupForm = False
Else
blnHideStartupForm = True
End If
Forms!Startup!HideStartupForm = blnHideStartupForm
End If
OpenStartup_Exit:
Exit Function
OpenStartup_Err:
Const conPropertyNotFound = 3270
If Err = conPropertyNotFound Then
Forms!Startup!HideStartupForm = True
Resume OpenStartup_Exit
End If
End Function
Normal reverse engineered source code after being compiled to MDE format:
Function OpenStartup() As Boolean
Dim blnHideStartupForm As Boolean
Const conPropertyNotFound = 3270
On Error GoTo ErrorHandler
If IsItAReplica() Then
DoCmd.Close
Else
If CurrentDb().Properties("StartupForm") = "Startup" Or _
CurrentDb().Properties("StartupForm") = "Form.Startup" Then
blnHideStartupForm = False
Else
blnHideStartupForm = True
End If
Forms("Startup").Controls("HideStartupForm") = blnHideStartupForm
End If
ExitRoutine:
Exit Function
ErrorHandler:
If Err = conPropertyNotFound Then
Forms("Startup").Controls("HideStartupForm") = True
Resume ExitRoutine
End If
End Function
As you can see, by using standard reverse engineering on a compiled MDE version of Northwind, we can retrieve VBA source code that is very similar to the original.
However, after using the MDE Protector on the compiled MDE file, there are some major benefits that make the reverse engineering much less accurate.
Constants are removed
Variable names and datatypes are lost (see below - variable blnHideStartupForm:Boolean becomes Variable8:Variant)
After using the MDE Protector a decompiler cannot determine whether the variables that were defined by the compiler (implicit/temporary variables) are in fact real variables or not so it has to assume they are all real, explicit variables ***
*** Compilers (including the VBA compiler) make use of both explicit variables (declared by the developer) and implicit variables (declared by the compiler) in order to make everything work as it should. By examining the "compiler junk", a decompiler can determine exactly which variables are implicit and which ones are explicit - using this information, the decompiler can then optimize the resultant source code by removing all implicit variables - this is key to making the resultant source code very accurate to the original.
Reverse engineered code after protecting the MDE with the Code Protector:
Function OpenStartup() As Boolean
Dim Variable1
Dim Variable2 As Object
Dim Variable3
Dim Variable4
Dim Variable5 As Object
Dim Variable6
Dim Variable7
Dim Variable8
Dim Variable9 As Object
Dim Variable10 As Object
On Error GoTo ErrorHandler
Variable1 = IsItAReplica()
If Variable1 = True Then
DoCmd.Close
Else
Set Variable2 = CurrentDb()
Variable3 = Variable2.Properties("StartupForm")
Variable4 = (Variable3 = "Startup")
Set Variable2 = Nothing
Set Variable5 = CurrentDb()
Variable6 = Variable5.Properties("StartupForm")
Variable7 = (Variable6 = "Form.Startup")
Set Variable5 = Nothing
If Variable4 = True Or _
Variable7 = True Then
Variable8 = False
Else
Variable8 = True
End If
Set Variable9 = Forms("Startup")
Set Variable10 = Variable9.Controls("HideStartupForm")
Variable10 = Variable8
Set Variable10 = Nothing
Set Variable9 = Nothing
End If
ExitRoutine:
Exit Function
ErrorHandler:
If Err = 3270 Then
Set Variable9 = Forms("Startup")
Set Variable10 = Variable9.Controls("HideStartupForm")
Variable10 = True
Set Variable10 = Nothing
Set Variable9 = Nothing
Resume ExitRoutine
End If
End Function
As you can see, the result is much less understandable code. A developer could then tidy this code up and optimize it but the point is that it makes the process much harder (particularly in projects of considerable size), and therefore reverse engineering/decompiling your project will become much less effective.
<< Back to main information pageTWINBASIC LTD (Company No. 16590181, VAT No. GB497509439)
Terms | Privacy | Sitemap | X (Twitter)