HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 27.04.2024, 01:29
Lance_Sterling
Познавший АНТИЧАТ
Регистрация: 12.01.2023
Сообщений: 1,016
С нами: 1757019

Репутация: 88


По умолчанию

пытался хукнуть endScene, и у меня это получилось, сделал через дравлист отрисовку текста, и эта ***ня мерцает, и *** знает вообще что с ней происходит (без дравлиста тоже самое)

C++:





Код:
#include "includes.h"
#include 
#ifdef _WIN64
#define GWL_WNDPROC GWLP_WNDPROC
#endif
extern
LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
EndScene oEndScene
=
NULL
;
WNDPROC oWndProc
;
static
HWND window
=
NULL
;
bool
menu
=
false
;
void
InitImGui
(
LPDIRECT3DDEVICE9 pDevice
)
{
ImGui
::
CreateContext
(
)
;
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
io
.
ConfigFlags
=
ImGuiConfigFlags_NoMouseCursorChange
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NavEnableKeyboard
;
io
.
ConfigFlags
|=
ImGuiConfigFlags_NavEnableGamepad
;
io
.
Fonts
->
AddFontFromFileTTF
(
"ImGui/Montserrat-SemiBold.ttf"
,
18
)
;
ImGuiStyle
&
style
=
ImGui
::
GetStyle
(
)
;
style
.
WindowRounding
=
10.0f
;
style
.
GrabRounding
=
10.0f
;
style
.
FrameRounding
=
10.0f
;
ImGui
::
StyleColorsLight
(
)
;
ImGui_ImplWin32_Init
(
window
)
;
ImGui_ImplDX9_Init
(
pDevice
)
;
}
bool
init
=
false
;
long
__stdcall
hkEndScene
(
LPDIRECT3DDEVICE9 pDevice
)
{
if
(
!
init
)
{
InitImGui
(
pDevice
)
;
init
=
true
;
}
ImGuiIO
&
io
=
ImGui
::
GetIO
(
)
;
(
void
)
io
;
if
(
GetAsyncKeyState
(
VK_F9
)
)
{
menu
=
!
menu
;
}
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
if
(
menu
)
{
ImDrawList
*
dl
=
ImGui
::
GetBackgroundDrawList
(
)
;
char
buffer
[
256
]
;
sprintf_s
(
buffer
,
sizeof
(
buffer
)
,
"Application average %.3f ms/frame (%.1f FPS)"
,
1000.0f
/
io
.
Framerate
,
io
.
Framerate
)
;
dl
->
AddText
(
{
100
,
100
}
,
-
1
,
buffer
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
return
oEndScene
(
pDevice
)
;
}
LRESULT __stdcall
WndProc
(
const
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
true
&&
ImGui_ImplWin32_WndProcHandler
(
hWnd
,
uMsg
,
wParam
,
lParam
)
)
return
true
;
return
CallWindowProc
(
oWndProc
,
hWnd
,
uMsg
,
wParam
,
lParam
)
;
}
BOOL CALLBACK
EnumWindowsCallback
(
HWND handle
,
LPARAM lParam
)
{
DWORD wndProcId
;
GetWindowThreadProcessId
(
handle
,
&
wndProcId
)
;
if
(
GetCurrentProcessId
(
)
!=
wndProcId
)
return
TRUE
;
// skip to next window
window
=
handle
;
return
FALSE
;
// window found abort search
}
HWND
GetProcessWindow
(
)
{
window
=
NULL
;
EnumWindows
(
EnumWindowsCallback
,
NULL
)
;
return
window
;
}
DWORD WINAPI
MainThread
(
LPVOID lpReserved
)
{
bool
attached
=
false
;
do
{
if
(
kiero
::
init
(
kiero
::
RenderType
::
D3D9
)
==
kiero
::
Status
::
Success
)
{
kiero
::
bind
(
42
,
(
void
*
*
)
&
oEndScene
,
hkEndScene
)
;
window
=
GetProcessWindow
(
)
;
oWndProc
=
(
WNDPROC
)
SetWindowLongPtr
(
window
,
GWL_WNDPROC
,
(
LONG_PTR
)
WndProc
)
;
attached
=
true
;
}
}
while
(
!
attached
)
;
return
TRUE
;
}
BOOL WINAPI
DllMain
(
HMODULE hMod
,
DWORD dwReason
,
LPVOID lpReserved
)
{
switch
(
dwReason
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hMod
)
;
CreateThread
(
nullptr
,
0
,
MainThread
,
hMod
,
0
,
nullptr
)
;
break
;
case
DLL_PROCESS_DETACH
:
kiero
::
shutdown
(
)
;
break
;
}
return
TRUE
;
}


p.s. без темы, без rounding, и без шрифта тоже самое

видео:
 
Ответить с цитированием

  #2  
Старый 27.04.2024, 03:43
ARMOR
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами: 3831395

Репутация: 183


По умолчанию

Где ты этот код раздобыл то? Зачем тебе проверка на нажатие в endScene если у тебя уже есть хукнутый wndProc? Ты можешь получать HWND из самой игры, а не через самописные функции ( Просто легче намного ).

Вот код с использованием kthook который нормально работает с endScene:

C++:





Код:
#include 
#include 
#include 
#include 
#include "imgui.h"
#include "imgui_impl_dx9.h"
#include "imgui_impl_win32.h"
using
CTimer__UpdateSignature
=
void
(
__cdecl
*
)
(
)
;
using
EndSceneSignature
=
HRESULT
(
__stdcall
*
)
(
IDirect3DDevice9
*
)
;
using
ResetSignature
=
HRESULT
(
__stdcall
*
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
using
WndProcSignature
=
HRESULT
(
__stdcall
*
)
(
HWND
,
UINT
,
WPARAM
,
LPARAM
)
;
kthook
::
kthook_simple

CTimerHook
{
}
;
kthook
::
kthook_signal

EndSceneHook
{
}
;
kthook
::
kthook_signal

ResetHook
{
}
;
kthook
::
kthook_simple

WndProcHook
{
}
;
extern
IMGUI_IMPL_API LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hwnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
HRESULT
WndProc
(
const
decltype
(
WndProcHook
)
&
hook
,
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
ImGui_ImplWin32_WndProcHandler
(
hwnd
,
uMsg
,
wParam
,
lParam
)
)
{
return
1
;
}
return
hook
.
get_trampoline
(
)
(
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
std
::
optional

D3D9EndScene
(
const
decltype
(
EndSceneHook
)
&
hook
,
IDirect3DDevice9
*
pDevice
)
{
static
bool
ImGuiInit
{
}
;
if
(
!
ImGuiInit
)
{
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
*
*
reinterpret_cast

(
0xC17054
)
)
;
ImGui_ImplDX9_Init
(
pDevice
)
;
ImGui
::
GetIO
(
)
.
IniFilename
=
nullptr
;
#pragma warning(push)
#pragma warning(disable: 4996)
std
::
string font
{
getenv
(
"WINDIR"
)
}
;
font
+=
"\\Fonts\\Arialbd.TTF"
;
#pragma warning(pop)
ImGui
::
GetIO
(
)
.
Fonts
->
AddFontFromFileTTF
(
font
.
c_str
(
)
,
14.0f
,
NULL
,
ImGui
::
GetIO
(
)
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
auto
latest_wndproc_ptr
=
GetWindowLongPtrW
(
*
*
reinterpret_cast

(
0xC17054
)
,
GWLP_WNDPROC
)
;
WndProcHook
.
set_dest
(
latest_wndproc_ptr
)
;
WndProcHook
.
set_cb
(
&
WndProc
)
;
WndProcHook
.
install
(
)
;
ImGuiInit
=
{
true
}
;
}
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
auto
dl
=
ImGui
::
GetBackgroundDrawList
(
)
;
dl
->
AddText
(
ImVec2
(
200.f
,
200.f
)
,
-
1
,
"WORK"
)
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
return
std
::
nullopt
;
}
std
::
optional

D3D9Lost
(
const
decltype
(
ResetHook
)
&
hook
,
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentParams
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
return
std
::
nullopt
;
}
void
D3D9Reset
(
const
decltype
(
ResetHook
)
&
hook
,
HRESULT
&
return_value
,
IDirect3DDevice9
*
device_ptr
,
D3DPRESENT_PARAMETERS
*
parameters
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
}
void
setD3D9Hooks
(
)
{
DWORD pDevice
=
*
reinterpret_cast

(
0xC97C28
)
;
void
*
*
vTable
=
*
reinterpret_cast

(
pDevice
)
;
EndSceneHook
.
set_dest
(
vTable
[
42
]
)
;
EndSceneHook
.
before
.
connect
(
&
D3D9EndScene
)
;
EndSceneHook
.
install
(
)
;
ResetHook
.
set_dest
(
vTable
[
16
]
)
;
ResetHook
.
before
.
connect
(
&
D3D9Lost
)
;
ResetHook
.
after
.
connect
(
&
D3D9Reset
)
;
ResetHook
.
install
(
)
;
}
void
CTimer__Update
(
const
decltype
(
CTimerHook
)
&
hook
)
{
static
bool
init
{
}
;
if
(
!
init
)
{
setD3D9Hooks
(
)
;
init
=
{
true
}
;
}
hook
.
get_trampoline
(
)
(
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
CTimerHook
.
set_dest
(
0x561B10
)
;
CTimerHook
.
set_cb
(
&
CTimer__Update
)
;
CTimerHook
.
install
(
)
;
break
;
case
DLL_PROCESS_DETACH
:
WndProcHook
.
remove
(
)
;
ResetHook
.
remove
(
)
;
EndSceneHook
.
remove
(
)
;
CTimerHook
.
remove
(
)
;
break
;
}
return
TRUE
;
}
 
Ответить с цитированием

  #3  
Старый 27.04.2024, 09:07
Lance_Sterling
Познавший АНТИЧАТ
Регистрация: 12.01.2023
Сообщений: 1,016
С нами: 1757019

Репутация: 88


По умолчанию

Цитата:
Сообщение от ARMOR  

Где ты этот код раздобыл то? Зачем тебе проверка на нажатие в endScene если у тебя уже есть хукнутый wndProc? Ты можешь получать HWND из самой игры, а не через самописные функции ( Просто легче намного ).

Вот код с использованием kthook который нормально работает с endScene:

C++:





Код:
#include 
#include 
#include 
#include 
#include "imgui.h"
#include "imgui_impl_dx9.h"
#include "imgui_impl_win32.h"
using
CTimer__UpdateSignature
=
void
(
__cdecl
*
)
(
)
;
using
EndSceneSignature
=
HRESULT
(
__stdcall
*
)
(
IDirect3DDevice9
*
)
;
using
ResetSignature
=
HRESULT
(
__stdcall
*
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
using
WndProcSignature
=
HRESULT
(
__stdcall
*
)
(
HWND
,
UINT
,
WPARAM
,
LPARAM
)
;
kthook
::
kthook_simple

CTimerHook
{
}
;
kthook
::
kthook_signal

EndSceneHook
{
}
;
kthook
::
kthook_signal

ResetHook
{
}
;
kthook
::
kthook_simple

WndProcHook
{
}
;
extern
IMGUI_IMPL_API LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hwnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
HRESULT
WndProc
(
const
decltype
(
WndProcHook
)
&
hook
,
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
ImGui_ImplWin32_WndProcHandler
(
hwnd
,
uMsg
,
wParam
,
lParam
)
)
{
return
1
;
}
return
hook
.
get_trampoline
(
)
(
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
std
::
optional

D3D9EndScene
(
const
decltype
(
EndSceneHook
)
&
hook
,
IDirect3DDevice9
*
pDevice
)
{
static
bool
ImGuiInit
{
}
;
if
(
!
ImGuiInit
)
{
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
*
*
reinterpret_cast

(
0xC17054
)
)
;
ImGui_ImplDX9_Init
(
pDevice
)
;
ImGui
::
GetIO
(
)
.
IniFilename
=
nullptr
;
#pragma warning(push)
#pragma warning(disable: 4996)
std
::
string font
{
getenv
(
"WINDIR"
)
}
;
font
+=
"\\Fonts\\Arialbd.TTF"
;
#pragma warning(pop)
ImGui
::
GetIO
(
)
.
Fonts
->
AddFontFromFileTTF
(
font
.
c_str
(
)
,
14.0f
,
NULL
,
ImGui
::
GetIO
(
)
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
auto
latest_wndproc_ptr
=
GetWindowLongPtrW
(
*
*
reinterpret_cast

(
0xC17054
)
,
GWLP_WNDPROC
)
;
WndProcHook
.
set_dest
(
latest_wndproc_ptr
)
;
WndProcHook
.
set_cb
(
&
WndProc
)
;
WndProcHook
.
install
(
)
;
ImGuiInit
=
{
true
}
;
}
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
auto
dl
=
ImGui
::
GetBackgroundDrawList
(
)
;
dl
->
AddText
(
ImVec2
(
200.f
,
200.f
)
,
-
1
,
"WORK"
)
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
return
std
::
nullopt
;
}
std
::
optional

D3D9Lost
(
const
decltype
(
ResetHook
)
&
hook
,
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentParams
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
return
std
::
nullopt
;
}
void
D3D9Reset
(
const
decltype
(
ResetHook
)
&
hook
,
HRESULT
&
return_value
,
IDirect3DDevice9
*
device_ptr
,
D3DPRESENT_PARAMETERS
*
parameters
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
}
void
setD3D9Hooks
(
)
{
DWORD pDevice
=
*
reinterpret_cast

(
0xC97C28
)
;
void
*
*
vTable
=
*
reinterpret_cast

(
pDevice
)
;
EndSceneHook
.
set_dest
(
vTable
[
42
]
)
;
EndSceneHook
.
before
.
connect
(
&
D3D9EndScene
)
;
EndSceneHook
.
install
(
)
;
ResetHook
.
set_dest
(
vTable
[
16
]
)
;
ResetHook
.
before
.
connect
(
&
D3D9Lost
)
;
ResetHook
.
after
.
connect
(
&
D3D9Reset
)
;
ResetHook
.
install
(
)
;
}
void
CTimer__Update
(
const
decltype
(
CTimerHook
)
&
hook
)
{
static
bool
init
{
}
;
if
(
!
init
)
{
setD3D9Hooks
(
)
;
init
=
{
true
}
;
}
hook
.
get_trampoline
(
)
(
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
CTimerHook
.
set_dest
(
0x561B10
)
;
CTimerHook
.
set_cb
(
&
CTimer__Update
)
;
CTimerHook
.
install
(
)
;
break
;
case
DLL_PROCESS_DETACH
:
WndProcHook
.
remove
(
)
;
ResetHook
.
remove
(
)
;
EndSceneHook
.
remove
(
)
;
CTimerHook
.
remove
(
)
;
break
;
}
return
TRUE
;
}

На ютубе, было у многих англоязычных челов и у одного русского. Попробую такой подход, если че напишу

хорошо поебавшись у меня скомпилился плагин:

 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.