Một Vấn Đề Với Ứng Dụng NetEase Bubble - nói dối e blog

Một Vấn Đề Với Ứng Dụng NetEase Bubble

Một vấn đề khó chịu với ứng dụng POPO của NetEase
Lâu nay, tôi luôn cảm thấy bực bội với một thiết lập cố hữu trong POPO. Dù tôi đã đặt Opera làm trình duyệt mặc định, mỗi khi nhấn vào đường link trong khung soạn thảo của POPO, hệ thống vẫn cố chấp mở bằng Internet Explorer (IE). Nhóm phát triển POPO dường như chỉ tập trung hoàn toàn vào phiên bản POPO 2006 mới, mà bỏ bê những người dùng phiên bản cũ như POPO 2004. Dù tôi đã nhiều lần góp ý, họ vẫn không chịu khắc phục triệt để. Thậm chí, ngoài IE ra, họ chỉ quan tâm đến việc Firefox có hoạt động được hay không. Là một người yêu mến Opera, tôi cảm thấy vô cùng thất vọng và đành tự mình tìm cách “tự xử” để giải quyết vấn đề này.

Đầu tiên, tôi tiến hành phân rã mã nguồn của file popo.exe và tìm kiếm các đoạn mã liên quan. Tôi phát hiện một đoạn code dường như xử lý việc nhấp URL, nhưng việc vá lỗi bằng patch không mang lại hiệu quả. Sau đó tôi mới nhận ra đoạn mã này chỉ dùng để xử lý các URL hiển thị trên giao diện chính của POPO. Tôi tiếp tục dùng lệnh grep để kiểm tra các file DLL liên quan và phát hiện ra rằng giao diện soạn thảo được điều khiển bởi ExtraEditor.dll. Khi phân tích sâu hơn, tôi tìm thấy một đoạn mã trong DLL này gần như giống hệt đoạn mã trong popo.exe về mặt cấu trúc nhị phân.

Điều này khiến tôi cảm thấy khá sốc. Cá nhân tôi luôn phản đối việc sao chép nguyên xi đoạn mã từ nơi khác (copy-paste), vì đây là biểu hiện của một thiết kế thiếu chuyên nghiệp. Đặc biệt hơn, trong ExtraEditor.dll còn chứa thông tin PDB - dấu hiệu cho thấy đây là phiên bản debug mà các nhà phát triển chưa hoàn toàn yên tâm khi phát hành (._.!). Nhờ đó, tôi đã xác định được tên hàm quan trọng:
CExtraEdWnd::IsUsingIEAsHttpBrowser

Tên hàm này ngụ ý rằng nó được dùng để kiểm tra xem trình duyệt mặc định của hệ thống có phải là IE hay không. Khi phân tích cách thức hoạt động, tôi thấy nó sử dụng phương pháp đọc dữ liệu từ registry và một số kỹ thuật khác. Tuy nhiên, cách triển khai này không thực sự chuẩn xác. Dù tôi đã thiết lập Opera làm trình duyệt mặc định, hàm này vẫn cứng nhắc khẳng định rằng tôi đang ưu tiên sử dụng IE.

Khi hệ thống xác định rằng IE là trình duyệt mặc định, POPO sẽ dùng lệnh ShellExecute để bắt buộc khởi động iexplore.exe mở đường link. Ngược lại, nếu không phải IE, tên trình duyệt sẽ không được chỉ định, và hệ thống sẽ dùng trình duyệt mặc định thông thường.

Tôi đã chất vấn nhóm phát triển POPO về thiết lập kỳ lạ này. Câu trả lời họ đưa ra là: Nếu dùng ShellExecute trực tiếp mở URL, khi người dùng đang dùng IE, trang mới sẽ mở đè lên cửa sổ IE đang chạy, làm mất nội dung người dùng đang xem. Trong khi đó, việc chỉ định cụ thể iexplore.exe sẽ mở một cửa sổ mới mà không ảnh hưởng đến cửa sổ hiện tại.

Tôi hoàn toàn không đồng tình với cách giải quyết “chữa cháy” kiểu này. Tuy nhiên, dù biết vậy, tôi cũng không nghĩ ra được phương pháp tối ưu hơn. Vì bản thân tôi cũng không dùng IE, tôi quyết định can thiệp sâu vào hệ thống để vô hiệu hóa thiết lập bắt buộc này, buộc POPO phải tuân thủ trình duyệt mặc định do tôi thiết lập.

Phương pháp thực hiện vô cùng đơn giản: Chỉ cần mở file ExtraEditor.dll và thay đổi giá trị byte tại địa chỉ offset 0x00048FBE từ 0xEB thành 0x74 là xong :)

P/s: Tôi đã kiểm tra lại cài đặt của IE và phát hiện ra rằng việc có mở đè lên cửa sổ hiện tại hay không thực chất là do người dùng tự quyết định thông qua tùy chọn “Mở cửa sổ mới cho các phím tắt” trong phần “Tùy chọn Internet - Tab Nâng cao” (thường là mục thứ ba từ dưới lên). Điều kỳ lạ là, dù đa số người dùng đều muốn mở cửa sổ mới khi dùng ShellExecute, tùy chọn này lại mặc định được bật và chìm nghỉm trong biển tùy chọn phức tạp, khiến nhiều người không hề hay biết.

0%