-
11-05-2011, 12:12 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi zeroplus
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 địnhView more random threads:
- Load ảnh động (.gif) bằng picturebox trong visual C++ 2008
- Mô Tả Tổ chức vùng nhớ của chương trình
- Visual C++
- Lỗi "The system cannot find the file specifed" khi sử dụng C++2008
- Cách tìm id của thread trong VC++?
- Liên kết VC++ với VB 6.0
- Lỗi C2664: 'sprintf' : cannot convert parameter 1 from 'TCHAR [50]' to 'char *' trong API?
- công cụ viết một chương trình SDL.NET
- VC++ NHấp nháy cửa sổ
- Các căn hộ được thiết kế mang phong cách thông minh
-
11-05-2011, 01:04 PM #2Junior Member
- 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; }
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
-
11-05-2011, 01:24 PM #3Junior Member
- 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]
-
11-05-2011, 05:57 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi zeroplus
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
-
11-05-2011, 07:31 PM #5Junior Member
- 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; }
-
15-05-2011, 10:12 AM #6Junior Member
- 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 ?
-
29-05-2011, 04:39 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi zeroplus
bạn sửa chỗ này nè
#pragma data_seg(.shared)
#pragma data_seg(".shared")
long _stdcall HookCreateProcessInternalW(WCHAR *str)
long _stdcall HookCreateProcessInternalW(LPCWSTR str)
Nhẫn phong thủy là gì? Phong thủy là một học thuyết trừu tượng và rất khó nắm bắt, theo quan niệm từ thánh sư cho rằng mọi khía cạnh trong cuộc sống điều ít hoặc nhiều can dự đến phong thủy từ xây...
Nhẫn phong thủy là cái gì? Cách...