Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Nhận biết chương trình dạng console vừa được mở lên

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Mặc định Nhận biết chương trình dạng console vừa được mở lên

    Chào mọi người

    Cho mình hỏi mình hook hàm CreateProcess để biết được process nào được gọi lên, vậy làm sao để biết được process vừa tạo đó là process dạng console như cmd.exe... mà cần không phải hook CreateWindowEx (dễ crash chương trình ).
    Do mình tính kết hợp CreateRemoteThread và SetWindowHook để cài hook nhưng nếu mà ứng dụng dạng cửa sổ đã được cài hook bởi SetWindowHook mà lại bị cài thêm bởi CreateRemoteThread => tăng biến Reference Counts => phải unload dll đến khi nào biến đó =0 mới được

  2. #2
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mình chưa biết trong các ứng dụng lập trình trên ngôn ngữ khác thế nào, nhưng trên MFC thì mình nghĩ vài hàm có thể cho bạn thông tin console hoặc GUI. Hiện tại mình nhớ đc hàm GetStartupInfo.



    Code:
    VOID WINAPI GetStartupInfo(
      __out  LPSTARTUPINFO lpStartupInfo
    );
    Hàm này trả về 1 cấu trúc :

    Code:
    typedef struct _STARTUPINFO {
      DWORD  cb;
      LPTSTR lpReserved;
      LPTSTR lpDesktop;
      LPTSTR lpTitle;
      DWORD  dwX;
      DWORD  dwY;
      DWORD  dwXSize;
      DWORD  dwYSize;
      DWORD  dwXCountChars;
      DWORD  dwYCountChars;
      DWORD  dwFillAttribute;
      DWORD  dwFlags;
      WORD   wShowWindow;
      WORD   cbReserved2;
      LPBYTE lpReserved2;
      HANDLE hStdInput;
      HANDLE hStdOutput;
      HANDLE hStdError;
    } STARTUPINFO, *LPSTARTUPINFO;
    Một vài trường trong cấu trúc này mình nghĩ có thể xác định console / GUI.

  3. #3
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mình vừa thử, ứng dụng console lập trình trên VC10 không gọi hàm GetStartupInfo @@! Chắc phải inject.
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 15-12-2011 lúc 11:34 PM.

  4. #4
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Chức năng đó là trong file MyUSBShield.dll ( MyUSB Security) của anh gianghoplus. Mình thấy phần này rất hay nhưng monitor API thử xem mà vẫn không biết nó làm việc như thế nào để nhận biết được ứng dụng console mở lên Chỉ thấy khi CreateProcessInternalW được gọi là hàm SHGetFileInfoW được gọi theo. Mọi người và anh gianghoplus giúp mình phần này với vì mình đang làm ct khóa USB nhưng cần bảo vệ tránh bị kill bởi taskkill. Cảm ơn mọi người

  5. #5
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Trích dẫn Nguyên bản được gửi bởi zeroplus Xem bài viết
    Chức năng đó là trong file MyUSBShield.dll ( MyUSB Security) của anh gianghoplus. Mình thấy phần này rất hay nhưng monitor API thử xem mà vẫn không biết nó làm việc như thế nào để nhận biết được ứng dụng console mở lên Chỉ thấy khi CreateProcessInternalW được gọi là hàm SHGetFileInfoW được gọi theo. Mọi người và anh gianghoplus giúp mình phần này với vì mình đang làm ct khóa USB nhưng cần bảo vệ tránh bị kill bởi taskkill. Cảm ơn mọi người
    Tặng cho bạn

    Visual C++ Code:
    1. int WINAPI Fake_CreateProcessInternal(HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation, PHANDLE hNewToken)
    2. {
    3.     // Kiểm tra xem đây có phải là ứng dụng Console Application ko?
    4.     DWORD dwType = (DWORD)SHGetFileInfo(lpApplicationName, NULL, NULL, NULL, SHGFI_EXETYPE);
    5.  
    6.     if (dwType == 0)    // Fail
    7.     {
    8.         WCHAR *lpSubstr = wcsstr(lpCommandLine + 1, L"\"");
    9.         if (lpSubstr)
    10.         {
    11.             int len = lpSubstr - lpCommandLine - 1;
    12.             WCHAR *szPath = new WCHAR[len + 1];
    13.             wcsncpy(szPath, lpCommandLine + 1, len);
    14.             szPath[len] = NULL;     // Ngắt
    15.  
    16.             dwType = (DWORD)SHGetFileInfo(szPath, NULL, NULL, NULL, SHGFI_EXETYPE);
    17.             delete[] szPath;
    18.         }
    19.     }
    20.  
    21.     /*
    22.         MZ = 0x5A4D - DOS signature.
    23.         NE = 0x454E - OS/2 signature.
    24.         LE = 0x454C - OS/2 LE or VXD signature.
    25.         PE = 0x4550 - Win32/NT signature.
    26.  
    27.         * Windows [GUI] Application
    28.         LOWORD = NE or PE
    29.         HIWORD = 3.0, 3.5 or 4.0
    30.  
    31.         * MS-DOS.EXE, .COM or .BAT file:
    32.         LOWORD = MZ
    33.         HIWORD = 0
    34.  
    35.         * Windows Console Application
    36.         LOWORD = PE
    37.         HIWORD = 0
    38.     */
    39.  
    40.     int nRet = Real_CreateProcessInternal(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, hNewToken);
    41.    
    42.     if (dwType == 0x4550 || dwType == 0x5A4D)   // Đây là ứng dụng dạng Console Application. Hehe @@
    43.     {
    44.         Sleep(1);   // Phân chia lại CPU
    45.         InjectToProcess(lpProcessInformation->hProcess, szDllPath); // Set Hook to Console apps je:je:
    46.     }
    47.  
    48.     return nRet;
    49. }
    Đã được chỉnh sửa lần cuối bởi gianghoplus : 17-12-2011 lúc 12:39 PM.
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  6. #6
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Mặc định Nhận biết chương trình dạng console vừa được mở lên

    Rất cảm ơn anh gianghoplus. Sáng giờ em tìm hiểu trên mạng hoài mà vẫn chưa co kết quả. 1 Lần nửa cảm ơn

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

    Code của Gianghoplus sai rồi. PE nào mà không có MZ và PE signature. Phải kiểm tra field SubSystem của OptionalHeader.

  8. #8
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Bác TQN am hiểu PE thiệt , SubSystem = 2 thì GUI còn 3 thì console .Nhưng lấy được cái Optional Header cũng hơi nhọc.
    Đoạn code của bác gianghoplus em nghĩ phải thế này chứ :
    Code:
        if (LOWORD(dwType) == 0x4550 && HIWORD(dwType) == 0) 
        {
            Sleep(1);   // Phân chia lại CPU
            InjectToProcess(lpProcessInformation->hProcess, szDllPath); // Set Hook to Console apps je:je:
        }
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 17-12-2011 lúc 07:35 PM.

  9. #9
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Trích dẫn Nguyên bản được gửi bởi TQN Xem bài viết
    Code của Gianghoplus sai rồi. PE nào mà không có MZ và PE signature. Phải kiểm tra field SubSystem của OptionalHeader.
    Bác TQN có thể giải thích rõ hơn vì sao của code của em bị sai được ko.
    Theo em hiểu thì giá trị dwType trả về là kiểu WORD tức là = (BYTE)(LOWORD & 0xFF) | ((BYTE)(HIWORD & 0xFF) << 8).
    Mà ở đây HIWORD của GUI Application luôn lớn hơn 0. Tức ko thể có chuyện GUI có dwType == MZ || dwType == PE được, nên em nghĩ code như trên là hợp lý về mặt logic :-S

    Trích dẫn Nguyên bản được gửi bởi luc13aka47 Xem bài viết
    Bác TQN am hiểu PE thiệt , SubSystem = 2 thì GUI còn 3 thì console .Nhưng lấy được cái Optional Header cũng hơi nhọc.
    Đoạn code của bác gianghoplus em nghĩ phải thế này chứ :
    Mình nghĩ như thế này cũng đúng, nhưng sẽ sót các file *.BAT, *.CMD, ...
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  10. #10
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mình tham khảo trên msdn thì
    LOWORD = PE and HIWORD = 0
    => Console application or .bat file => console dạng PE file format chạy trên Windows.

    LOWORD = MZ and HIWORD = 0
    => MS-DOS .exe or .com file => file này chỉ chạy trên MS-DOS và CP/M.

    Nên mình nghĩ chỉ cần xét điều kiện (LOWORD = PE and HIWORD = 0).
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 18-12-2011 lúc 12:19 AM.

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

  1. Cách nhận biết người dùng Click lên link trên WebBrowser ?
    Gửi bởi Ding trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 17
    Bài viết cuối: 02-03-2013, 10:01 AM
  2. Cách làm Console Menu di chuyển lựa chọn lên xuống trong C#?
    Gửi bởi Dlean7 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 14-10-2012, 02:20 PM
  3. Graphic Cách nhận dữ liệu từ console và hiển thị lên form trong c# ??
    Gửi bởi loc.plsoft trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 05-03-2012, 08:17 PM
  4. Algorithm sự khác nhau giữa Console.readLine và Console.readKey ; giữa Console.write và console.writeLine
    Gửi bởi trangkizd_91 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 20-10-2011, 05:48 PM
  5. Làm thế nào để biết tọa độ nào đang hiển thị cái gì trên màn hình console
    Gửi bởi bboyjeans trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 18-12-2010, 11:14 AM

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