Undocument Windows API và VBA

Liên hệ QC

ThangCuAnh

Mới rờ Ét xeo
Tham gia
1/12/17
Bài viết
896
Được thích
792
Điểm
568
Nơi ở
Phờ lây cu
Giới tính
Nam
Nghề nghiệp
Coder nghỉ hưu, RCE dạo
Cái laptop hư lâu lắc, phải gởi vào thành hồ chứa mưa sữa, mới lấy về.
Nên quay lại tiếp với cái gọi là "rờ chxx em" Windows và VBA.
Topic này tui sẽ đăng lần lượt những gì cu anh tui phát hiện ra trong quá trình "rờ em" Windows API, DLLs và VBAxxx.dll. Các tips, tricks này sẽ bảo đảm không có trên ông "Gấu gồ". Và dùng được cho VBA trên Offices. Chứ "ưn đồ cú mèn" API mà chỉ dùng được cho C/C++, Delphi... thì dân tin học VP ở đây thua.
Tui chỉ sẽ tập trung ở các Windows DLL sau: kernel32.dll, shell32.dll, shlwapi.dll, oleaut32.dll, ole32.dll, advapi32.dll... và 1 ít từ ntdll.dll (core usermode API của Windows). Trên VBExxx.dll thì tui chỉ tập trung vào VBE6 của Office 2007, VBE7 của Office2010 32 và 64bit, các VBExxx.dll khác cũng sẽ gần như tương đượng, không khác nhau mấy.
 
Lần chỉnh sửa cuối:
code đó trên Delphi Mạnh mò hoài ko ra !!!??? thuộc hàng bí mật
 
Upvote 0
Chỉ người trong team họ mới biết chính xác họ làm gì thôi bé. Mình test vầy chỉ là đưa ra kết luận kiểu suy đoán, vì anh chưa "rờ em" thằng Excel với mso.dll, do nó bự quá mà không có pdb symbol nữa.
Bài đã được tự động gộp:

Thế bé đã hiểu hàm DumpMem, DumpString nó làm gì, nhiệm vụ gì chưa vậy ? :)
Bài đã được tự động gộp:

Giờ bé tự test trên máy bé đi, máy bé nhanh mà, tắt multithread, test 1 nhân, 2 nhân, 3 nhân, 4 nhân, rồi bật multithread, test 1 nhân, 2 nhân, 3 nhân, 4 nhân. Phần setting số nhân đó chú úp cái hình rồi.
Bài đã được tự động gộp:

Nói chung là giờ bạn mình chỉ test cái XLL Delphi của bạn mình được chạy trong thread nào của Excel. Chạy trong thread chính GUI thread thì thua, nếu chạy trong Worker thread của nó cũng thua, nhưng thua ít ít, vì các hàm của nó chạy đa nhân.
Nói chung là thua hết, nên phải tìm hiểu kỹ, sâu về multithread trong Delphi, xuống dưới API thật kỹ luôn. Xem Delphi có support parallel,đa nhân không rồi dùng cho tối ưu nhất. Nếu Delphi support GPU thì dùng GPU đua luôn.
Đó là trước mắt muốn ngang nó hoặc may mắn thì hơn nó chút xíu.
Chứ đầu tụi nó toàn thiên tài, có sạn hết. Người bình thường không có cửa qua. Chưa kể mấy cái giấu, undocument của tụi nó nữa. SDK mà còn giấu, xóa bớt đi mà :)

Mấy ngày nay em bận chạy ngoài đường không test mấy cái Jump bô của bác được. Tối vẫn mải miết làm “công trình”, nhưng vấn đề muiltithread trong Excel lại một lần nữa em đang dự là khó ngủ ngon :( .
 
Upvote 0
Già, thấy mệt rồi, kg còn muốn đua thắng thua nữa, mà thấy 99%là thua trắng rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Em ngồi đọc lại máy bài trong mục này giờ mới nghiệm ra được một ít (*%(*%(*%(*%(*%
 
Upvote 0
Nghiệm được gì bé, share chú với
 
Upvote 0
Tối qua say quá, lênGPE nói bậy bạ, sorry bà con nhen. Nay nghỉ làm, lên GPE bà 8 chút cho vui.
Hôm nay và về sau ta sẽ xem:
1. MsgBox của VBA có tricks gì giấu không, làm sao hiển thị được chuỗi Unicode? (Không phải MessageBoxA/W API nhé các bạn)
2. Các hàm ObjPtr, StrPtr, VarPtr thực chất là gì ? Bản chất 1 object của VBA trong bộ nhớ nó "như thế lào". Variant thì ta đã có hàm DumpVariant dùng DumpMem để xem trong ruột Variant là gì rồi.
3. Code VBA của ta sau khi được biên dịch ra mã máy sẽ chạy trong thread nào, thread của VBEx.dll (đã được Excel cha sinh ra cho) hay được VBA sinh ra thread mới cho ta chạy riêng, và khi ta debug code từng bước, code ta chạy trong thread nào ?
4. Implement hàm TypeName sau khi đã "rờ em" nó = chính VBA và API. Hì hì, chứ thuần VBA không thì thua.
5. Làm sao gọi con trỏ hàm stdcall API trong VBA. Với hàm khác stdcall như _cdecl thì thua, bó tay, phải dùng cách 6. Chứ với stdcall trên Win32 thì được, ta sẽ gọi từ VBA ra sao, chỉ cần gọi được các hàm có 1, 2 và 3 tham số.
Vd trên VBA ta đã GetProcAddress được 1 hàm, làm sao call nó luôn.
Cách này tựa tựa như cơ chế, struct VBDllFunctionCall của VB/VBA.
Trên Win64 thì không còn khái niệm stdcall, fastcall, cdecl... call ciếc gì linh tinh nữa. Tất cả về chỉ 1 kiểu gọi duy nhất, register call. Thanks MS, Intel và AMD :)
6. Cách gọi 1 array of byte của VBA chứa mã ASM trực tiếp ra sao ? Vd: push ebp, mov ebp, esp huyền thoại = 55 8B EC, mov edi, edi tại đầu hàm bất kỳ hàm API nào của MS = 8B FF. Mấy thằng hacker, virus quờ rai tơ, ex pờ loi ter hay chơi trò tà đạo này.
7. Dài hơi hơn, rờ ngược lên trên Excel.exe và mso.dll, xem có gì hay không :p
8... Còn gì nữa ta, bà con góp ý nhé.

Nói chung là hay dùng nhiều, vd MsgBox (rtcMsgBox), mà quên để ý nó như thế lào ?
Bài đã được tự động gộp:

Cứ ghim cái này ở đây cho dễ tra, bà con dùng DumpVariant thấy 2 byte đầu tiên là chính là cái enum này:
Mã:
FFFFFFFF ; enum VARENUM, copyof_712
FFFFFFFF VT_EMPTY  = 0
FFFFFFFF VT_NULL  = 1
FFFFFFFF VT_I2    = 2
FFFFFFFF VT_I4    = 3
FFFFFFFF VT_R4    = 4
FFFFFFFF VT_R8    = 5
FFFFFFFF VT_CY    = 6
FFFFFFFF VT_DATE  = 7
FFFFFFFF VT_BSTR  = 8
FFFFFFFF VT_DISPATCH  = 9
FFFFFFFF VT_ERROR  = 0Ah
FFFFFFFF VT_BOOL  = 0Bh
FFFFFFFF VT_VARIANT  = 0Ch
FFFFFFFF VT_UNKNOWN  = 0Dh
FFFFFFFF VT_DECIMAL  = 0Eh
FFFFFFFF VT_I1    = 10h
FFFFFFFF VT_UI1   = 11h
FFFFFFFF VT_UI2   = 12h
FFFFFFFF VT_UI4   = 13h
FFFFFFFF VT_I8    = 14h
FFFFFFFF VT_UI8   = 15h
FFFFFFFF VT_INT   = 16h
FFFFFFFF VT_UINT  = 17h
FFFFFFFF VT_VOID  = 18h
FFFFFFFF VT_HRESULT  = 19h
FFFFFFFF VT_PTR   = 1Ah
FFFFFFFF VT_SAFEARRAY  = 1Bh
FFFFFFFF VT_CARRAY  = 1Ch
FFFFFFFF VT_USERDEFINED  = 1Dh
FFFFFFFF VT_LPSTR  = 1Eh
FFFFFFFF VT_LPWSTR  = 1Fh
FFFFFFFF VT_RECORD  = 24h
FFFFFFFF VT_INT_PTR  = 25h
FFFFFFFF VT_UINT_PTR  = 26h
FFFFFFFF VT_FILETIME  = 40h
FFFFFFFF VT_BLOB  = 41h
FFFFFFFF VT_STREAM  = 42h
FFFFFFFF VT_STORAGE  = 43h
FFFFFFFF VT_STREAMED_OBJECT  = 44h
FFFFFFFF VT_STORED_OBJECT  = 45h
FFFFFFFF VT_BLOB_OBJECT  = 46h
FFFFFFFF VT_CF    = 47h
FFFFFFFF VT_CLSID  = 48h
FFFFFFFF VT_VERSIONED_STREAM  = 49h
FFFFFFFF VT_BSTR_BLOB  = 0FFFh
FFFFFFFF VT_ILLEGALMASKED  = 0FFFh
FFFFFFFF VT_TYPEMASK  = 0FFFh
FFFFFFFF VT_VECTOR  = 1000h
FFFFFFFF VT_ARRAY  = 2000h
FFFFFFFF VT_BYREF  = 4000h
FFFFFFFF VT_RESERVED  = 8000h
FFFFFFFF VT_ILLEGAL  = 0FFFFh
 
Lần chỉnh sửa cuối:
Upvote 0
Đụng cái bốp vào đá rồi, ITypeInfo GetDocumentation method đòi 5 tham số lận, hu hu hu :(
Để "rờ" lại thằng rtcTypeName của VBA có đúng nó dùng ITypeInfo không !
 

File đính kèm

  • 1.png
    1.png
    9.8 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, sorry bà con, lanh chanh đoản, chuỗi của ta xuống tới rtcMsgBox vẫn còn "Jin", nguyên bản, nhưng vào sâu bên trong thì bị convert mất. Khúc đầu không phải lỗi của VBA :)
MsgBox -> xyx -> rtcMsgBox -> xyz -> W2MBCS -> MessageBoxIndirectA.
Vậy nên kết thúc MsgBox, rtcMsgBox ở đây, không có cách nào dùng nó hiển thị chuỗi Unicode có dấu được. Bà con phải dùng cái khác như call trực tiếp API MessageBoxW(StrPtr(xxx),...) hay mấy cái shell siếc gì đó linh tinh.
Có cái message box thôi mà rtcMsgBox làm gì mà khủng khiếp quá.
 

File đính kèm

  • 1.png
    1.png
    20.1 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
mấy cái lọ mọ tò mò này Mạnh cũng ham lắm mà coi tới lui ko biết chi luôn ... nên ko biết chi mà tám cho vui vẻ cả
 
Upvote 0
Upvote 0
@ThangCuAnh anh có thể check giùm em cái is nothing được không. Em làm đủ kiểu trong delphi mà không được.
 
Upvote 0
Diễn đàn GPE em thấy được mấy anh cũng rành Memory, buff,,,,,,,, mà cũng lạ là chưa thấy mấy ảnh Comment nhỉ ===\. ===\. ===\. ===\. ===\. ===\.

Lĩnh vực IT có nhiều lắm, mỗi người chuyên riêng. Nhưng món debug memory rồi “rờ e” như bác TQN đang làm trên là của hiếm đấy bạn bạn nha.
 
Upvote 0
Lĩnh vực IT có nhiều lắm, mỗi người chuyên riêng. Nhưng món debug memory rồi “rờ e” như bác TQN đang làm trên là của hiếm đấy bạn bạn nha.
Em chưa hiểu rờ e Là gì
TQN ?
Mà em thấy ảnh debug memory, rồi dịch code dll là em thấy quá siêu rồi
 
Upvote 0
Kg chịu xem kỹ cái hình bên kia, khi nào thì nó trả về "Nothing", khi nào là "Object", khi nào là name thật
 
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, nghe hỏi mình mới sực nhớ. Trước giờ cứ nghĩ VBA có hàm IsNothing, giờ xem lại hổng có có :) rtcIsNothing cũng hổng có luôn. Chỉ có statement Is Nothing. Thế nó là cái gì. Lò mò xem vào phần parse code VBA của người dùng, mình mới ngã ngữa, những cái select case (switch case...) khổng lồ, cái nào cũng 6, 7 ngàn case :p
X Is Nothing được parse và nhảy tới hàm _lblEx_LitNothing, nằm trong 1 bảng có tên là tblByteDisp, 400 phần tử.
"Rờ em" VBEx.dll học được rất nhiều điều hay từ MS coder, nhưng cũng kèm theo đó là thất vọng về sự vất vã, nặng nề, chậm chạp của VBA :(
 
Upvote 0
Web KT
Back
Top Bottom