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 (2 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
272
Được thích
242
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)?
 

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

Back
Top Bottom