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 pageiTech Masters | VAT: GB202994606 | Terms | Sitemap | Newsletter