Trang 2 trên tổng số 3 Đầu tiênĐầu tiên 123 Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 28 kết quả

Đề tài: Tìm Handle của cửa sổ tắt máy trên Windows như thế nào?

  1. #11
    No Avatar
    ngocbig Khách

    Mặc định Tìm Handle của cửa sổ tắt máy trên Windows như thế nào?

    Xem thêm thì mình phát hiện ra rằng cái "form" mà NVD có nhắc tới là một cửa sổ có tên class là "DimmedWindowClass". Khi click chọn Turn off computer thì cửa sổ này sẽ hiện ra che toàn bộ màn hình đồng thời capture cái screen hiện tại, sau đó hiện ra cái Dialog Turn Off Computer. Code bên dưới của mình làm cho cái cửa sổ Dimmed đó phải hiện nguyên hình.
    C++ Code:
    1. #include <iostream>
    2. #include <Windows.h>
    3.  
    4. int main()
    5. {
    6.     HWND hwnd;
    7.     RECT r,wndRect;
    8.     POINT p;
    9.     int i=20,width;
    10.     while (i>0)
    11.     {
    12.         GetCursorPos(&p);
    13.         hwnd = WindowFromPoint(p);
    14.         GetClientRect(hwnd,&r);
    15.         GetWindowRect(hwnd,&wndRect);
    16.         width=(r.right-r.left);
    17.         std::cout<<"hwnd:"<<(int)hwnd
    18.             <<" - width:"<<width<<std::endl;       
    19.         if(width==312)break;
    20.         i--;
    21.         Sleep(500);
    22.     }
    23.     if(i)
    24.     {
    25.         HWND hParent = GetParent(hwnd);
    26.         SetWindowLong(hParent,GWL_STYLE,WS_OVERLAPPEDWINDOW|WS_VISIBLE);
    27.         UpdateWindow(hParent);
    28.         SetWindowPos(hParent,
    29.             HWND_TOPMOST,
    30.             0,
    31.             0,
    32.             400,
    33.             100,
    34.             SWP_NOMOVE);
    35.         SetWindowLong(hwnd,GWL_STYLE,WS_OVERLAPPEDWINDOW|WS_VISIBLE);
    36.         UpdateWindow(hwnd);
    37.         SetWindowPos(hwnd,
    38.             HWND_TOPMOST,
    39.             wndRect.left,
    40.             wndRect.top,
    41.             wndRect.right-wndRect.left,
    42.             wndRect.bottom-wndRect.top+30,
    43.             SWP_NOMOVE);
    44.     }
    45.  
    46.     return 0;
    47. }

  2. #12
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Thế ra mình cũng có tài tiên đoán phết nhỉ .
    Phá toái hư không - Bạch nhật thăng thiên.

  3. #13
    No Avatar
    ngocbig Khách

    Lúc đầu em cứ nghĩ là cái dialog đó không có parent, và thấy cách Windows làm cho nền xám dần thấy pro quá. Thấy bác nói em mới nghĩ lại

    Cám ơn tài tiên tri của bác nha!

  4. #14
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Tui đã code xong 1 app nhỏ, liên tục dùng FindWindow để tìm ra window "Turn off computer", disable window đó. Nhưng thấy cách này lụi quá, nên giờ đang ngồi RE msgina.dll của Windows.
    Trên máy tui, WinXP SP3, resource dialog của "Turn off computer" nằm trong thư viện msgina.dll này. ID = 20100.
    Sơ bộ RE thì thấy dialog shutdown được show ra khi hàm undocument trong msgina.dll ShellShutdownDialog được gọi.
    Các bạn thử với cmdline sau: rundll32 msgina.dll, ShellShutdownDialog.
    Tiếp tục debug và analyze, hàm undocument được export với ord 9 của msgina.dll có name là ShellTurnOffDialog.
    Code C của nó như sau:
    Visual C++ Code:
    1. int __stdcall ShellTurnOffDialog(HKEY hKey)
    2. {
    3.   CTurnOffDialog turnOffDialog(hDllInstance);
    4.   int result = turnOffDialog.Show((LPARAM) dwInitParam, hKey);
    5.   return result;
    6. }
    Code của msgina.dll này được MS coder code = VC++, dùng ATL và WTL library. Constructor của turnOffDialog và method Show rất dài, phức tạp, tui đang tái tạo lại C code.
    Trong method Show, TurnOffDialog khởi tạo CDimmedWindow. Constructor của CDimmedWindow khởi tạo windowclass với classname là DimmedWindowClass.

    RE msgina.dll phát hiện ra nhiều điều rất hay, vd hàm export 16 là hàm ShellDimScreen. Hàm này là hàm làm mờ toàn bộ các window background khi Turn off dialog show ra đấy.

    Như vậy, ta có thể tắt tính năng turn off computer theo vài ngu ý của tui:
    - FindWindow với DimmedWindowClass để send Alt-F4 tới nó, hay dialog "Turn off computer", send WM_COMMAND, IDCANCEL để tắt.
    - Viết hook, hook này tìm handle msgina = GetModuleHandle, locate export table, patch code của hàm export 9 = lệnh ret
    - Viết app, OpenProcess explorer, patch memory của export function 9 của msgina = lệnh ret.

  5. #15
    Ngày gia nhập
    12 2008
    Bài viết
    198

    - FindWindow với DimmedWindowClass để send Alt-F4 tới nó, hay dialog "Turn off computer", send WM_COMMAND, IDCANCEL để tắt.
    em không hiểu ý anh,"Turn off computer" nghĩa là Title của nó ah,sao em làm nó không ra

    Visual C++ Code:
    1. #include<windows.h>
    2. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    3. {
    4.     HWND a;
    5.     while(1)
    6.     {
    7.         a=FindWindow(NULL,"Turn off computer");
    8.         if(a!=NULL)
    9.         {
    10.             MessageBox(0,"jsd","jsf",0);
    11.             return 0;
    12.         }
    13.     }
    14.     return 0;
    15. }

    - Viết hook, hook này tìm handle msgina = GetModuleHandle, locate export table, patch code của hàm export 9 = lệnh ret
    mà lệnh ret là cái gì ấy nhỉ
    Đã được chỉnh sửa lần cuối bởi Cpro : 13-01-2009 lúc 08:26 AM.

  6. #16
    No Avatar
    ngocbig Khách

    Mặc định Tìm Handle của cửa sổ tắt máy trên Windows như thế nào?

    Có cần phải phức tạp vậy không nhỉ.
    dòng này đã lấy được HWND của dialog đó rồi. Có HWND rồi thì mọi việc trở nên quá đơn giản rồi. Bạn thích disable? Dùng hàm EnableWindow(). Bạn có muốn cho nó invisible? Set lại cái WS. Chắc các bạn cũng để ý là khi cái dialog đó bị mất focus thì tự nó và cái cửa sổ dimmed cũng tự thoát nên không việc gì phải gửi key nào hết. Đơn giản chỉ set focus cho bất kỳ một cửa sổ khác thì dialog đó tự mất.

    C Code:
    1. hwnd = WindowFromPoint(p);

    Còn dòng này
    C Code:
    1. HWND hParent = GetParent(hwnd);

    lấy HWND của cửa sổ cha của dialog trên, tức là cửa sổ dimmed đó. Khi lấy đc HWND thì cũng như trên. Mọi việc đã trở nên quá đơn giản rồi.

    TQN định reconstruct code của msgina.dll? Funny thing! Quỹ thời gian của cậu phải lớn lắm thì mới làm đc việc đó. Tôi thì không hứng thú lắm với cái việc đó lắm

    Có lẽ cậu muốn tìm hiểu sâu hơn về cơ chế shutdown của Windows thông qua con đường gian nan hơn. Cũng rất hay, điều này sẽ giúp các bạn làm quen với RE. Cậu cố gắng reconstruct lại code trong msgina rồi giải thích thêm để các bạn chưa biết học hỏi nhé.

    PS: mình gọi TQN là "cậu" vì có lẽ mình cũng bằng hoặc gần bằng tuổi TQN. Các bạn đững nghĩ mình xấc nhé. Vì khi tham gia diễn đàn mình muốn trao đổi cùng các bạn thoải mái nên thường xưng hô theo kiểu không quan trọng tuổi tác để có thể nói thoải mái hơn. Khi trao đồi với mấy bạn như kidkid, coder_gate, hoặc mèo thì mình biết tuổi các bạn chỉ bằng hoặc kém hơn tuổi em út mình (88).

    Các bạn muốn tìm hiểu về RE thì cần tham gia vào diễn đàn chuyên nghiệp hơn như woodmann hay một số site hay của Việt nam khác.

  7. #17
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Cô bé ngocbich này láo quá, tui lớn hơn cô bé phải một giáp đấy. Vào Woodmann tìm và xem các bài, các tool của tui post bên đấy. Kayaker, JMI, Woodmann, bilbo, disawowed, Crusader, Clandestiny... không lạ gì tui đâu.

    2 Cpro: Cậu thử đoạn code sau:
    C Code:
    1. #include <windows.h>
    2.  
    3. int main()
    4. {
    5.     while (TRUE)
    6.     {
    7.         HWND hFWnd = ::GetForegroundWindow();
    8.         if (NULL != hFWnd)
    9.         {
    10.             // Check that it's our window
    11.             char szClassName[MAX_PATH] = { 0 };
    12.             HWND hParWnd = ::GetParent(hFWnd);
    13.             HWND hStaticWnd = ::FindWindowEx(hFWnd, NULL, "Static", "Turn off computer");
    14.             if (hStaticWnd && ::GetClassName(hParWnd, szClassName, MAX_PATH) &&
    15.                 lstrcmpi(szClassName, "DimmedWindowClass") == 0)
    16.             {
    17.                 ::PostMessage(hFWnd, WM_CLOSE, 0, 0);
    18.                 MessageBox(GetDesktopWindow(), "I killed it", "OK", MB_SYSTEMMODAL);
    19.                 return  0;
    20.             }
    21.         }
    22.     }
    23.  
    24.     return -1;
    25. }
    Đã được chỉnh sửa lần cuối bởi TQN : 13-01-2009 lúc 10:57 AM.

  8. #18
    Ngày gia nhập
    12 2008
    Bài viết
    198

    HWND hStaticWnd = ::FindWindowEx(hFWnd, NULL, "Static", "Turn off computer");
    Có phải anh làm thế này để lấy được Handle của chính class "DimmedWindowClass" nếu giả sử trong lúc tắt máy có trên 2 class "DimmedWindowClass" không,chứ nếu sử dụng mỗi Findwindow và "DimmedWindowClass" là đủ mà

  9. #19
    No Avatar
    ngocbig Khách

    Thế thì tui gọi TQN bằng chú cho nó lịch sự nhỉ. Sao chú phải khoe mấy cái tên của mấy cao thủ ấy làm gì. Trình độ của chú mà sánh ngang JMI hay bilbo thì cũng có thể coi là pro rồi! lol. Nếu không được bằng một góc của họ thì bác à không chú TQN tự soi gương mà xấu hổ nhé. Cháu thì không dám sánh ngang hàng với các đại cổ thụ đó rồi.

    Mà chú là người lớn thì chú phải gương mẫu cho bọn trẻ noi theo chứ. Chú không nên chửi mắng người khác như vậy đúng không nào. Chú cũng không phải là bố mẹ cháu nên chú đừng mở miệng là xúc phạm đến cháu chư thế nhé.

  10. #20
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Chú mắng cháu vì thái độ chưa gì đã tự cao tự đại, ăn nói không khiêm tốn, châm chích người khác đấy cô bé à.

    @ all: còn các khác để disable hẵn turn off bằng việc modify code của msgina.dll thì các cậu tự làm thử. Khi nào RE xong, tui sẽ post code mà msgina đã dùng để làm mờ window và force nó foreground, disable các windows khác. MS coder dùng rất nhiều hàm undocument, các bạn sẽ không tìm thấy trong MSDN.
    Đã được chỉnh sửa lần cuối bởi TQN : 13-01-2009 lúc 11:28 AM.

Các đề tài tương tự

  1. Thiết kế giao diện giống Windows Explorer trên Windows XP như thế nào?
    Gửi bởi thptquochoc trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 27-03-2013, 12:22 PM
  2. Lấy handle của nhiều control trên chương trình khác như thế nào ?
    Gửi bởi kid1412qt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 08-05-2012, 11:13 PM
  3. Lấy handle Control trong Windows bằng sử dụng C#?
    Gửi bởi tomahutbui trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 30-03-2011, 11:13 PM
  4. Lấy handle Control trong Windows bằng sử dụng C#?
    Gửi bởi tomahutbui trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 27-03-2011, 07:23 PM
  5. Phân Biệt Handle và HWND trong lập trình Windows
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 8
    Bài viết cuối: 05-01-2009, 09:11 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn