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

Đề tài: Hook Hàm API OpenProcess #pragma data_seg(".shared") là gì

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

    Thumbs down Hook Hàm API OpenProcess #pragma data_seg(".shared") là gì

    đây là bài của bạn meoconlongvang http://forums.congdongcviet.com/show...p?t=9820,Mình không hiểu dòng #pragma data_seg(".shared") nghĩa là gì,các bạn có thể giải đáp giúp mình không
    Code:
    #include "stdafx.h"
    
    
    #pragma data_seg(".shared")
    
    DWORD ProtectingPid = 0;
    
    #pragma data_seg()
    
    HMODULE MyModuleHandle;
    HHOOK hhk = NULL;
    DWORD MyPid = 0;
    unsigned char Store[10];
    
    
    long _stdcall SelfInject();
    long _stdcall SelfEject();
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    HANDLE _stdcall OpenProcess2(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId);
    
    void HookAPI();
    void UnHookAPI();
    
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  reason,
                           LPVOID lpReserved
    					 )
    {
    	if (reason == DLL_PROCESS_ATTACH)
    	{
    		HookAPI();
    		MyModuleHandle = (HMODULE)hModule;
    		MyPid = GetCurrentProcessId();
    	}
    	else if (reason == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    
    	return TRUE;
    }
    
    long _stdcall SelfInject()
    {
    	ProtectingPid = MyPid;
    	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,MyModuleHandle,0);
    	return (hhk != NULL);
    }
    
    long _stdcall SelfEject()
    {
    	return UnhookWindowsHookEx(hhk);
    }
    
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	return CallNextHookEx(hhk,nCode,wParam,lParam);
    }
    
    void HookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("kernel32");
    	long pa = (long)GetProcAddress(hmod,"OpenProcess");
    	long pa2 = (long)OpenProcess2;
    	long dAddr = pa2 - pa - 5;
    	unsigned char *p = (unsigned char *)pa;
    	unsigned char *p2 = (unsigned char *)(&dAddr);
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
    	for (int i=0;i<5;i++)
    		Store[i] = p[i];
    
    	p[0] = (unsigned char)0xE9;
    	for (i=0;i<4;i++)
    		p[i + 1] = p2[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    
    void UnHookAPI()
    {
    	DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
    	HMODULE hmod = GetModuleHandle("kernel32");
    	long pa = (long)GetProcAddress(hmod,"OpenProcess");
    	unsigned char *p = (unsigned char *)pa;
    
    	VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
    
    	for (int i=0;i<5;i++)
    		p[i] = Store[i];
    
    	VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
    }
    
    HANDLE _stdcall OpenProcess2(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
    {
    	if (dwProcessId == ProtectingPid)
    	{
    		return NULL;
    	}
    	else
    	{
    		UnHookAPI();
    		HANDLE ans = OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);
    		HookAPI();
    		
    		return ans;
    	}
    }

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    data_seg(".shared") sẻ chỉ đến session được mô tả trong file .def. Nếu bạn mở file đó ra xem sẽ thấy nó mô tả rằng vùng nhớ này là vùng nhớ dùng chung giữa các process cùng nạp chung thư viện của mình vào. Mình làm như vậy để tiện chuyển dữ liệu giữa các process khác nhau.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    1

    Vậy ở đây có nghĩa là mình khai báo một biến trong #pragma data_seg()... thì biến này sẽ được lưu trữ lại khi có thay đổi! Nếu mình khai báo nhiều biến thì sao? Nhưng tại sao mình cũng khai báo một biến bool look = false như vây,khi mình chạy chuơng trình (cụ thể là Hook-chận phim)khi mở word , ta ấn phím qui định khoa phím ==> look = true,nhưng khi mở thêm một cái Notapad thì look lại về mặc định ban đầu là false, nghĩa là biến look này không dùng lại cái trước (cái đang dùng trong word) mà nó là một cái mới

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Phải đưa thêm một trong 2 thứ sau đây vào:

    1. Đưa vào code, nơi bạn khai báo SECTION lệnh sau:
    #pragma comment(linker, "/SECTION:.shared,RWS")

    2. Đưa vào file .def thông tin sau:
    SECTIONS
    .shared READ WRITE SHARED

    Ngoài data_seg thì còn có bss_seg, const_seg, code_seg, ...

    Nếu biến được khởi tạo thì nằm ở data_seg, nếu không được khởi tạo thì nằm ở bss_seg, nếu muốn bất di bất dịch thì đưa vào const_seg. Đó là luật lệ ...
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

  1. #pragma comment (lib, "Ws2_32.lib") - Lỗi không nhận ra Lib
    Gửi bởi hoangsonk49 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 13-09-2013, 09:15 PM
  2. Sử dụng #pragma với data_seg,comment trong lập trình DLL như thế nào?
    Gửi bởi vitaminC1 trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 24-05-2013, 09:36 AM
  3. Kỹ thuật C #pragma comment (lib, "winmm") là gì ạ?
    Gửi bởi khatran trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 18-11-2011, 10:04 PM
  4. #pragma data_seg(".shared")
    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: 0
    Bài viết cuối: 24-10-2009, 12:01 PM
  5. #pragma bss_seg("DLLShare") Or #pragma data_seg(".shared")
    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: 0
    Bài viết cuối: 24-10-2009, 11:08 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