Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2011, 22:51   #1
Chubi
 
Регистрация: 04.01.2011
Сообщений: 4
Вопрос Как получить Base address и поставить на хоткей паузу

Добрый день.

Имеется вот такой скрипт:

Код:
#include "windows.h"
#include <iostream>
using namespace std;


void GetDebugPriv()

{

HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );


LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue );

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );

CloseHandle( hToken );

}

HANDLE GetHandle(char *WindowName)

{

HANDLE hProcess;
DWORD dwPid;
HWND hwnd = ::FindWindow(0, WindowName); 

if (hwnd != 0)
{

GetWindowThreadProcessId(hwnd, &dwPid); 
GetDebugPriv(); 

hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); 


if (hProcess == NULL)
{

MessageBox(0, "Can't open process", 0, 0); 
exit(1);

}

}
else
{

MessageBox(0, "Can't find window", 0, 0);


exit(1);

}

return hProcess;

}



void main()
{
while(true)
{
HANDLE wow = GetHandle("World of Warcraft");
HMODULE hModule = 0;
LPTSTR Base = 0;
DWORD nSize = 260;
DWORD WINAPI GetModuleBaseName(HANDLE wow,HMODULE hModule,DWORD nSize);
cout << Base;
}
}
Что касается получения привилегий и HANDLE-функции, то это было найдено в инете.

Я хочу получить базовый адрес процесса wow.exe и базовый адрес модуля процесса wow.exe, библиотеки battle.net.dll.

Но что пока не очень получается, то что написал я, не работает и пишет :
Первый этап обработки исключения в "0x5409d540 (msvcr100d.dll)" в "wow2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".
Необработанное исключение в "0x5409d540 (msvcr100d.dll)" в "wow2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".

Вот, и второй вопрос:
Как вы видите получения базового адреса зациклено, я бы хотел узнать, как бы мне прикрутить туда хоткей, допустим на клавишу "ё" (но важно чтобы работало и на анг раскладке как "`") при нажатие которого, все вставало на паузу, а снималось с нее, только при повторном нажатии на "ё" или "`" ?
Chubi вне форума Ответить с цитированием
Старый 05.01.2011, 00:17   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

на какой строчке пишет? наскоко я помню хэндл процесса вовы можно получить только запустив вову прогой (в своем процессе помоему), уже непомню как это делается но при запуске каким-то вин-апишным методом там возвращается хэндл процесса
UltimaBeaR вне форума Ответить с цитированием
Старый 05.01.2011, 00:33   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
наскоко я помню хэндл процесса вовы можно получить только запустив вову прогой (в своем процессе помоему)
нет не только, можно и так как сделал ТС, можно через перечисление процессов
Цитата:
уже непомню как это делается но при запуске каким-то вин-апишным методом там возвращается хэндл процесса
CreateProcess в общем то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2011, 01:10   #4
Chubi
 
Регистрация: 04.01.2011
Сообщений: 4
По умолчанию

Вообще, у меня это все реализовано на AutoIt. Вот пример кода:
Код:
$pid = WinGetProcess('World of Warcraft')
$sModule = "Battle.net.dll"
$baseADDR = _MemoryModuleGetBaseAddress($pid, $sModule)
$sModule2 = "WoW.exe"
$baseADDR2 = _MemoryModuleGetBaseAddress($pid, $sModule2)
_MemoryModuleGetBaseAddress подгружается хэдером, сам хеадер:
Код:
Func _MemoryModuleGetBaseAddress($iPID, $sModule)
    If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)

    If Not IsString($sModule) Then Return SetError(2, 0, 0)

    Local   $PSAPI = DllOpen("psapi.dll")

    ;Get Process Handle
    Local   $hProcess
    Local   $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE

    If $iPID > 0 Then
        Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
        If $hProcess[0] Then
            $hProcess = $hProcess[0]
        EndIf
    EndIf

    ;EnumProcessModules
    Local   $Modules = DllStructCreate("ptr[1024]")
    Local   $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
    If $aCall[4] > 0 Then
        Local   $iModnum = $aCall[4] / 4
        Local   $aTemp
        For $i = 1 To $iModnum
            $aTemp =  DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
            If $aTemp[3] = $sModule Then
                DllClose($PSAPI)
                Return Ptr(DllStructGetData($Modules, 1, $i))
            EndIf
        Next
    EndIf

    DllClose($PSAPI)
    Return SetError(-1, 0, 0)

EndFunc
Может быть это как-то поможет делу ...

И вот функция с паузой, ее тоже очень важно как-то реализовать на с++:
Код:
HotKeySet("{ё}", "TogglePause")
HotKeySet("{`}", "TogglePause")

Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
    WEnd
EndFunc
Но ввиду того что с++ стал изучать только неделю назад, мне самому это не переделать в c++

2Пепел Феникса, а Вы не могли бы поподробней рассказать про какой-нибудь из перечисленный Вами способов ?
Chubi вне форума Ответить с цитированием
Старый 05.01.2011, 10:47   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Код:
DWORD WINAPI GetModuleBaseName(HANDLE wow,HMODULE hModule,DWORD nSize);
С каких пор так оформляется вызов функции?
p51x вне форума Ответить с цитированием
Старый 05.01.2011, 12:05   #6
Chubi
 
Регистрация: 04.01.2011
Сообщений: 4
По умолчанию

Хмм... спасибо за замечание =) Вообщем вот рабочий вариант:

Код:
void main()
{
while(true)
{
HANDLE wow = GetHandle("World of Warcraft");
HMODULE ahMod = NULL;
DWORD   dwNeeded;
if (EnumProcessModules (wow,&ahMod,sizeof(ahMod),&dwNeeded))
{
	cout << ahMod << endl;
	Sleep(10000);
}
}
}
Но как теперь сделать чтобы он мне показал базовый адрес библиотеки battle.net.dll ?

И пожалуйста ... прокомментируйте хотя бы в каком направлении нужно двигаться с паузой ! =)
Спасибо.

Последний раз редактировалось Chubi; 05.01.2011 в 18:24. Причина: Немного модифицировал код
Chubi вне форума Ответить с цитированием
Старый 05.01.2011, 20:00   #7
Chubi
 
Регистрация: 04.01.2011
Сообщений: 4
По умолчанию

Ура ! Сделал рабочий вариант и на battle.net.dll, так что остался только 1 вопрос, как сделать паузу с хоткеем?
Chubi вне форума Ответить с цитированием
Старый 20.12.2011, 07:33   #8
$!№9@r
Новичок
Джуниор
 
Регистрация: 20.12.2011
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Chubi Посмотреть сообщение
Ура ! Сделал рабочий вариант и на battle.net.dll, так что остался только 1 вопрос, как сделать паузу с хоткеем?
Ну дык в чем проблема

if (GetKeyState(Впиши суда свой хоткей) = 1)
{
Вставляй суда свой слипкод
}
else
{
.......
}

$!№9@r вне форума Ответить с цитированием
Старый 20.12.2011, 13:15   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от $!№9@r Посмотреть сообщение
Ну дык в чем проблема

//вы уверены, что здесь присвоение?
if (GetKeyState(Впиши суда свой хоткей) = 1)
{
Вставляй суда свой слипкод
}
else
{
.......
}


вы уверены, что здесь присвоение?
_Bers вне форума Ответить с цитированием
Старый 22.12.2011, 15:55   #10
$!№9@r
Новичок
Джуниор
 
Регистрация: 20.12.2011
Сообщений: 2
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
вы уверены, что здесь присвоение?
А голова ему для чего, пусть покумекает малех, или за него весь сорц выложить готовый...)))

ЗЫ. Чтобы небыло тупого копипаста...)))

$!№9@r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как организовать паузу/остановку при выполнении программы Manonia Общие вопросы .NET 3 06.07.2010 17:25
Озвучка. Как поставить паузу? Pti44ka Общие вопросы .NET 6 10.06.2010 00:03
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25
как сделать паузу (или задержку) в цыкле : с# Natok Помощь студентам 7 30.05.2009 12:55
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13