/
/
此处我省略了部分内容,封装的读写没有贴出来。
/
/
dllmain.cpp : 定义 DLL 应用程序的入口点。
typedef struct _MATRIX {
union {
struct {
float
_11, _12, _13, _14;
float
_21, _22, _23, _24;
float
_31, _32, _33, _34;
float
_41, _42, _43, _44;
};
float
m[
4
][
4
];
};
} Matrix;
typedef struct _VECTOR3 {
float
x;
float
y;
float
z;
} Vector3;
typedef struct _VECTOR2 {
float
x;
float
y;
} Vector2;
typedef struct TAimBot
{
bool
bLook;
ULONG64 dwObj;
ULONG64 dwObjMesh;
Vector3 Position;
FLOAT
Value1;
FLOAT
Value2;
}AimBot;
/
*
计算
2d
距离
*
/
float
Get2dDistance(
float
x1,
float
y1,
float
x2,
float
y2)
{
float
dDistance;
x1
=
x1
-
x2;
y1
=
y1
-
y2;
dDistance
=
sqrt(x1
*
x1
+
y1
*
y1);
return
dDistance;
}
/
*
计算
3d
距离
*
/
float
Get3dDistance(Vector3 MyPos, Vector3 TargerPos,
int
Divide)
{
float
fDistance;
Vector3 vec;
vec.x
=
TargerPos.x
-
MyPos.x;
vec.y
=
TargerPos.y
-
MyPos.y;
vec.z
=
TargerPos.z
-
MyPos.z;
fDistance
=
sqrt(
pow
(vec.x,
2
)
+
pow
(vec.y,
2
)
+
pow
(vec.z,
2
));
return
fDistance
/
Divide;
}
/
*
读坐标
*
/
Vector3 ReadVector3(ULONG64 addr, DWORD
Type
)
{
return
ReadMem<Vector3>(addr
+
Type
);
}
/
*
3d
-
>
2d
*
/
DWORD g_dwWidth,g_dwHeight;
bool
WorldToScreen_2D(Matrix viewWorld, Vector3 TargerPos, Vector2
*
result)
{
float
fViewW
=
viewWorld._14
*
TargerPos.x
+
viewWorld._24
*
TargerPos.y
+
viewWorld._34
*
TargerPos.z
+
viewWorld._44;
if
(fViewW <
0.01f
) {
return
false; }
fViewW
=
1
/
fViewW;
float
fBoxX
=
g_dwWidth
/
2
+
(viewWorld._11
*
TargerPos.x
+
viewWorld._21
*
TargerPos.y
+
viewWorld._31
*
TargerPos.z
+
viewWorld._41)
*
fViewW
*
g_dwWidth
/
2
;
float
fBoxY
=
g_dwHeight
/
2
-
(viewWorld._12
*
TargerPos.x
+
viewWorld._22
*
TargerPos.y
+
viewWorld._32
*
TargerPos.z
+
viewWorld._42)
*
fViewW
*
g_dwHeight
/
2
;
result
-
>x
=
fBoxX;
result
-
>y
=
fBoxY;
return
true;
}
/
*
读矩阵
*
/
void GetMatrix(ULONG64 Addr, Matrix
*
ViewWorld)
{
*
ViewWorld
=
ReadMem<Matrix>(ReadMem<ULONG64>(ReadMem<ULONG64>(Addr)
+
0x20
)
+
0x270
);
}
int
toMove(
int
a)
{
a
=
fabs(a);
if
(a >
200
)
return
50
;
else
if
(a >
100
)
return
25
;
else
if
(a >
80
)
return
25
;
else
if
(a >
60
)
return
20
;
else
if
(a >
45
)
return
15
;
else
if
(a >
20
)
return
5
;
else
if
(a >
9
)
return
3
;
else
if
(a >
3
)
return
1
;
return
0
;
}
void myMouseMove(
int
x,
int
y,
float
AimSpeed)
{
int
fTargetX
=
0
, fTargetY
=
0
;
fTargetX
=
x
-
g_dwWidth
/
2
;
fTargetY
=
y
-
g_dwHeight
/
2
;
if
(fTargetX >
0
)
fTargetX
=
toMove(fTargetX);
else
fTargetX
=
-
toMove(fTargetX);
if
(fTargetY >
0
)
fTargetY
=
toMove(fTargetY);
else
fTargetY
=
-
toMove(fTargetY);
mouse_event(
1
, fTargetX
/
AimSpeed, fTargetY
/
AimSpeed,
0
,
0
);
}
std::string GetObjectClassName(ULONG64 Gname, DWORD
ID
)
{
ULONG64 ulGname, ulTempAddr, ulTempAddr2;
DWORD Page, Order;
static char strObjectType[
64
]
=
{
"\0"
};
if
(
ID
>
0
&&
ID
<
2000000
)
{
ulGname
=
ReadMem<ULONG64>(Gname);
Page
=
ID
/
16384
;
Order
=
ID
%
16384
;
ulTempAddr
=
ReadMem<ULONG64>((ULONG64)(ulGname
+
Page
*
8
));
if
(ulTempAddr >
0
)
{
ulTempAddr2
=
ReadMem<ULONG64>(ulTempAddr
+
Order
*
8
);
if
(ulTempAddr2 >
0
)
{
ReadVirtual((LPVOID)(ulTempAddr2
+
12
), strObjectType,
64
*
sizeof(char));
}
}
}
return
strObjectType;
}
DWORD WINAPI start(DWORD Param)
{
/
/
AllocConsole();
/
/
SetConsoleCtrlHandler(NULL, true);
/
/
freopen(
"CONOUT$"
,
"w"
, stdout);
Matrix ViewWorld{};
AimBot aimBot;
Vector3 position;
Vector2 result{};
while
(true)
{
ULONG64 ulBase
=
(ULONG64)GetModuleHandle(NULL);
ULONG64 ulUworld
=
ReadMem<ULONG64>(ulBase
+
0x2F71060
);
ULONG64 ulGname
=
ulBase
+
0x2E6E0C0
;
ULONG64 ulMatrix
=
ulBase
+
0x2BF1100
;
ULONG64 ulUlevel
=
ReadMem<ULONG64>(ulUworld
+
0x30
);
ULONG64 ulActor
=
ReadMem<ULONG64>(ulUlevel
+
0x98
);
DWORD dwCount
=
ReadMem<DWORD>(ulUlevel
+
0xA0
);
GetMatrix(ulMatrix, &ViewWorld);
g_dwWidth
=
ReadMem<DWORD>(ulBase
+
0x2BF3240
);
g_dwHeight
=
ReadMem<DWORD>(ulBase
+
0x2BF3244
);
/
/
+
4
/
/
printf(
"%d %d %d %f\n"
, dwCount, g_dwWidth, g_dwHeight, ViewWorld._43);
for
(
int
i
=
0
; i < dwCount; i
+
+
)
{
ULONG64 ulObject
=
ReadMem<ULONG64>(ulActor
+
i
*
8
);
if
(ulObject <
0
)
continue
;
DWORD
id
=
ReadMem<DWORD>(ulObject
+
0x18
);
std::string strType
=
GetObjectClassName(ulGname,
id
);
if
(strType.find(
"BotPawn_C"
)
=
=
strType.npos)
continue
;
position
=
ReadVector3(ReadMem<ULONG64>(ulObject
+
0x158
),
0x1A0
);
if
(WorldToScreen_2D(ViewWorld, position, &result))
{
if
(!aimBot.bLook)
{
aimBot.Value1
=
Get2dDistance(g_dwWidth
/
2
, g_dwHeight
/
2
, result.x, result.y);
if
(aimBot.Value1 <
=
200.f
)
{
if
(aimBot.Value2
=
=
0
)
{
aimBot.Value2
=
aimBot.Value1;
aimBot.dwObj
=
ulObject;
}
else
if
(aimBot.Value1 < aimBot.Value2)
{
aimBot.Value2
=
aimBot.Value1;
aimBot.dwObj
=
ulObject;
}
}
}
}
}
if
(GetAsyncKeyState(
2
) !
=
0
)
{
aimBot.bLook
=
true;
position
=
ReadVector3(ReadMem<ULONG64>(aimBot.dwObj
+
0x158
),
0x1A0
);
if
(WorldToScreen_2D(ViewWorld, position, &result))
{
myMouseMove(result.x, result.y,
5
);
/
/
参数
3
是自瞄速度,如果自瞄乱晃就调高,这个是根据游戏灵敏度修正的,灵敏度高则需要调高。
}
}
else
{
aimBot.bLook
=
false;
aimBot.dwObj
=
0
;
aimBot.dwObjMesh
=
0
;
aimBot.Value1
=
0
;
aimBot.Value2
=
0
;
}
}
}
BOOL
APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) start,NULL,NULL,NULL);
break
;
case DLL_PROCESS_DETACH:
break
;
}
return
TRUE;
}