V
vothanhthu
Guest
File code mới nhất, các bạn download tại topic này:
Admin tuhocvba
__________________________
1. Giới thiệu
Tiếp nối và mở rộng 2 chủ đề về bảo mật Code VBA mà mình đã đăng từ các bài đăng trước, nếu bạn nào chưa xem 2 bài viết bảo mật VBA mình đã đăng thì các bạn nên xem lại để có cái nhìn tổng quát về 2 kỹ thuật này trước khi xem bài viết của mình, link mình sẽ để bên dưới:
Trong 2 bài viết trước, mình đã hướng dẫn các bạn cách làm thủ công kỹ thuật Unviewable và kỹ thuật ẩn Module bằng cách chỉnh sửa Hex. Lần này, chúng ta sẽ mở rộng vấn đề ra hơn là sẽ tạo ra được một Addin Excel, chỉ cần chọn file cần Unviewable hoặc ẩn module thì code sẽ thực hiện các thao tác chỉnh sửa nhị phân mà không cần chúng ta phải tương tác thủ công. Trong Addin mình đã cố gắng thêm rất nhiều chú thích code giúp mọi người dễ hiểu nhất có thể.
2. Ý tưởng code
Khi chúng ta mở một file bất kì, chúng đều sẽ được lưu tạm thời trong thư mục Temp, cái này chắc các bạn đều biết. Chúng ta sẽ tận dụng thư mục này để tiến hành các thao tác trích xử lý file vbaProject.bin. Các thao tác di chuyển, kiểm tra, lấy thông tin file chúng ta dùng công cụ FSO (FileSystemObject) và dùng Shell để trích file vbaProject.bin trong file gốc của chúng ta ra thư mục Temp để xử lý, sau đó dùng các phương thức đọc, chỉnh sửa nhị phân để chỉnh sửa file vbaProject.bin và cuối cùng cũng dùng Shell để nạp file vbaProject.bin này lại.
3. Toàn bộ code và chú thích code
4. Cách sử dụng Addin
Các bạn có 2 cách sử dụng Addin:
- Mở trực tiếp lên, chọn các chức năng trong Tab ProtectVBA.
- Add vào như một Addin thông thường để sử dụng lâu dài.
Chọn vào chức năng Khóa Unviewable hoặc Ẩn Module, chọn file cần khóa (Vd: MacroA.xlsb). Chương trình sẽ tạo ra 1 file tương tự thêm tên tương ứng với chức năng khóa (Vd: MacroA_HiddenModule.xlsb) trong cùng thư mục.
Các nguồn tham khảo: Mình tham khảo Code từ bạn Kiều Mạnh, được mình chỉnh sửa, thay đổi code để phù hợp với các phương pháp mà chúng ta đã biết từ 2 bài viết trước của mình. Mình đã cố gắng gắn nhiều chú thích code sao cho bạn dễ hiểu nhất có thể.
Hiện Addin đã có thêm rất nhiều tính năng mới, Click vào Lịch sử Update Addin để có thể tải được phiên bản mới nhất nhé !
Mình sẽ rất vui nếu như chia sẽ của mình đã mang lại thêm cho bạn một kiến thức mới nào đó. Hãy cho mình biết suy nghĩ, thắc mắc của các bạn trong phần trả lời, chúng ta sẽ cùng nhau trao đổi !!
Bạn cần đăng nhập để thấy link
Admin tuhocvba
__________________________
1. Giới thiệu
Tiếp nối và mở rộng 2 chủ đề về bảo mật Code VBA mà mình đã đăng từ các bài đăng trước, nếu bạn nào chưa xem 2 bài viết bảo mật VBA mình đã đăng thì các bạn nên xem lại để có cái nhìn tổng quát về 2 kỹ thuật này trước khi xem bài viết của mình, link mình sẽ để bên dưới:
Bạn cần đăng nhập để thấy link
và
Bạn cần đăng nhập để thấy link
Trong 2 bài viết trước, mình đã hướng dẫn các bạn cách làm thủ công kỹ thuật Unviewable và kỹ thuật ẩn Module bằng cách chỉnh sửa Hex. Lần này, chúng ta sẽ mở rộng vấn đề ra hơn là sẽ tạo ra được một Addin Excel, chỉ cần chọn file cần Unviewable hoặc ẩn module thì code sẽ thực hiện các thao tác chỉnh sửa nhị phân mà không cần chúng ta phải tương tác thủ công. Trong Addin mình đã cố gắng thêm rất nhiều chú thích code giúp mọi người dễ hiểu nhất có thể.
2. Ý tưởng code
Khi chúng ta mở một file bất kì, chúng đều sẽ được lưu tạm thời trong thư mục Temp, cái này chắc các bạn đều biết. Chúng ta sẽ tận dụng thư mục này để tiến hành các thao tác trích xử lý file vbaProject.bin. Các thao tác di chuyển, kiểm tra, lấy thông tin file chúng ta dùng công cụ FSO (FileSystemObject) và dùng Shell để trích file vbaProject.bin trong file gốc của chúng ta ra thư mục Temp để xử lý, sau đó dùng các phương thức đọc, chỉnh sửa nhị phân để chỉnh sửa file vbaProject.bin và cuối cùng cũng dùng Shell để nạp file vbaProject.bin này lại.
3. Toàn bộ code và chú thích code
Mã:
'Code tham khao: Kieu Manh
'Chinh sua, thay doi code, chu thich lai cho phu hop voi tieu chi de hieu nhat co the: vothanhthu (TuhocVBA.Net)
Option Explicit
Private Sub LockHiddenProject(ByVal strBinaryFile As String, ByVal LockUlock As Boolean)
If LockUlock Then
Call ChangeKeys(strBinaryFile, True)
Else
Call ChangeKeys(strBinaryFile, False)
End If
End Sub
Private Function FixPath(ByVal sPath As String) As String
FixPath = sPath & IIf(Right(sPath, 1) <> "\", "\", "")
End Function
Private Sub ChangeKeys(ByRef strBinaryFile As Variant, ByRef isLockView As Boolean)
Dim F1 As Long, i As Long, bytTemp As Byte, strTemp As String * 5
Dim F2 As Long, j As Long, bytTemp1 As Byte, strTemp1 As String * 7
'mo file vbaProject.bin dang nhi phan
If isLockView Then GoSub Read_Binary Else GoSub Hidden_Module 'Neu IsLockView = True thi tien hanh khoa, nguoc lai thi Hidden Module
Read_Binary:
F1 = FreeFile
Open strBinaryFile For Binary Access Read Write As #F1
Do
i = i + 1
Get #F1, i, bytTemp 'Get bytTemp tai vi tri i
If bytTemp = 67 Or bytTemp = 68 Or bytTemp = 71 Then 'Neu tim den dung cac vi tri 67,68,71 tuong ung la C, D, G thi
Get #F1, i, strTemp 'Get StrTemp voi vi tri i
If strTemp = "CMG=""" Or strTemp = "DPB=""" Or strTemp Like "GC=""*" Then GoSub Lock_VBA
End If
Loop While Not EOF(F1)
GoTo Finally
Lock_VBA:
For i = Loc(F1) + 1 To LOF(F1)
Get #F1, i, bytTemp
If bytTemp = 34 Then 'Neu Hex = 34 (")
Exit For 'Thoat For
Else
Put #F1, i, CByte(49) 'Tien hanh ma hoa cac ki tu do thanh 1
End If
Next
Return 'Tro lai Change_Binary
Finally:
Close #F1
Hidden_Module:
F2 = FreeFile
Open strBinaryFile For Binary Access Read Write As #F2
Do
j = j + 1
Get #F2, j, bytTemp1
If bytTemp1 = 77 Then 'Neu tim thay hex 4D
Get #F2, j, strTemp1
If strTemp1 = "Module=" Then
For j = Loc(F2) - 6 To LOF(F2)
Get #F2, j, bytTemp1
Put #F2, j, CByte(10) 'thay the toan bo thanh 0A
If bytTemp1 = 13 Then Exit For 'Hex 0D se thoat for
Next
End If
End If
Loop While Not EOF(F2)
Close #F2
End Sub
Private Sub LockHiddenVBA(ByVal FileExcel As String, ByVal isLockView As Boolean)
Dim Fso As Object, ObjShell As Object, TempPath
Dim FileName_Path, ZipFile, vbaProject As String
Dim sPath As String, NewFile As String, OldFile As String
Dim strFileName, strFileType, strFileNote
Set ObjShell = CreateObject("Shell.Application")
Set Fso = CreateObject("Scripting.FileSystemObject") 'Kích hoat cong cu FSO
If Fso.FileExists(FileExcel) = False Then Exit Sub 'Neu FileExcel khong ton tai se thoat Sub
sPath = Fso.GetFile(FileExcel).ShortPath ''Lay ShortPath cua File
FileName_Path = FixPath(Fso.GetFile(sPath).ParentFolder) ''Lay ShortPath cua Folder .. xu ly loi khi Folder la Tieng Viet co dau
'Khai bao Thong tin Su dung
TempPath = FixPath(Fso.GetSpecialFolder(2)) ''Lay duong dan Folder Rac
vbaProject = TempPath & "vbaProject.bin" 'Lay dia chi cua file vbaProject.bin
strFileName = Fso.GetBaseName(FileExcel) 'Lay ten FileExcel
strFileType = "." & Fso.GetExtensionName(FileExcel) 'Lay phan mo rong cua FileExcel
strFileNote = IIf(isLockView, "_Unviewable", "_HiddenModule") 'Ten phan phia sau name cua FileExcel tuy truong hop
NewFile = TempPath & strFileName & strFileNote & strFileType 'Set toan bo dia chi cua file moi trong Folder Rac
OldFile = FileName_Path & strFileName & strFileNote & strFileType 'Set duong dan thuc te cua file moi
ZipFile = NewFile & ".zip" 'Them .ZIP sau File moi trong Folder Rac
'Xoa het File cu neu co, tranh loi khong can thiet
If Fso.FileExists(OldFile) Then Fso.DeleteFile (OldFile)
If Fso.FileExists(NewFile) Then Fso.DeleteFile (NewFile)
If Fso.FileExists(ZipFile) Then Fso.DeleteFile (ZipFile)
If Fso.FileExists(vbaProject) Then Fso.DeleteFile (vbaProject)
'Copy File Moi
Fso.CopyFile FileExcel, NewFile, True 'Tao file moi voi duong dan la NewFile
If Fso.FileExists(NewFile) Then 'Neu Duong dan NewFile ton tai thi
Fso.MoveFile NewFile, ZipFile
ObjShell.Namespace(TempPath).movehere ObjShell.Namespace(ZipFile).items.Item("xl\vbaProject.bin") 'Cut File vbaProject.bin Trong *.zip ra ngoai Folder
Do While ObjShell.Namespace(ZipFile & "\xl\") Is Nothing
Application.Wait (Now + 0.000005) ''Cho xu ly cho toi khi ket thuc sau 0.5 giay
Loop
Call LockHiddenProject(vbaProject, isLockView) ''Xu ly ma hoa chuoi trong File vbaProject.bin
ObjShell.Namespace(ZipFile & "\xl\").movehere ObjShell.Namespace(TempPath).items.Item("vbaProject.bin") 'Cut File vbaProject.bin Vao File *.zip
Do Until Not Fso.FileExists(vbaProject)
Application.Wait (Now + 0.000005)
Loop
Fso.MoveFile ZipFile, NewFile
Do Until Not Fso.FileExists(ZipFile)
Application.Wait (Now + 0.000002)
Loop
Fso.MoveFile NewFile, FileName_Path
MsgBox "Khóa thành công Code VBA", 64, "Thông Báo"
End If
Set ObjShell = Nothing
Set Fso = Nothing
End Sub
Sub Lock_vbaProject()
Dim vFile
vFile = Application.GetOpenFilename("All Files, *.xls; *.xlsx; *.xlsm; *.xlsb;*.xla; *.xlam") 'Hien bang chon file voi cac dinh dang ho tro
If TypeName(vFile) = "String" Then Call LockHiddenVBA(vFile, True) 'Neu co chon thi se goi sub LockHiddenVBA voi dang True
End Sub
Sub Hidden_Module()
Dim vFile
vFile = Application.GetOpenFilename("All Files, *.xls; *.xlsx; *.xlsm; *.xlsb;*.xla; *.xlam") 'Hien bang chon file voi cac dinh dang ho tro
If TypeName(vFile) = "String" Then Call LockHiddenVBA(vFile, False) 'Neu co chon thi se goi sub LockHiddenVBA voi dang False
End Sub
Bạn cần đăng nhập để thấy đính kèm
Các bạn có 2 cách sử dụng Addin:
- Mở trực tiếp lên, chọn các chức năng trong Tab ProtectVBA.
- Add vào như một Addin thông thường để sử dụng lâu dài.
Chọn vào chức năng Khóa Unviewable hoặc Ẩn Module, chọn file cần khóa (Vd: MacroA.xlsb). Chương trình sẽ tạo ra 1 file tương tự thêm tên tương ứng với chức năng khóa (Vd: MacroA_HiddenModule.xlsb) trong cùng thư mục.
Các nguồn tham khảo: Mình tham khảo Code từ bạn Kiều Mạnh, được mình chỉnh sửa, thay đổi code để phù hợp với các phương pháp mà chúng ta đã biết từ 2 bài viết trước của mình. Mình đã cố gắng gắn nhiều chú thích code sao cho bạn dễ hiểu nhất có thể.
Bạn cần đăng nhập để thấy link
Bạn cần đăng nhập để thấy link
: Thêm tính năng đơn giản code, mở khóa Unviewable, công cụ căn lề Code, fix lỗi..
Bạn cần đăng nhập để thấy link
: Thêm mã hóa code, một tính năng năng mở khóa code