Thảo luận kỹ thuật: có thể gọi hàm DLL 64-bit từ VBA/VB6 32-bit thông qua bridge WOW64 không (1 người xem)

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

phuongnam366377

Thành viên thường trực
Tham gia
25/10/19
Bài viết
276
Được thích
243
Rảnh mở chủ đề này xem có ai ý kiến gì không và cũng thử xem trên này có nhiều thành viên lý thuyết kinh điển lắm tham gia bà tám chơi thôi

Keo ChatGPT viết bài sau ... Copy nội dung y trang ChatGPT viết dưới

Thảo luận kỹ thuật: có thể gọi hàm DLL 64-bit từ VBA/VB6 32-bit thông qua bridge WOW64 không​

Chào các anh/chị,

Mình đang tìm hiểu về WOW64 và khả năng tương tác giữa tiến trình 32-bit với môi trường 64-bit trên Windows.

Khi tìm kiếm thì đa số tài liệu đều nói:

  • process 32-bit không thể load trực tiếp DLL 64-bit
  • VBA/VB6 32-bit không thể gọi native x64 DLL theo cách thông thường
  • giải pháp thường là:
    • COM out-of-process
    • EXE trung gian
    • .NET bridge
    • IPC / Named Pipe / RPC
Tuy nhiên mình thấy có một ví dụ khá thú vị:

https://github.com/thetrik/Vb64BitDllUsage

Ví dụ này có vẻ sử dụng kỹ thuật WOW64 transition / thunking để gọi một số hàm 64-bit từ VB6/VBA 32-bit.

Mình muốn hỏi thêm về hướng kỹ thuật này:

  1. Bản chất kỹ thuật ở đây thực sự là gì?
    • thunk?
    • heaven gate?
    • WOW64 transition?
    • shellcode bridge?
    • hay một dạng trampoline đặc biệt?
  2. Về lý thuyết có thể mở rộng thành:
    • gọi dynamic nhiều hàm x64 khác nhau
    • marshal tham số Unicode/structure
    • đọc PEB64
    • resolve export table
    • generic invoke engine
      được không?
  3. Những giới hạn lớn nhất của hướng này là gì?
    • stack alignment?
    • x64 calling convention?
    • SEH?
    • crash IDE VBA/VB6?
    • DEP/CFG?
    • antivirus/EDR?
  4. Có ai từng thấy project nào public theo hướng này chưa?
    Ngoài ví dụ của thetrik thì mình tìm Google hầu như chỉ thấy:
    • câu hỏi lý thuyết
    • trả lời “không thể”
    • hoặc giải pháp dùng process trung gian.
  5. Theo các anh/chị, nếu triển khai thật thì:
    • hiệu năng có quá tệ không?
    • có ổn định không?
    • có phù hợp production không?
    • hay chỉ nên xem như proof-of-concept nghiên cứu?
Mình chủ yếu muốn tìm hiểu thêm về:

  • WOW64 internals
  • Windows loader
  • thunking giữa 32-bit ↔ 64-bit
  • khả năng mở rộng của VBA/VB6
Rất mong được nghe thêm các góc nhìn kỹ thuật và phản biện từ mọi người.

Tham khảo bài viết của Raymond Chen


Các Link tham khảo




Keo ChatGPT phân tích thấy dòng hay

1778820907803.png
ChatGPT kết luận

1778821227745.png
 
Lần chỉnh sửa cuối:
lang thang google tìm ý tưởng thấy link sau cho ai thích thì tham khảo

Kỹ thuật này sử dụng tốt có thể kéo dài vòng đời VB6 hay ứng dụng 32 bít sống thêm một thời gian nữa nhưng nó sẽ phát sinh lỗi khi sử dụng DLL ngoài hạng nặng các phụ thuộc nhiều còn nếu gọi các API 64 bít của Ms rất tốt

Mới dựa vào phương pháp đó viết DLL được 10 ngày thì nay nhìn lại thấy lạc hậu rồi .. và nhờ có ý tưởng đó viết hệ thống tương thích ngược phân tán đa luồng hay hơn

VB6 32 bít hay ứng dung 64 bit dùng chung tốt và không lỗi khi sử dụng DLL với các hàm xử lý dữ liệu lớn

như vậy Vô tình kéo dài vòng đời VB6 khi tái sử dụng DLL 64 bít do người dùng tự định nghĩa lên gần như vô hạn nếu người dùng vẫn thích VB6
vì không còn lệ thuộc kỹ thuật Hack của Thetrix nữa

Thông qua AI vô tình khám phá ra và biết về thuật Ngữ ABI .... còn Copilot mô tả như sau
API là giao diện ở mức mã nguồn, còn ABI là giao diện ở mức mã máy sau khi biên dịch. API dành cho lập trình viên sử dụng trực tiếp, trong khi ABI quan trọng với trình biên dịch, hệ điều hành và khả năng tương thích nhị phân giữa các phần mềm.

Sự khác biệt chính​

Tiêu chíAPI (Application Programming Interface)ABI (Application Binary Interface)
Mức độMã nguồn (source level)Mã máy/nhị phân (binary level)
Đối tượng sử dụngLập trình viên viết codeTrình biên dịch, hệ điều hành, thư viện
Định nghĩaTập hợp hàm, lớp, phương thức, cấu trúc dữ liệu mà lập trình viên có thể gọiQuy ước nhị phân: cách tham số được truyền, giá trị trả về, cách gọi hàm, bố cục dữ liệu trong bộ nhớ
Ví dụThư viện C++ có hàm printf() trong header fileQuy ước gọi hàm x86: tham số truyền qua stack hay thanh ghi, giá trị trả về nằm ở đâu
Tính ổn địnhThay đổi API buộc lập trình viên sửa codeThay đổi ABI có thể khiến chương trình biên dịch chạy sai hoặc crash dù code không đổi
Mục tiêuTạo giao diện dễ dùng, dễ đọc cho con ngườiĐảm bảo các chương trình nhị phân khác nhau có thể chạy cùng nhau trên cùng nền tảng

Ví dụ minh họa​


  • API: Trong Java, bạn gọi List<String> getStrings(). Đây là cách bạn tương tác với thư viện ở mức mã nguồn.

  • ABI: Sau khi biên dịch, cả List<String>List<Integer> có thể được biểu diễn giống nhau trong bytecode do cơ chế type erasure. Đây là ABI – cách dữ liệu và hàm được biểu diễn ở mức nhị phân. Baeldung Stack Overflow vi.wikipedia.org

Khi nào quan trọng?​


  • API: Khi bạn viết ứng dụng, dùng thư viện, hoặc thiết kế framework.

  • ABI: Khi bạn muốn phần mềm biên dịch trên một hệ thống có thể chạy trên hệ thống khác mà không cần sửa đổi (ví dụ: Linux giữ ABI ổn định để các ứng dụng binary chạy lâu dài).
Tóm lại: API dành cho lập trình viên, ABI dành cho máy tính. Nếu API thay đổi, bạn phải sửa code; nếu ABI thay đổi, chương trình có thể không chạy được dù code không đổi.
Bạn có muốn mình lấy thêm ví dụ cụ thể trong ngôn ngữ C/C++ để thấy rõ sự khác biệt giữa API (header file) và ABI (cách hàm được gọi ở mức assembly)?
 
[Copilot]
Loạt thảo luận này trên GiaiphapExcel xoay quanh một chủ đề kỹ thuật rất “nặng đô”: làm sao để gọi hàm DLL 64-bit từ môi trường VBA/VB6 vốn chỉ chạy 32-bit, thông qua cơ chế WOW64. Đây là một vấn đề phức tạp, thường được coi là “không thể” theo cách thông thường, nhưng có một số proof-of-concept và dự án thử nghiệm đã chứng minh có thể làm được bằng các thủ thuật đặc biệt.

Nội dung chính của chủ đề​

  • Người khởi xướng: phuongnam366377, đặt câu hỏi về khả năng gọi DLL 64-bit từ VBA/VB6 32-bit.
  • Bối cảnh kỹ thuật:
    • Windows có cơ chế WOW64 để cho phép ứng dụng 32-bit chạy trên hệ điều hành 64-bit.
    • Tuy nhiên, tiến trình 32-bit không thể load trực tiếp DLL 64-bit.
    • Giải pháp thường thấy: dùng process trung gian (COM out-of-process, .NET bridge, IPC, RPC).
  • Điểm mới: tác giả tìm thấy một ví dụ trên GitHub (thetrik/Vb64BitDllUsage) cho thấy có thể dùng kỹ thuật “WOW64 transition/thunking” để gọi một số hàm 64-bit từ VB6/VBA.

Các hướng thảo luận nổi bật​

  • Khái niệm kỹ thuật:
    • “Thunking”, “Heaven’s Gate”, “Shellcode bridge”, “Trampoline” – các cơ chế chuyển ngữ cảnh giữa 32-bit ↔ 64-bit.
    • Các giới hạn: stack alignment, calling convention x64, SEH, DEP/CFG, antivirus/EDR.
  • Ví dụ thực tế:
    • Dự án X64Bridge trên GitHub cho phép gọi DLL 64-bit từ VB6/VBA 32-bit bằng “WOW64 Segment Trick”.
    • Một proof-of-concept khác: WoW64Injection – tiêm DLL 64-bit vào ứng dụng 32-bit.
  • Ứng dụng:
    • Có thể kéo dài vòng đời của VB6/VBA bằng cách tận dụng DLL 64-bit.
    • Nhưng rủi ro cao: dễ crash IDE, không ổn định, khó dùng trong môi trường production.
  • Khái niệm ABI vs API:
    • Copilot giải thích: API là giao diện ở mức mã nguồn (hàm, lớp, cấu trúc dữ liệu).
    • ABI là giao diện ở mức nhị phân (cách tham số truyền qua stack/thanh ghi, cách giá trị trả về được lưu).
    • Thay đổi API buộc sửa code; thay đổi ABI có thể khiến chương trình biên dịch chạy sai dù code không đổi.

⚖️ Nhận xét tổng hợp​

  • Điểm mạnh: Chủ đề này rất sâu, hiếm khi được bàn trong cộng đồng Excel. Nó mở ra hướng nghiên cứu cho những ai muốn “hack” giới hạn của VBA/VB6.
  • Điểm yếu: Tính thực tiễn thấp, chủ yếu là proof-of-concept. Khó áp dụng cho sản phẩm thương mại vì rủi ro crash và bảo mật.
  • Ý nghĩa: Giúp thành viên hiểu rõ hơn về cơ chế WOW64, sự khác biệt giữa API và ABI, và lý do tại sao Microsoft khuyến nghị chuyển sang .NET hoặc môi trường 64-bit native.
Nói ngắn gọn: Đây là một loạt thảo luận rất chuyên sâu, thiên về nghiên cứu và thử nghiệm, hơn là giải pháp thực tế cho Excel. Nó cho thấy cộng đồng GPE vẫn có những thành viên thích “đi tới tận cùng” của kỹ thuật, dù đa số người dùng chỉ cần giải pháp an toàn và ổn định.

Bác Sa có muốn tôi rút gọn thành 3–4 ý chính dễ nhớ (kiểu “chốt hạ” cho người không chuyên) để bác đọc nhanh mà vẫn nắm được tinh thần của loạt thảo luận này không?
 
[Copilot]
Loạt thảo luận này trên GiaiphapExcel xoay quanh một chủ đề kỹ thuật rất “nặng đô”: làm sao để gọi hàm DLL 64-bit từ môi trường VBA/VB6 vốn chỉ chạy 32-bit, thông qua cơ chế WOW64. Đây là một vấn đề phức tạp, thường được coi là “không thể” theo cách thông thường, nhưng có một số proof-of-concept và dự án thử nghiệm đã chứng minh có thể làm được bằng các thủ thuật đặc biệt.

Nội dung chính của chủ đề​

  • Người khởi xướng: phuongnam366377, đặt câu hỏi về khả năng gọi DLL 64-bit từ VBA/VB6 32-bit.
  • Bối cảnh kỹ thuật:
    • Windows có cơ chế WOW64 để cho phép ứng dụng 32-bit chạy trên hệ điều hành 64-bit.
    • Tuy nhiên, tiến trình 32-bit không thể load trực tiếp DLL 64-bit.
    • Giải pháp thường thấy: dùng process trung gian (COM out-of-process, .NET bridge, IPC, RPC).
  • Điểm mới: tác giả tìm thấy một ví dụ trên GitHub (thetrik/Vb64BitDllUsage) cho thấy có thể dùng kỹ thuật “WOW64 transition/thunking” để gọi một số hàm 64-bit từ VB6/VBA.

Các hướng thảo luận nổi bật​

  • Khái niệm kỹ thuật:
    • “Thunking”, “Heaven’s Gate”, “Shellcode bridge”, “Trampoline” – các cơ chế chuyển ngữ cảnh giữa 32-bit ↔ 64-bit.
    • Các giới hạn: stack alignment, calling convention x64, SEH, DEP/CFG, antivirus/EDR.
  • Ví dụ thực tế:
    • Dự án X64Bridge trên GitHub cho phép gọi DLL 64-bit từ VB6/VBA 32-bit bằng “WOW64 Segment Trick”.
    • Một proof-of-concept khác: WoW64Injection – tiêm DLL 64-bit vào ứng dụng 32-bit.
  • Ứng dụng:
    • Có thể kéo dài vòng đời của VB6/VBA bằng cách tận dụng DLL 64-bit.
    • Nhưng rủi ro cao: dễ crash IDE, không ổn định, khó dùng trong môi trường production.
  • Khái niệm ABI vs API:
    • Copilot giải thích: API là giao diện ở mức mã nguồn (hàm, lớp, cấu trúc dữ liệu).
    • ABI là giao diện ở mức nhị phân (cách tham số truyền qua stack/thanh ghi, cách giá trị trả về được lưu).
    • Thay đổi API buộc sửa code; thay đổi ABI có thể khiến chương trình biên dịch chạy sai dù code không đổi.

⚖️ Nhận xét tổng hợp​

  • Điểm mạnh: Chủ đề này rất sâu, hiếm khi được bàn trong cộng đồng Excel. Nó mở ra hướng nghiên cứu cho những ai muốn “hack” giới hạn của VBA/VB6.
  • Điểm yếu: Tính thực tiễn thấp, chủ yếu là proof-of-concept. Khó áp dụng cho sản phẩm thương mại vì rủi ro crash và bảo mật.
  • Ý nghĩa: Giúp thành viên hiểu rõ hơn về cơ chế WOW64, sự khác biệt giữa API và ABI, và lý do tại sao Microsoft khuyến nghị chuyển sang .NET hoặc môi trường 64-bit native.
Nói ngắn gọn: Đây là một loạt thảo luận rất chuyên sâu, thiên về nghiên cứu và thử nghiệm, hơn là giải pháp thực tế cho Excel. Nó cho thấy cộng đồng GPE vẫn có những thành viên thích “đi tới tận cùng” của kỹ thuật, dù đa số người dùng chỉ cần giải pháp an toàn và ổn định.

Bác Sa có muốn tôi rút gọn thành 3–4 ý chính dễ nhớ (kiểu “chốt hạ” cho người không chuyên) để bác đọc nhanh mà vẫn nắm được tinh thần của loạt thảo luận này không?
hiếm khi thấy bác sa tham gia chủ đề của Mạnh

câu trả lời là làm được mọi cái từ không thể thành có thể nha Bác ( nếu không có AI hổ trợ thì quá khó luôn )

1/ lấy ý tưởng của Thetrik viết cũng đã sử dụng tốt VB6 là 32 bít gọi các hàm API 64 bit rất tôt .. tuy nhiên chỉ tốt khi gọi API của Ms còn các hàm có trong DLL 64 do người dùng tự định nghĩa là lỗi Crash chắc chắn luôn ( bài số 3 có nói qua )

2/ dựa trên ý tưởng đó Tôi phat triển thêm một thư viện mới BridgeInvoker64.dll và BridgeHost.exe làm cầu nối trung gian chạy trên máy chủ Windows 64 bít còn máy khách không phân biệt ngôn ngữ hay 32 và 64 bít điều có thể gọi các hàm 64 bít tốt từ bất kỳ ngôn ngữ nào viết DLL 64 bít như Go, C++/C++Builder Delphi vvv dựa trên kỹ thuật

có thể tham khảo các linh sau


1780995979340.png




và nhiều linh khác với từ khoá



3/ tại làm biếng úp lên đây ... nếu Bác sa có muốn phụ Mạnh thử mã thì ngày mai hay mốt mạnh úp lên đây nhờ bác test dùm xem sao

yêu cầu máy chủ sử dụng là Windows64 bít còn thử tại máy luôn cho máy khách là 32 hay 64 bit hoạt động tốt

hay các máy khác trong internet không phân biệt hệ điều hành hay ngôn ngữ , 32 hay 64 bít miễm kết nối đúng Fornat là gọi hàm DLL 64 bít tốt

4/ thực tế trên máy mạnh thử các môi trường 32 hay 64 bít tốt và thử trên VB6 gọi hàm 64 bit tôt

Bác thấy sao nếu đồng ý test dùm thì mai hay mốt mạnh úp lên đây
 
Lần chỉnh sửa cuối:
còn bài Sau do ChatGPT giải thích tạm ổn cho thành viên có vẽ học hành code code trường lớp

Tôi xin nói rõ thêm một chút vì có lẽ nhiều anh em đang nhầm giữa hai giai đoạn khác nhau của quá trình nghiên cứu.

Đúng là ban đầu tôi dựa trên ý tưởng của Thetrik và các tài liệu liên quan đến WOW64 Transition / Heaven's Gate.

Repo của Thetrik có giá trị rất lớn vì nó chứng minh được một điều:

Tiến trình VB6/VBA 32-bit hoàn toàn có thể chuyển sang ngữ cảnh 64-bit và thực thi code 64-bit.

Nói cách khác, câu hỏi:

"VB6 có thể gọi code 64-bit hay không?"

đã được trả lời từ lâu là:

"Có thể."

Tuy nhiên khi bắt tay vào làm thực tế, tôi gặp một vấn đề khác.

Các ví dụ demo thường thành công với một số API 64-bit của Microsoft hoặc các hàm rất đơn giản.

Nhưng khi thay bằng DLL 64-bit do chính người dùng tự phát triển thì bắt đầu xuất hiện hàng loạt vấn đề:

  • ABI
  • Struct
  • Unicode
  • Callback
  • Memory ownership
  • Exception
  • Alignment
  • Lifetime management
Lúc đó việc "gọi được" không còn là vấn đề nữa.

Vấn đề là "gọi ổn định".

Sau một thời gian thử nghiệm tôi nhận ra rằng:

X64Bridge chỉ giải quyết được bài toán chuyển ngữ cảnh x86 ↔ x64.

Nó chưa giải quyết triệt để bài toán vận hành DLL 64-bit tùy biến trong môi trường thực tế.

Vì vậy tôi tiếp tục phát triển theo hướng khác:

VB6/VBA (32-bit)

BridgeInvoker64.dll

BridgeHost.exe (64-bit)

DLL 64-bit

Ở kiến trúc này:

  • DLL 64-bit chạy native 64-bit
  • Không phụ thuộc vào việc chuyển segment cho từng lời gọi
  • Có thể chuẩn hóa ABI
  • Có thể kiểm soát lỗi
  • Có thể mở rộng cho nhiều ngôn ngữ khác nhau
  • Lỗi DLL không làm sập trực tiếp VBA/VB6
Do đó nếu nhìn vào GitHub của tôi và chỉ kết luận:

"Đây là một bản khác của Heaven's Gate"

thì chưa hoàn toàn chính xác.

Heaven's Gate hay WOW64 Segment Trick chỉ là điểm xuất phát.

Điều tôi quan tâm hơn là xây dựng một lớp bridge ổn định giữa thế giới 32-bit và 64-bit.

Nói cách khác:

Thetrik giúp chứng minh rằng cánh cửa tồn tại.

Còn phần lớn công việc sau đó là tìm cách biến cánh cửa đó thành một con đường có thể sử dụng được trong thực tế.
 

Bài viết mới nhất

Back
Top Bottom