Em chào các anh chị!
Có code nào có thể test 1 điều kiện nào đó để xóa toàn bộ vba trong file Excel được không ạ?
Cụ thể là
ô A1! của sheet 1! em đặt điều kiện hoặc =0 hoặc =1.
Khi Open file:
ô a1=1 thì file chạy bình thường.
Nếu A1=0 thì toàn bộ vba trong file bị xóa sạch.
Có được không ạ?
Vấn đề Unprotect Password VBA tôi đã nghiên cứu từ rất lâu rồi mà dường như.. không có cách
Tham khảo các trang web nước ngoài, người ta cũng chỉ có thể dùng phương pháp SendKeys (kiểu như "dạy" cho máy tính cách ta làm bằng tay bằng cách bấm các tổ hợp phím nào đó)
Tuy nhiên, phương pháp dùng SendKeys đôi lúc không ổn định, khi được khi không nên tôi chưa giới thiệu
Nghe đồn rằng có cách dùng hàm API để truy đến các cửa sổ lập trình VBA gì gì đó nhưng tiếc là tôi lại không rành ---> E rằng làm được món này chỉ có thể là siwtom ---> Chở xem
------------------------------------------
Cái này để mình bàn trong 1 dịp khác nha anh (vi phạm nội quy đấy)
Trời ơi! Lợi hại quá, password là cái quỷ gì nó cũng remove tuốt
Ghê gớm hơn nữa là:
- Tôi tạo 1 file khác có pass VBA
- Tiếp theo mở file của siwtom lên đồng thời với file mới vừa tạo rồi nhấn nút Đánh tráo
- Kết quả nhận được là: "cánh cửa" đã được mở cho cả 2 file luôn
- Thử nghiệm tiếp trên 3, 4 file có password, cứ chạy code của siwtom là xem như "mời vào nhà!"
-------------------
Anh đúng là hacker siêu hạng
Trời ơi! Lợi hại quá, password là cái quỷ gì nó cũng remove tuốt
Ghê gớm hơn nữa là:
- Tôi tạo 1 file khác có pass VBA
- Tiếp theo mở file của siwtom lên đồng thời với file mới vừa tạo rồi nhấn nút Đánh tráo
- Kết quả nhận được là: "cánh cửa" đã được mở cho cả 2 file luôn
- Thử nghiệm tiếp trên 3, 4 file có password, cứ chạy code của siwtom là xem như "mời vào nhà!"
-------------------
Anh đúng là hacker siêu hạng
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái Quá sốc!
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái Quá sốc!
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
Nếu sốc thật thì cũng dể hiểu thôi. Không phải vô cớ mà chuyện đánh tráo hàm này là một trong những món "đặc sản" của hacker và rootkit. Họ là những người rất am tường về system, hiểu cơ cấu và cách thức hoạt động của system nên họ có thể đột nhập vào system để làm mưa làm gió.
Ngay như đột nhập vào một căn nhà có hệ thống cảnh báo chẳng hạn. Người thường thì không biết cách nhưng người am tường thì biết vào đường nào. Cửa chính, phụ? Qua đường hệ thống thông gió? Chỗ nào là điểm yếu của căn nhà? Vào rồi thì do am tường về các hệ thống cảnh báo nên họ biết phải "tắt" cái gì, tắt ở đâu v...v
Còn về "thuật toán" thì đơn giản thôi.
Giả dụ ta có ông A (system Windows) trực. Khi khách hàng gọi điện tới đặt ông sửa ống nước chẳng hạn (process gọi hàm Windows - SuaOngNuoc) thì ông A "đi" tới bảng ghi số điện thoại và đọc số của ông sửa ống nước (mỗi ngày có 1 ông khác với số khác - tương đương với mỗi lần DLL được load vào RAM thì nó nằm ở một địa chỉ khác), sau đó gọi cho ông thợ (nhẩy tới địa chỉ của hàm) và "kích hoạt", "cử" ông thợ đi làm (thực hiện code ở địa chỉ vừa nhẩy tới).
Thế bây giờ nếu ta "lén" sửa lại số điện thoại được ghi trên bảng và thay vào đó ghi số của nhân viên của ta thì sao? Thì ông A sẽ gọi cho nhân viên của ta và "cử" nhân viên củ ta đi làm, thế thôi.
Phát hiện thêm 1 chuyện nữa: Sau khi gọi hết tất cả các Add-Ins của MS lên (đương nhiên mấy Add-Ins này đều có Pass). Sau đó chạy code của siwtom thì toàn bộ các Add-Ins đều "mở cửa" ---> Xem code thoải mái Quá sốc!
----------------
Ẹc... Ẹc... Từ nay thì mấy "chú tào lao" đừng mong mà Pass VBA code gì nữa nhé ---> Nếu siêu thì cứ tạo DLL đi, còn không thôi (có đặt pass của uổng công)
Với cái code này mở nhấp nháy sau cú click (chắc lẹ hơn 3s) mà lại coi tất cả các file đang mở, kể cả addins, ("thấy gúm quá") vậy có thủ tục nào mở file excel bị khóa không? (mà nhanh như vậy càng tốt).
Sẳn đã VBA làm rồi thì làm luôn cái File chắc cũng hỏng sao đâu hen!
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
Hàm Hook này là dạng boolean luôn trả về TRUE khi hoàn tất thủ tục, mở đầu Hook = False và kết thúc hàm là Hook = True
Theo em nghĩ, Khi ta dùng IF HOOK THEN tức là ta đã "gián tiếp" gọi hàm đó, dĩ nhiên nó phải kiểm tra HOOK và từ đó HOOK chạy từ False rồi thực hiện thủ tục, sau cùng trả về TRUE.
Mã:
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long
[COLOR=#ff0000][B]Hook = False[/B][/COLOR]
'........................................
[B][COLOR=#0000cd]Hook = True[/COLOR][/B]
End If
End If
End Function
Hàm Hook này là dạng boolean luôn trả về TRUE khi hoàn tất thủ tục, mở đầu Hook = False và kết thúc hàm là Hook = True
Theo em nghĩ, Khi ta dùng IF HOOK THEN tức là ta đã "gián tiếp" gọi hàm đó, dĩ nhiên nó phải kiểm tra HOOK và từ đó HOOK chạy từ False rồi thực hiện thủ tục, sau cùng trả về TRUE.
Mã:
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long
[COLOR=#ff0000][B]Hook = False[/B][/COLOR]
'........................................
[B][COLOR=#0000cd]Hook = True[/COLOR][/B]
End If
End If
End Function
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
Tầm trình độ của chúng ta thường hay viết khác:
- Viết code cho Sub Hook (chứ không phải Function)
- Dùng 1 biến public chk kiểu Boolean để kiểm tra xem Sub Hook đã chạy hoàn tất chưa
- Xong, viết 1 Sub khác cho gọi sub Hook, đồng thơi kiểm tra biến chk, nếu chk=TRUE thì sẽ làm việc khác
Mã:
Public chk as Boolean
Sub Hook()
If.... gì gì đo then
chk = True
End If
End Sub
Sub Main
Call Hook
If chk then
'Làm việc khac
End If
End Sub
Tuy nhiên, các nhà lập trình chuyên nghiệp thường hay viết kiểu khác: Thay đổi Sub Hook thành Function Hook và Function này trả về giá trị kiểu Boolean luôn.
Vậy nếu code trong Hook hoàn tất thì hàm trả về kết quả = TRUE và ngược lại
Cách này có cái tiện là khỏi cần phải qua biến tạm dạng Public
-------------------
Với HOOK là một hàm trả về giá trị BOOLEAN, còn một đằng khai báo biến HOOK là một BOOLEAN, 2 trường hợp này hoàn toàn khác nhau.
Với hàm HOOK nó có tính Public, còn trong cái SUB của anh, biến HOOK chỉ là chạy "nội tại" mà đã là "nội tại" thì nó sẽ chạy trước, public nó chạy sau nếu nội tại không thỏa, tức chạy hết SUB nó sẽ hết tác dụng khi END SUB. Mặt khác, với HOOK trong SUB của anh nó chưa định giá trị TRUE hoặc FALSE cho nó vì vậy mặc định của biến này luôn là FALSE.
Thí nghiệm như vầy, cũng trên file đó, anh đặt Dim Hook As Boolean ở trên cùng rồi chạy thủ tục dưới đây như sau:
Mã:
[COLOR=#ff0000][B]Dim Hook As Boolean[/B][/COLOR]
'-----------------------------
Sub test()
If Hook Then
MsgBox "VBA Password is Removed!", vbInformation, "Excel Tool"
End If
End Sub
Cho chạy Sub test bảo đảm với anh nó không thông báo gì cả!
Từ thí nghiệm này cho thấy, khi chạy thủ tục, nếu trùng tên Hàm/Sub nó sẽ thông báo lỗi, nếu Hàm trùng tên Biến, nó sẽ xét theo Biến.
Với cái code này mở nhấp nháy sau cú click (chắc lẹ hơn 3s) mà lại coi tất cả các file đang mở, kể cả addins, ("thấy gúm quá") vậy có thủ tục nào mở file excel bị khóa không? (mà nhanh như vậy càng tốt).
Sẳn đã VBA làm rồi thì làm luôn cái File chắc cũng hỏng sao đâu hen!
Thât Bâ't ngo,Tks Bác siwtom nhiêù nhé!
Đúng là khôg có gì là không thê?!
Em nghi bài của Bác Nghĩa chăc là không thê thuc hiên = code dc rôì... vì de chay dc code thì file do' fai ActiveWindow thì code moi hoat dong dươc chú...
Theo em hieu la file chưa nhâpj pás Open thj ActiveWindow vân là Flase thi code chua thêr hoat dông dc dúng không ạ!
Thât Bâ't ngo,Tks Bác siwtom nhiêù nhé!
Đúng là khôg có gì là không thê?!
Em nghi bài của Bác Nghĩa chăc là không thê thuc hiên = code dc rôì... vì de chay dc code thì file do' fai ActiveWindow thì code moi hoat dong dươc chú...
Theo em hieu la file chưa nhâpj pás Open thj ActiveWindow vân là Flase thi code chua thêr hoat dông dc dúng không ạ!
Tôi không chắc chắn lắm, nhưng nếu chọn mở khóa một File Excel nào đó thì sẽ hiện lên một Browser và ta chỉ chọn file Excel cần mở khóa, thông qua đó chạy thủ tục mở khóa thôi, đâu nhất thiết mở khóa khi file đang activate đâu nhỉ?
Mình không hiểu code này gọi hàm (thủ tục) kiểu gì? Đâu thấy call Hook, chỉ là một thông báo!
(Giống kiểu phát ngôn gây "sốc" hoặc là thần chú gì đó?)
Bạn nào giải thích giùm!
Function [COLOR=#ff0000]SheetExist[/COLOR](WorkSheetName As String) [COLOR=#ff0000]As Boolean[/COLOR]
On Error Resume Next
SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Sub Main
If [COLOR=#ff0000]SheetExist("ABC") [/COLOR]then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Em không nghĩ là anh lại thắc mắc chuyện đơn giản này
Ẹc... Ẹc...
Function [COLOR=#ff0000]SheetExist[/COLOR](WorkSheetName As String) [COLOR=#ff0000]As Boolean[/COLOR]
On Error Resume Next
SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Sub Main
If [COLOR=#ff0000]SheetExist("ABC") [/COLOR]then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Em không nghĩ là anh lại thắc mắc chuyện đơn giản này
Ẹc... Ẹc...
Lại hiểu sai ý của mình rồi!
Nếu như trước loạt bài này, muốn viết code Main trên thì mình phải viết là
Mã:
Sub Main()
[COLOR=#ff0000]SheetExist ("ABC") [/COLOR]' Hoac Call SheetExist("ABC")
If SheetExist("ABC") Then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Lại hiểu sai ý của mình rồi!
Nếu như trước loạt bài này, muốn viết code Main trên thì mình phải viết là
Mã:
Sub Main()
[COLOR=#ff0000]SheetExist ("ABC") [/COLOR]' Hoac Call SheetExist("ABC")
If SheetExist("ABC") Then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Anh viết vậy là... quá thừa rồi còn gì SheetExist là 1 Function chứ đâu phải 1 Sub ---> Nếu nó chạy thì nó phải trả về giá trị gì đó và ta phải "nhận" lấy để tính toán xem sẽ làm gì tiếp
Còn cách anh vừa viết là anh đã tự xem SheetExist là 1 Sub (không phải Function) và giá trị trả về của nó anh cũng không thèm đếm xỉa đến luôn....
Dòng đỏ ở trên chẳng biết để làm cái gì nữa, có chăng thì vầy mới hợp lý:
Mã:
Sub Main()
Dim bChk as Boolean
bChk = SheetExist ("ABC")
If bChk Then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Nói cho cùng thì cũng y chang cách em đã viết ở bài 57 thôi
Ẹc... Ẹc... (ngộ hen.. tự nhiên anh lại théc méc rất.. kỳ cục...)
Anh viết vậy là... quá thừa rồi còn gì SheetExist là 1 Function chứ đâu phải 1 Sub ---> Nếu nó chạy thì nó phải trả về giá trị gì đó và ta phải "nhận" lấy để tính toán xem sẽ làm gì tiếp
Còn cách anh vừa viết là anh đã tự xem SheetExist là 1 Sub (không phải Function) và giá trị trả về của nó anh cũng không thèm đếm xỉa đến luôn....
Dòng đỏ ở trên chẳng biết để làm cái gì nữa, có chăng thì vầy mới hợp lý:
Mã:
Sub Main()
Dim bChk as Boolean
bChk = SheetExist ("ABC")
If bChk Then
MsgBox "Sheet 'ABC' này ton tai"
End If
End Sub
Nói cho cùng thì cũng y chang cách em đã viết ở bài 57 thôi
Ẹc... Ẹc... (ngộ hen.. tự nhiên anh lại théc méc rất.. kỳ cục...)