-
-
[旧帖] 2.1.2 远程CALL调用代码实现 0.00雪花
-
发表于: 2012-8-13 00:19 1203
-
1.上节我们是用代码注入器来调用的CALL,那么这次我们自己编写代码来调用CALL,这需要几个函数的联合运用。
1, FindWindow
2, GetWindowThreadProcessId
3, OpenProcess
4, CreateRemoteThread
【
HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName);
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);
找出某个窗口的创建者(线程或进程),返回创建者的标志符。
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
如成功,返回值为指定进程的句柄。
HANDLE CreateRemoteThread(
HANDLE hProcess, // OpenProcess
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全结构指针 NULL
DWORD dwStackSize, // 0
LPTHREAD_START_ROUTINE lpStartAddress, // 指向我们的CALL 地址
LPVOID lpParameter, // 传递的参数指针 NULL (stdcall)
DWORD dwCreationFlags, // 0
LPDWORD lpThreadId // 返回一个 线程ID标识 int lptid;=(LPDWORD) &lptid;
);
如果调用成功,返回新线程句柄.
】
2.新建一个基于对话框的MFC可执行程序,如下:
新添加的程序代码如下:
void RemoteCall(int CallAddr)
{
HWND h=::FindWindow(NULL,"MyGame"); // 查找窗口句柄
DWORD id; // 进程ID
LPDWORD pid=&id; //定义临时变量方便调用
::GetWindowThreadProcessId(h,pid); // 取得指定窗口的进程ID,存放到变量id里面
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,false,id); // 获取访问进程权限 存放至hp
DWORD tid;
// 在进程里面调用 CallAddr.
CreateRemoteThread(hp,NULL,0, (LPTHREAD_START_ROUTINE)CallAddr ,NULL,0,&tid);
}
void CCALLDlg::OnRemoteAdd()
{
// TODO: Add your control notification handler code here
RemoteCall(0x402360);
}
void CCALLDlg::OnBTNDECBlood()
{
// TODO: Add your control notification handler code here
RemoteCall(0x40108c);
}
3.编译,执行,测试。
1, FindWindow
2, GetWindowThreadProcessId
3, OpenProcess
4, CreateRemoteThread
【
HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName);
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);
找出某个窗口的创建者(线程或进程),返回创建者的标志符。
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
如成功,返回值为指定进程的句柄。
HANDLE CreateRemoteThread(
HANDLE hProcess, // OpenProcess
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全结构指针 NULL
DWORD dwStackSize, // 0
LPTHREAD_START_ROUTINE lpStartAddress, // 指向我们的CALL 地址
LPVOID lpParameter, // 传递的参数指针 NULL (stdcall)
DWORD dwCreationFlags, // 0
LPDWORD lpThreadId // 返回一个 线程ID标识 int lptid;=(LPDWORD) &lptid;
);
如果调用成功,返回新线程句柄.
】
2.新建一个基于对话框的MFC可执行程序,如下:
新添加的程序代码如下:
void RemoteCall(int CallAddr)
{
HWND h=::FindWindow(NULL,"MyGame"); // 查找窗口句柄
DWORD id; // 进程ID
LPDWORD pid=&id; //定义临时变量方便调用
::GetWindowThreadProcessId(h,pid); // 取得指定窗口的进程ID,存放到变量id里面
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,false,id); // 获取访问进程权限 存放至hp
DWORD tid;
// 在进程里面调用 CallAddr.
CreateRemoteThread(hp,NULL,0, (LPTHREAD_START_ROUTINE)CallAddr ,NULL,0,&tid);
}
void CCALLDlg::OnRemoteAdd()
{
// TODO: Add your control notification handler code here
RemoteCall(0x402360);
}
void CCALLDlg::OnBTNDECBlood()
{
// TODO: Add your control notification handler code here
RemoteCall(0x40108c);
}
3.编译,执行,测试。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: