16,471
社区成员
发帖
与我相关
我的任务
分享
// TorchlightGameDll.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "TorchlightGameDll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
// 则从此 DLL 导出的任何调入
// MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
// 该函数的最前面。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CTorchlightGameDllApp
BEGIN_MESSAGE_MAP(CTorchlightGameDllApp, CWinApp)
END_MESSAGE_MAP()
// CTorchlightGameDllApp 构造
CTorchlightGameDllApp::CTorchlightGameDllApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CTorchlightGameDllApp 对象
CTorchlightGameDllApp theApp;
// CTorchlightGameDllApp 初始化
BOOL CTorchlightGameDllApp::InitInstance()
{
CWinApp::InitInstance();
return TRUE;
}
const CString GameName = "Torchlight II v.1.25.2.2";
const CString GameDllName = "TorchlightGameDll.dll";
const int BloodBaseAddress = 0x0018C8BC;
LRESULT CALLBACK GameProc(int code,WPARAM wParam,LPARAM lParam){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return CallNextHookEx(0,code,wParam,lParam);
}
void __declspec(dllexport) SetHook(){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//获取游戏主线程ID
HWND GameHwnd = ::FindWindow(NULL,GameName);
if(GameHwnd!=NULL){
AfxMessageBox("注入成功");
DWORD GameDword=::GetWindowThreadProcessId(GameHwnd,NULL);
//获取游戏主线程句柄
::SetWindowsHookEx(WH_KEYBOARD,&GameProc,::GetModuleHandle(GameDllName),GameDword);
AfxMessageBox("注入成功");
}else{
AfxMessageBox("未找到游戏");
}
}
int __declspec(dllexport) GetItem(){
return 0;
}
int __declspec(dllexport) GetBlood(){
CFile file ;
int Blood =0;
_asm{
mov eax,BloodBaseAddress
mov eax,[eax]
add eax,0xC90
mov Blood,eax
}
file.Open("d:\\log.txt",CFile::modeReadWrite);
CString temp ;
temp.Format("%",Blood);
file.Write(temp,temp.GetLength());
file.Close();
return Blood;
}
这是我程序
__declspec(dllimport) void SetHook();
__declspec(dllimport) int GetBlood();
void CTorchlightGameDlg::OnBnClickedBtnReadBlood()
{
// TODO: 在此添加控件通知处理程序代码
int Blood = GetBlood();
CString temp ;
temp.Format("%d",Blood);
AfxMessageBox(temp);
}
void CTorchlightGameDlg::OnBnClickedBtnHook()
{
SetHook();
}
不报错了.但是读不出来数值