...

یکی از نرم افزار های قدرتمند برای برنامه نویسی پایگاه اطلاعات Access است.

که با بهره گیری از محیط برنامه نویسی VBA و ارتباط با ActiveX ها مانند ocx و dll ها ظرفیتی چندبرابر یافته است.

فایل های دیتابیس روزی با پسوند mdb و mde و شبیه به این در اکسس تولید می شدند این پسوندها امروزه با accdb و accde تولید می شوند.


نخستین سئوالی که به آن پاسخ می دهیم، اینستکه تفاوت های accdb با mdb چیست؟ (که طبیعتا تفاوتهای accde با mde نیز خواهند بود)

الف- پایگاه های داده ACCDB امنیت سطح کاربر را مانند پایگاه داده های MDB پشتیبانی نمی کند اما encryptin در یک پایگاه داده ACCDB قوی تر است.

  ب- پایگاه های داده ACCDB پشتیبانی چندین نوع مختلف جدید از انواع داده ها(فیلدها) را پشتیبانی می کند که در MDB خبری از آنها نبود.

       مانند: multivalue fields و calculated fields و attachment fields که هر یک از انواع فیلدهای جدید، توانمندی های منحصر به فرد و بسیار خوبی دارند که در برنامه نویسی های نرم افزارهای بسیار قدرتمند کاربردهایی خود را به صورت جدی نشان می دهند. توضیح درباره این انواع جدید داده ها در این فرصت نمی گنجد.

  ج- پایگاه های داده ACCDB ماکروهای جدول (Table Macros) را پشتیبانی می کند، که در MDB خبری از آنها نبود.

  د- پایگاه های داده ACCDB فرم(novel form) و گزارش(report options)، با امکانات جدیدی مانند پوسته(layouts) و تقویم پنجره(popup calendar) را پشتیبانی می کند.

البته تغییرات دیگری در نحوه بکارگیری برخی امکانات داخلی اکسس بین دو فرمت(مانند Replication و link a table) و نحوه استفاده این پایگاهها توسط نرم افزارهای جانبی(مانند Crystal Reports و SQL Server و SharePoint ) بوجود آمده است، که فرصت پرداختن به آنها نیست، و فقط به آنها اشاره کردیم.


دومین سئوالی که به آن پاسخ می دهیم، اینستکه تفاوت های accdb با accde چیست؟ (که طبیعتا تفاوتهای mdb با mde نیز خواهند بود)

مهمترین تفاوت این دو فایل در عبارت locked-down آنها است(یعنی قفل کردن)

وقتی کدهای برنامه نویسی در accdb یا mdb نوشته می شوند قابل مشاهده هستند ولی وقتی فایل های مذکور کامپایل می شوند و به فرمت کامپایل شده تبدیل می شوند. دیگر محتوای آنها توسط چشم انسان قابل خواندن نیستند.

برای اینکه در ادامه مرتب عبارت های accdb و accde, mdb و mde را تکرار نکنیم از اینجا به بعد در این نوشتار دو فایل accdb و mdb را فایل های نوع B وفایل های accde و mde را فایل های نوع E نامگذاری می کنیم.

دومین تفاوت دو فایل در سرعت اجرای آنها است، فایل های B کند تر از فایل های نوع E اجرا می شوند. که دلیل آن کاملا روشن است. چونکه ابتدا کدهای نوشته شده در فایل های B باید کامپایل شوند و بعد اجرا شوند، در حالیکه فایل های نوع E قبلا کامپایل شده اند.


اما آنچه برای برنامه نویس اهمیت دارد اینستکه کدهای نوشته شده او در امنیت کامل و بدون خطر کرک یا هک منتشر شود.

هک یا کرک توسط افراد ناشناس که در قالب مشتریان و یا مشاوران به نرم افزارها دسترسی پیدا می کنند صورت می گیرد.

در اینجا دو راه برای هک یا کرک نرم افزار وجود دارد.

1- هک توسط افرادی که تسلط کافی به رایانه ندارند:

- معمولا افرادی که تسلط کافی به رایانه ندارند و تعدادشان هم بسیار است تمایل دارند بجای پرداخت وجه نرم افزار راهی برای هک آن پیدا کنند.

- این افراد راه هایی را برای هک نرم افزار بررسی می کنند و تا حدودی در رابطه با هک نرم افزار مورد نظرشان، به مقالاتی که در وب سایت ها وجود دارد مراجعه می کنند، گرچه در این مسیر مهارتهایی را هم کسب می کنند، اما این اطلاعات برای هک نرم افزار معمولا کافی نخواهد بود.

- لزوما هک نرم افزار، تخصصی بسیار بیشتر از آنچه که فردی عادی و بدون تخصص نیاز دارد - احتیاج دارد.

مثلا: در این مسیر، اگر علم هک در ابرها باشد، فرد عادی تنها از اعماق دریا به سطح آب می رسد، و تازه متوجه می شود که باید در مسیری گازی شکل خود را به ابرها برساند. در این مسیر فرد عادی باید وقت بسیار زیادی را برای کسب علوم متعدد رایانه ای سپری کند ؛ او به مرور به این نتیجه می رسد که اگر برای هک نرم افزار به یک رشته تحصیلی در یک دانشگاه توجه می کرد و می توانست مدرک تحصیلی مشابه ای را بگیرد، شاید از کاری که آغاز کرده مقرون به صرفه تر بود.

2- هک توسط افرادی که تسلط کافی به رایانه دارند:

کسانی که تسلط کافی به رایانه دارند و علمشان در این زمینه می تواند بدردبخور باشد، معمولا آنقدر سرشان شلوغ است و آنقدر درگیر پروژه های شخصی خود هستند که نیازی به هک نرم افزارهای دیگران ندارند.

افراد مسلط و دارای دانش کافی رایانه ای معمولا مورد توجه دیگران هستند، و به آنها پروژه هایی سپرده شده است و معمولا در حال انجام پروژه های پر سود هستند. آنها وقت خود را برای هک نرم افزار صرف نمی کنند.

کم ارزشترین کار برای افراد دارای تسلط کافی به رایانه هک نرم افزارها است. - چرا که سود چشمگیری برای آنها نخواهد داشت.

اما نمی توان این امکان را نادیده گرفت که شاید فردی مسلط به علوم رایانه، برای سرگرمی یا به سفارش فردی دیگر، یا انگیزه های منفی (مانند: حسادت و تخریب و تلافی و ... ) دست به هک نرم افزاری بزند.

با این مقدمه به بررسی یکی از روش های رمز گذاری توسط مایکرو سافت خواهیم پرداخت: 

سئوال اینست: آیا accde کدهای باینری شده ی accdb است؟

همانطور که از سئوال می توان فهیمد برخلاف آنچه که در مقدمه دیده می شد سئوالی بسیار تخصصی مطرح شده است.

اما زمینه بروز این سئوال چه بوده.

سایتی به نام everythingaccess.com وجود دارد که در آن فردی به نام Wayne Phillips ادعا می کند می تواند کدهای باینری تولید شده در accde را مشاهده کند.

در این سایت بخشی وجود دارد که Database Repair Service for Microsoft® Acces نام دارد.

پس از ورود به این بخش با عبارت  Send your corrupt file to one of our expert engineers  روبرو می شوید که به معنی "ارسال فایل خراب خود را به یکی از مهندسان متخصص ما (از طریق این وب سایت)" است.

باید اول در وب سایت عضو شوید و بعد وارد شوید بعد از شما فایلی را دریافت می کند یعنی فایل را آپلود می کنید(Access Revival Service - Upload File)، بعد از ارسال برایتان یک کد پیگیری صادر می کند . مثلا:

Your database file has successfully been uploaded. Your Recovery Job ID is #ARW-46348996 Please use the Job ID in all correspondence.

سپس فایل را ظرف 48 ساعت به ایملتون ارسال می کنه.

همچنین بخش دیگری در این سایت وجود دارد که MDE to MDB conversion service and  ACCDE to ACCDB conversion service  نام دارد.

پس از ورود به این بخش باید فایل کامپایل شده اکسس را که با پسوند accde یا mde هست را آپلود کنید.

و بعد یک توضیح درباره Please explain briefly what the software does, or what it is used for به معنی (لطفا خلاصه توضیح دهید نرم افزار چه می کند، و یا آنچه در آن است چه استفاده ای دارد)

در بخش دوم هم خواسته اگر نسخه قدیمی کامپایل نشده فایل رو دارید ارسال کنید.

گرچه این بخش اخلاقا سعی می کند از دکامپایل(یعنی برگرداندن فایل کامپایل شده به کدهای اصلی نوشته شده توسط برنامه نویس)، برای افرادی که مشکوک به هکر هستند جلوگیری کند، اما با فرض اینکه فردی دارای هوش رفتاری(EQ) بالایی باشد، شاید بتواند از این فیلتر که اطمینان چندانی به آن نیست عبور نماید.

نتیجه اینکار ارسال فایل دکامپایل شده به ایمیل درخواست کننده پس از 48 ساعت خواهد بود.

در این سایت حتی پشتیبانی آنلاین نیز وجود دارد.


حال این سئوال پیش می آید که آیا واقعا کدهای موجود در accdb در accde به کدهای باینری تبدیل می شوند؟

این موضوع را بررسی می کنیم>

ابتدا فایلی به نام accdb و با همین پسوند ایجاد می کنیم.

بلافاصله پس از ورود به اکسس از ایجاد هر گونه جزئیات مانند Table و .... پرهیز می کنیم.

کلید F11 صفحه کلید را می زنیم تا وارد بخش Microsoft Visual Basic for Application شویم.

ر اینجا تنها یک Module درست می کنیم.

و ر آن تنها سه خط زیر را تایپ می کنیم.

Function main()

MsgBox "My Text."

End Function

اکنون فایل را ذخیره می کنیم.

و سپس آنرا به فرمت accde استخراج می کنیم.(اینکار در access2010 به بعد از طریق منوی File و گزینه ی Make ACCDE امکانپذیر است)، فایل استخراج شده را به نام accde.accde نامگذاری می کنیم.


تا اینجا کار روتینی را انجام دادیم که معمولا هر فردی هنگام کامپایل دیتابیس خود انجام می دهد.

ما در حال بررسی ساختار باینری فایل accde هستیم.


هر دو فایل accdb.accdb و accde.accde را کاملا ببندید.

از طریق راست کلیک و گزینه ی ...Open with، و Notepad هر دو فایل را باز کنید.

روی Taskbar ویندوز راست کلیک کنید و گزینه  show windows side by side را انتخاب کنید تا هر دو فایل در کنار هم قرار بگیرند.

اگر به بالای عنوان هر دو فایل نگاه کنید نام فایل ها نشان داده شده اند.

اکنون در هر دو فایل عبارت My Text را جستجو می کنیم.

در فایل accdb این عبارت پیدا خواهد شد، اما در فایل accde این عبارت پیدا نمی شود و با پیام ."Cannot find "MyText روبرو خواهیم شد.

(اینکه چرا متن در جای خودش پیدا نشده ممکن است به این دلیل باشد که اکسس محتوای رشته را در بخش هایی از حافظه سازماندهی کرده باشد. و این به استراکچر داخلی مایکروسافت اکسس مربوط می شود.)

اکنون منوی Format را در هر دو Notepad باز کنید و دقت کنید که گزینه Word Wrap تیک داشته باشد.(این گزینه را تیکدار کنید)

اکنون به جستجوی عبارت Module=Module1  بپرازید.

و وقتی این عبارت را پیدا کردید از کلید جهتی پایین استفاده کنید و به پایین بروید تا جایی که این عبارت در هر دو فایل در بالای صفحه Notepad واقع شود.

اکنون با دو متن به شکل زیر روبرو خواهیم بود:

در بررسی این دو فایل درخواهیم یافت که محتوای فایل accde به شدت به کدهای باینری نزدیکتر است. و نمی توان محتوای متنی برنامه نویسی را در آن دید.

این در حالیست که محتوای متن فایل accdb قابل شناسایی تر است.

بخش هایی که قابل شناسایی هستند در متن زیر به رنگ سبز نشان داده شده اند.

پس از دیدن این متن به نظر می رسد گرچه کاری که مهندس Wayne Phillips انجام می دهد بسیار سخت است، اما شدنی هم باید باشد.

فایل accde فایل accdb

Module=Module1
Name="Database"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="EEEC6BEB9F1F3D233D2339273927"
DPB="888A0D0E0E0E0E0E"
GC="2220A73F40404040BF"

[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000

[Workspace]
Module1=26, 26, 386, 557,
rU€ € €
ےےےےےےےےےےےے t  “K*— ےے ےے rU € € € ~ ~ ~ ~ ~ ~ ~k  ر ‡یtعٍéN½5$Dü‡é ) è ےےےے ‰a ےےےےp ےےےے ےے ¹ ‘ ، پ © Module1 Database ï ہ F / C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA7\VBE7.DLL VBA

ٌ ےےےے پ 0  ةےJ™_¯N ھ ? 4 C:\Program Files\Microsoft Office\Office14\MSACC.OLB Access

é ےےےے ‰ @ 0 ہ F C:\Windows\System32\stdole2.tlb stdole

ù ےےےے ! i P علةJ­[اJ†م$ôحخت( B C:\Program Files\Common Files\Microsoft Shared\OFFICE14\ACEDAO.DLL DAO

ظ ےےےے ™ ` main M y T e x t . VBE7.DLL q ےےےےS ˆ @  0 @€ @€ @€ @€ € 2 € 2€ 2€ 2€ 2€ 2€ 2€ 2€ 2€
2 € 2
€ 2€ 2€ 2 € 2€ 2€ 2€ & 2€ ' 2€ ) 2€ * 2€ + 2€ 1 2€ 2 2€ 3 2€ 4 2€ 5 2€ 6 2€ 7 2€ 8 2€ 9 2 n0 @ @ @ @ @ @ @ @ € € 2 € € 2€ € 2€ € 2€ € 2€ € 2€ € 2€ € 2€ €
2 € € 2
€ € 2 € € 2€ € 2€ € & 2€ € ) 2€ € * 2€ € 2€ € + 2€ € 2€ € 2€ € 2€ € 1 2€ € 8 2€ € 9 2€ &€ ' 2€ 1€ 2 2€ 1€ 3 2€ 1€ 4 2€ 1€ 5 2€ 1€ 6 2€ 1€ 7 2

Module=Module1
Name="Database"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="E6E463AFEFB3B1B7B1B7B1B7B1B7"
DPB="ACAE29F529BA2ABA2ABA"
GC="7270F733BC34BC3443"

[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000

[Workspace]
Module1=26, 26, 386, 557, Z
جa— ے) è ْ * \ G { 0 0 0 2 0 4 E F - 0 0 0 0 - 0 0 0 0 - C 0 0 0 - 0 0 0 0 0 0 0 0 0 0 4 6 } # 4 . 1 # 9 # 
Module=Module1
Name="Database"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="1C1E99BFA9DFADDFADDFADDFAD"
DPB="383ABDBEBEBEBEBE"
GC="5456D1C7F1E2F2E2F21D"

[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000

[Workspace]
Module1=26, 26, 386, 557, Z
=²€ 0*گ pH ‚ dè Database¢ , @
Z=
n bZ %J<
rst dole>s t d o l  e h %^ *\G{0002`0430- C
0046} #2.0#0#C :\Window s\System32\e2.tl b#OLE Au tomation# ` €DAO>JD A O5 A¸
®€A4A C9E1DA-5BAD-€7-8 6E3-24F4 CDCECA28}#cAProg ram File s\CommonMicroso ft Share d\OFFICE@14\ACE€A.DLL#Off ice 14.0 Access dأ engin e Object Library‹ X ـ ‚ WF €
Mo dule1G #€µd uآ[1 ہKLIU KIIMOQLF YDBEVKEY EIIPSLRC2 8A L I U K@I M JQ@F Y D@ B E V@EE@EآP S@RD CB H@ ش 1آ„ذ ]B¢,*}:!B+BB ً ؤ ش ° ےےےےٍ ت WF}: 
O ption Co mpare Da tabase
@
Funcpm ain()
M sgBox zy Text. |End Nf
›0 «د

مهندس Wayne Phillips در بخشی از وب سایتش چنین ادعایی دارد:

Original Source: (taken from Northwind 2000 Sample database)

Sub FixAllDataAccessPages()

' Subroutine: FixAllDataAccessPages
' Purpose:    Goes through all of the data access pages in the current database to:
'             * Make sure their connection strings are correct and,
'             * If necessary, update the link from the database container to the page.

    Dim CurrentPath As String          ' Path to the current Database
    Dim FullPath As String             ' Path & Name of the current Database
    Dim DPName As String               ' Name of Page including extension
    Dim DBName As String               ' Name of the current database
    Dim Pgs() As String                ' Array to hold the list of pages
    Dim FullNames() As String          ' Array to hold the FULL name of the Page
    Dim Names() As String              ' Array to hold the Page Name
    Dim NumPages As Integer
    Dim i As Integer                   ' Simple Counter
    Dim WasFixed As Boolean
    Dim NumErrors As Integer           ' Number of errors encountered 
    Dim NumDBCUnfixed As Integer       ' Set to the number of unfixed DBC links

    Const strStatusMsg = "Fixing Page Connections"

    Const strFixErrPrefix = "There were "
    Const strFixErrSuffix = " errors fixing your data access page " & _
        "connections.  Some pages may not function as expected."
    Const strFixErrTitle = "Cannot Fix Pages!"

    Const strMDEMsgPrefix = "This file is an MDE and contains "
    Const strMDEMsgSuffix = " links to data access pages which could " & _
        "not be fixed.  The page sources have been checked."
    Const strMDEMsgTitle = "Cannot Fix DBC Links!"

    ' Check if the database is read only, then we won't be able to fix
    ' anything, so exit now.
    If (GetAttr(Application.CurrentProject.FullName) And vbReadOnly) Then Exit Sub

    FullPath = CurrentDb.Name

    DBName = Mid(FullPath, InStrRev(FullPath, "\", , vbBinaryCompare) + 1)

    CurrentPath = Left$(FullPath, InStrRev(FullPath, "\", , vbBinaryCompare) - 1)

    ' Get the total number of Data Access Pages
    NumPages = CurrentProject.AllDataAccessPages.Count

    ' Set the array to hold the page names
    ReDim Preserve FullNames(NumPages - 1)
    ReDim Preserve Names(NumPages - 1)
      
    ' Get all the Page Names and FullNames (Name with and without paths)
    For i = 0 To NumPages - 1
        FullNames(i) = CurrentProject.AllDataAccessPages(i).FullName
        Names(i) = CurrentProject.AllDataAccessPages(i).Name
    Next i

    Application.Echo False, strStatusMsg

    NumErrors = 0
    NumDBCUnfixed = 0

    For i = 0 To NumPages - 1
        ' Step through each page in the Array
        ' Removing the path (preserving the extension if any)

        DPName = Right(FullNames(i), Len(FullNames(i)) - InStrRev(FullNames(i), _
                            "\", , vbBinaryCompare))
        WasFixed = FixPageConnection(CurrentPath, FullNames(i), DPName, DBName, _
                            Names(i), NumDBCUnfixed)
        If Not (WasFixed) Then
                NumErrors = NumErrors + 1
        End If
    Next
    
    If NumErrors <> 0 Then
            MsgBox strFixErrPrefix & NumErrors & strFixErrSuffix, _
                        vbCritical, strFixErrTitle
    End If
    
    ' If we weren't able to fix some DBC links, it means we're an MDE with bad links
    If NumDBCUnfixed <> 0 Then
            MsgBox strMDEMsgPrefix & NumDBCUnfixed & strMDEMsgSuffix, _
                        vbCritical, strMDEMsgTitle
    End If
    
    Application.Echo True

End Sub
		


Reverse Engineered Source Code: (from a Northwind 2000 MDE database)

Public Sub FixAllDataAccessPages()

    Dim i As Integer
    Dim DPName As String
    Dim FullPath As String
    Dim DBName As String
    Dim CurrentPath As String
    Dim FullNames() As String
    Dim NumPages As Integer
    Dim NumDBCUnfixed As Integer
    Dim Pgs() As String
    Dim WasFixed As Boolean
    Dim Names() As String
    Dim NumErrors As Integer
    
    Const strFixErrPrefix As String = "There were "
    Const strMDEMsgSuffix As String = " links to data access pages which could " & _
                     "not be fixed.  The page sources have been checked."
    Const strFixErrTitle As String = "Cannot Fix Pages!"
    Const strStatusMsg As String = "Fixing Page Connections"
    Const strMDEMsgPrefix As String = "This file is an MDE and contains "
    Const strFixErrSuffix As String = " errors fixing your data access page " & _
                     "connections.  Some pages may not function as expected."
    Const strMDEMsgTitle As String = "Cannot Fix DBC Links!"

    If GetAttr(CurrentProject.FullName) And 1 Then  

        Exit Sub

    End If

    FullPath = CurrentDb.Name
    DBName = Mid(FullPath, InStrRev(FullPath, "\") + 1)
    CurrentPath = Left$(FullPath, InStrRev(FullPath, "\") - 1)
    NumPages = CurrentProject.AllDataAccessPages.Count
    Redim Preserve FullNames(NumPages - 1)
    Redim Preserve Names(NumPages - 1)

    For i = 0 To NumPages - 1

        FullNames(i) = CurrentProject.AllDataAccessPages(i).FullName
        Names(i) = CurrentProject.AllDataAccessPages(i).Name

    Next i

    Echo 0, strStatusMsg
    NumErrors = 0
    NumDBCUnfixed = 0

    For i = 0 To NumPages - 1

        DPName = Right(FullNames(i), Len(FullNames(i)) - InStrRev(FullNames(i), "\"))
        WasFixed = FixPageConnection(CurrentPath, FullNames(i), DPName, DBName, _
                         Names(i), NumDBCUnfixed)

        If Not WasFixed Then  

            NumErrors = NumErrors + 1

        End If

    Next i

    If NumErrors <> 0 Then  

        MsgBox strFixErrPrefix & NumErrors & strFixErrSuffix, _
                vbCritical, strFixErrTitle

    End If

    If NumDBCUnfixed <> 0 Then  

        MsgBox strMDEMsgPrefix & NumDBCUnfixed & strMDEMsgSuffix, _
                vbCritical, strMDEMsgTitle

    End If

 Echo -1, vbNullString

End Sub

در این متن دیده می شود که فایل از فرمت mde به mdb تغییر محتوا داده شده. و این متن با آنچه که در دو Notepad دیده شد خیلی متفاوت بود.


آخرین سئوالی را که در این نوشتار پاسخ می دهیم اینست:

آیا برنامه نویسی در محیط vba در Access امن است؟

پاسخ بلی است.

اما توضیحاتی نیز وجود دارد:

اجازه دهید یک مثال بزنم

به یاد دارم که در دوره ای برای کاری مجبور به سوراخ کرن قطعه ای فلزی بودم، به همین منظور به ابزار فروش های شهر و محله زندگی خود می رفتم و از آنها درخواست مته ای را می کردم که بتواند آن قطعه را سوراخ کند، بهترین مته ها را سفارش می دادم، و فروشنده اطمینان می داد که بهتر این مته را پیدا نخواهم کرد. اما وقتی مته را در کارگاه به دلر متصل می کردم و روی قطع می گذاشتم با سرعت کم و یا زیاد، مته به شدت آسیب می دید. به این نتیجه رسیدم که جنس قطعه من باید از آلیاژ خاصی باشد. به همین منظور به مرکز خرید ابزار پایتخت(تهران) رفتم. در آنجا موضوع را با چند نفر در میان گذاشتم و مرا به فروشگاههای مختلفی راهنمایی کردند، اتفاقا مته هایی را که قبلا خریده بودم و آسیب دیده بودند را به همراه داشتم. بالاخره کسی را یافتم که هم با سواد و هم با تجربه و هم توانمند در بحث ورود ابزار از تامین کنندگان قطعات خاص بود. او به من گفت این قطعه از آلیاژ خاصی است و باید مته ای خاص را که او می شناسد بخرم و از آن استفاده کنم. پس از مدتی مته را پیدا کردم، و مشکل ام به راحتی آب خوردن حل شد.

ادامه دارد....