Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zeroplus
    Mình build ra file dll đoạn code bạn sửa rồi dùng vb6 load lên, nhưng khi click chạy thử 1 file thực thi để thử hàm APi bị hook thì nó xuất hiện cái bảng msgbox trống rỗng, mình hog hiểu tại sao. Bạn xem lại giúp mình hen[IMG]images/smilies/biggrin.png[/IMG]

    Mã:
    #include "stdafx.h"
    
    // Kiểm tra xem đã khai báo section ".shared" trong file *.def chưa ?
    #pragma data_seg(.shared)
    WCHAR szData[512] = {0};  // Quan trọng: Phải khởi tạo giá trị các biến ở vùng này
    #pragma data_seg()
    
    
    HMODULE mModuleHandle;
    HHOOK hhk = NULL;
    unsigned char Store[10];
    long _stdcall HookCreateProcessInternalW();
    long _stdcall UnHookCreateProcessInternalW();
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,
    					   LPCWSTR lpApplicationName,
    					   LPWSTR lpCommandLine,
    					   LPSECURITY_ATTRIBUTES lpProcessAttributes,
    					   LPSECURITY_ATTRIBUTES lpThreadAttributes,
    					   BOOL bInheritHandles,
    					   DWORD dwCreationFlags,
    					   LPVOID lpEnvironment,
    					   LPCWSTR lpCurrentDirectory,
    					   LPSTARTUPINFOW lpStartupInfo,
    					   LPPROCESS_INFORMATION lpProcessInformation,
    					   PHANDLE hNewToken);
    					   
    void HookAPI();
    void UnHookAPI();
    
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  reason,LPVOID lpReserved)
    {
    	if (reason == DLL_PROCESS_ATTACH)
    	{
    		HookAPI();
    		mModuleHandle = (HMODULE)hModule;
    	}
    	else if (reason == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    	
    	return TRUE;
    }
    
    long _stdcall HookCreateProcessInternalW(WCHAR *str)
    {
    	wcscpy(szData, str);
    MessageBoxW(0, str, L"Msgbox",0);
    MessageBoxW(0, szData, L"Msgbox",0);
    	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,mModuleHandle,0);
    	return (hhk != NULL);
    }
    
    long _stdcall UnHookCreateProcessInternalW()
    {
    	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,"CreateProcessInternalW");
    	long pa2 = (long)CreateProcessInternalW2;
    	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 (int 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,"CreateProcessInternalW");
    	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);
    }
    
    
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
    {
    	MessageBoxW(0, szData, L"Msgbox",0); // Khi chạy thử 1 file exe thì msgbox văng ra trống rỗng, không biết biến szData có lưu dữ liệu không ???
    	return 0;
    }
    szData phải nằm trong vùng SHARED. Mình chỉ sửa theo cách nhìn trực quan. Nếu cần thì có thể đính kèm cả project, mình sẽ sửa giùm

    P/s: Nếu chỉ dùng SetWindowHookEx() để set hook thì mình nghĩ chỉ cần hook CreateProcessW là đủ, ko cần đao to búa lớn đến CreateProcessInternalW làm gì. Vì hiệu quả cũng ko khác nhau bao nhiêu.
    Với những hàm có tần suất sử dụng cao thì bạn có thể thao khảo sử dụng Microsoft Detours Express 2.1 để đảm bảo hiệu suất và sự ổn định

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Cách truyền 1 chuỗi từ VB vào dll như thế nào ?

    Mọi người xem giúp 2 đoạn code bên dưới dùm xem lỗi chỗ nào mà sao mình truyền cho nó 1 chuỗi từ VB vào dll và khi chạy thì msgbox ở hàm mới hiện ra không phải là chuỗi truyền vào mà nó trống rỗng vậy ?

    Sẵn tiện hỏi luôn làm thế nào để truyền 1 mảng từ VB6 vào 1 mảng trong C++, tại mình muốn đưa danh sách tên các file vào dll

    Code Hook.cpp
    Mã:
    #include "stdafx.h"
    #pragma data_seg(.shared)
    HMODULE mModuleHandle;
    HHOOK hhk = NULL;
    unsigned char Store[10];
    long _stdcall HookCreateProcessInternalW();
    long _stdcall UnHookCreateProcessInternalW();
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    long cstr;
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,
    					   LPCWSTR lpApplicationName,
    					   LPWSTR lpCommandLine,
    					   LPSECURITY_ATTRIBUTES lpProcessAttributes,
    					   LPSECURITY_ATTRIBUTES lpThreadAttributes,
    					   BOOL bInheritHandles,
    					   DWORD dwCreationFlags,
    					   LPVOID lpEnvironment,
    					   LPCWSTR lpCurrentDirectory,
    					   LPSTARTUPINFOW lpStartupInfo,
    					   LPPROCESS_INFORMATION lpProcessInformation,
    					   PHANDLE hNewToken);
    					   
    void HookAPI();
    void UnHookAPI();
    
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  reason,LPVOID lpReserved)
    {
    	if (reason == DLL_PROCESS_ATTACH)
    	{
    		HookAPI();
    		mModuleHandle = (HMODULE)hModule;
    	}
    	else if (reason == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    	
    	return TRUE;
    }
    
    long _stdcall HookCreateProcessInternalW(long str)
    {
    	cstru=str;
    	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,mModuleHandle,0);
    	return (hhk != NULL);
    }
    
    long _stdcall UnHookCreateProcessInternalW()
    {
    	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,"CreateProcessInternalW");
    	long pa2 = (long)CreateProcessInternalW2;
    	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 (int 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,"CreateProcessInternalW");
    	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);
    }
    
    
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
    {
    	MessageBoxW(0,cstr,L"Msgbox",0); // Mở Msgbox để test xem chuỗi truyền vào có chính xác không
    	return 0;
    }
    Code VB6
    Mã:
    Private Declare Function HookCreateProcessInternalW Lib "Hook.dll" (ByVal str As Long) As Long
    Private Declare Function UnHookCreateProcessInternalW Lib "Hook.dll" () As Long
    
    Private Sub Form_Load()
    Call HookCreateProcessInternalW(StrPtr("Test")) ' Truyền chuỗi test sao khi đổi sang dạng long vào dll
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
    UnHookCreateProcessInternalW
    End Sub

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hix, mình làm mà không được, mình gửi source lên cho bạn fix giùm, cám ơn bạn đã giúp [IMG]images/smilies/biggrin.png[/IMG][IMG]images/smilies/biggrin.png[/IMG]

    Bạn gianghoplus xem qua và fix giùm mình với ![IMG]images/smilies/Cry.gif[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zeroplus
    Mọi người xem giúp 2 đoạn code bên dưới dùm xem lỗi chỗ nào mà sao mình truyền cho nó 1 chuỗi từ VB vào dll và khi chạy thì msgbox ở hàm mới hiện ra không phải là chuỗi truyền vào mà nó trống rỗng vậy ?

    Sẵn tiện hỏi luôn làm thế nào để truyền 1 mảng từ VB6 vào 1 mảng trong C++, tại mình muốn đưa danh sách tên các file vào dll

    Code Hook.cpp
    Mã:
    #include "stdafx.h"
    #pragma data_seg(.shared)
    HMODULE mModuleHandle;
    HHOOK hhk = NULL;
    unsigned char Store[10];
    long _stdcall HookCreateProcessInternalW();
    long _stdcall UnHookCreateProcessInternalW();
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    WCHAR szData[255];
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,
    					   LPCWSTR lpApplicationName,
    					   LPWSTR lpCommandLine,
    					   LPSECURITY_ATTRIBUTES lpProcessAttributes,
    					   LPSECURITY_ATTRIBUTES lpThreadAttributes,
    					   BOOL bInheritHandles,
    					   DWORD dwCreationFlags,
    					   LPVOID lpEnvironment,
    					   LPCWSTR lpCurrentDirectory,
    					   LPSTARTUPINFOW lpStartupInfo,
    					   LPPROCESS_INFORMATION lpProcessInformation,
    					   PHANDLE hNewToken);
    					   
    void HookAPI();
    void UnHookAPI();
    
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  reason,LPVOID lpReserved)
    {
    	if (reason == DLL_PROCESS_ATTACH)
    	{
    		HookAPI();
    		mModuleHandle = (HMODULE)hModule;
    	}
    	else if (reason == DLL_PROCESS_DETACH)
    	{
    		UnHookAPI();
    	}
    	
    	return TRUE;
    }
    
    long _stdcall HookCreateProcessInternalW(WCHAR *str)
    {
    	wcscpy_s(szData, 254, str);
    	hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,mModuleHandle,0);
    	return (hhk != NULL);
    }
    
    long _stdcall UnHookCreateProcessInternalW()
    {
    	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,"CreateProcessInternalW");
    	long pa2 = (long)CreateProcessInternalW2;
    	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 (int 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,"CreateProcessInternalW");
    	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);
    }
    
    
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
    {
    	MessageBoxW(0, szData, L"Msgbox",0); // Mở Msgbox để test xem chuỗi truyền vào có chính xác không
    	return 0;
    }
    Code VB6
    Mã:
    Private Declare Function HookCreateProcessInternalW Lib "Hook.dll" (ByVal str As Long) As Long
    Private Declare Function UnHookCreateProcessInternalW Lib "Hook.dll" () As Long
    
    Private Sub Form_Load()
    Call HookCreateProcessInternalW(StrPtr("Test")) ' Truyền chuỗi test sao khi đổi sang dạng long vào dll
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
    UnHookCreateProcessInternalW
    End Sub
    Mình đã sửa lại.

    Với việc truyền cả mảng vào thì mình nghĩ ko nên. Cứ viết thêm 1 hàm Add như sau
    void Add(WCHAR *lpData)
    {
    ...
    }

    Chúc thành công

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cám ơn bạn rất nhìu, để mình làm thử

    Mình build ra file dll đoạn code bạn sửa rồi dùng vb6 load lên, nhưng khi click chạy thử 1 file thực thi để thử hàm APi bị hook thì nó xuất hiện cái bảng msgbox trống rỗng, mình hog hiểu tại sao. Bạn xem lại giúp mình hen[IMG]images/smilies/biggrin.png[/IMG]

    Mã:
    #include "stdafx.h"
    #pragma data_seg(.shared)
    HMODULE mModuleHandle;
    HHOOK hhk = NULL;
    unsigned char Store[10];
    long _stdcall HookCreateProcessInternalW();
    long _stdcall UnHookCreateProcessInternalW();
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    WCHAR szData[255];
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,
                           LPCWSTR lpApplicationName,
                           LPWSTR lpCommandLine,
                           LPSECURITY_ATTRIBUTES lpProcessAttributes,
                           LPSECURITY_ATTRIBUTES lpThreadAttributes,
                           BOOL bInheritHandles,
                           DWORD dwCreationFlags,
                           LPVOID lpEnvironment,
                           LPCWSTR lpCurrentDirectory,
                           LPSTARTUPINFOW lpStartupInfo,
                           LPPROCESS_INFORMATION lpProcessInformation,
                           PHANDLE hNewToken);
                           
    void HookAPI();
    void UnHookAPI();
    
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  reason,LPVOID lpReserved)
    {
        if (reason == DLL_PROCESS_ATTACH)
        {
            HookAPI();
            mModuleHandle = (HMODULE)hModule;
        }
        else if (reason == DLL_PROCESS_DETACH)
        {
            UnHookAPI();
        }
        
        return TRUE;
    }
    
    long _stdcall HookCreateProcessInternalW(WCHAR *str)
    {
        wcscpy_s(szData, 254, str);
    MessageBoxW(0, szData, L"Msgbox",0); // Đặt msgbox tại đây thì khi truyền chuỗi strinh vào nó nó văng ra đúng chuỗi đã truyền mặc dù sử dụng biến szData như ở bên dưới
        hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,mModuleHandle,0);
        return (hhk != NULL);
    }
    
    long _stdcall UnHookCreateProcessInternalW()
    {
        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,"CreateProcessInternalW");
        long pa2 = (long)CreateProcessInternalW2;
        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 (int 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,"CreateProcessInternalW");
        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);
    }
    
    
    BOOL WINAPI CreateProcessInternalW2(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
    {
        MessageBoxW(0, szData, L"Msgbox",0); // Khi chạy thử 1 file exe thì msgbox văng ra trống rỗng, không biết biến szData có lưu dữ liệu không ???
        return 0;
    }

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    các bạn nào có phương pháp nào học tốt lập trình ko có thể chỉ cho mình với. mình học trình nhưng vẫn còn mơ hồ về nó lắm các bác nào có cách học tốt thì chỉ cho mình với ?

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zeroplus
    Hix, mình làm mà không được, mình gửi source lên cho bạn fix giùm, cám ơn bạn đã giúp [IMG]images/smilies/biggrin.png[/IMG][IMG]images/smilies/biggrin.png[/IMG]

    Bạn gianghoplus xem qua và fix giùm mình với ![IMG]images/smilies/Cry.gif[/IMG]
    Xin lỗi, mình về quê chơi vài tuần nên ko online

    bạn sửa chỗ này nè


    #pragma data_seg(.shared)
    thành


    #pragma data_seg(".shared")
    sửa

    long _stdcall HookCreateProcessInternalW(WCHAR *str)
    thành


    long _stdcall HookCreateProcessInternalW(LPCWSTR str)
    // LPCWSTR == const WCHAR*

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •