Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывает функция OpenProcess, Функция OpenProcess не возвращает HANDLE 
V
    Опции темы
seculorum
Дата 10.8.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Имеется приложение. Приложение должно выполнять следующие задачи:
-парсить файл и находить номера LBA(реализованно). 
-обращаться к окну другого приложения(вводить в поле найденный номер LBA) и пожимать сочетание горячих клавиш ctrl+G, до тех пор, пока надпись в панели статус бара другого приложения не примет требуемое значение. 
При выполнении программы не срабатывают функции SendMessage() для сообщений WM_SETTEXT (для передачи текста в TEdit), не срабатывает сочетание горячих клавиш, а также не происходит чтения строк из панели статус бара. При просмотре отладчиком видно что хэндлы всех необходимых компонентов находятся правильно (хэндлы найденные функциями в программе совпадают с хендлами полученными про помощи WinSigth32). Приложение правильно выполняет свои функции при проверке работы с окнами Notepad(изменение хэндлов для проверки работы функции).
Код всего приложения представлен ниже:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include "Unit1.h"
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1          *Form1;
HWND            hwnd;
int             iRes;
char            szText[200];
DWORD           ReadLBA(AnsiString LBANum);
AnsiString      ReadSBPanel(int PanelNum);
void GetPanelText(HWND hwndTaskbar, int iNum, char *szText, UINT iMax);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        
}
//---------------------------------------------------------------------------
DWORD           ReadLBA(AnsiString LBANum)
{
        HWND hEdit;
        hEdit = FindWindow("TfrmEditSector", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TToolBar", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TPanel", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TEdit", NULL);
        iRes = SendMessage(hEdit, WM_SETTEXT, 0, (int)LBANum.c_str());
        hEdit = FindWindow("TfrmEditSector", NULL);
        do
        {

                 iRes = PostMessage(hEdit,WM_KEYDOWN,VK_CONTROL,0);
                 iRes = PostMessage(hEdit,WM_KEYDOWN,'G',0);
                 iRes = PostMessage(hEdit,WM_KEYUP,'G',0);
                 iRes = PostMessage(hEdit,WM_KEYUP,VK_CONTROL,0);
                 Sleep(StrToInt(Form1->Edit1->Text));
                 GetPanelText(hwnd, 4, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 3, szText, 200);
                 ShowMessage(szText);
         GetPanelText(hwnd, 2, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 1, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 0, szText, 200);
                 ShowMessage(szText);
        }
        while (szText[0] != 'L');
};
//---------------------------------------------------------------------------
void GetPanelText(HWND hwndStatusBar, int iNum, char *szText, UINT iMax)
{
        DWORD d;
        char **lp;
        hwndStatusBar = FindWindow("TfrmEditSector", NULL);
        hwndStatusBar = FindWindowEx(hwndStatusBar,NULL,"TframeHexEditor", NULL);
        hwndStatusBar = FindWindowEx(hwndStatusBar, NULL, "TStatusBar", NULL);

        DWORD RES;

        RES = GetWindowThreadProcessId(hwndStatusBar, &d);

        HANDLE h = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, d);

        lp = (LPSTR*)VirtualAllocEx(h, NULL, iMax, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

        memset(szText, 0, iMax);

        WriteProcessMemory(h, (LPVOID)lp, szText, iMax, NULL);

        SendMessage(hwndStatusBar, SB_GETTEXT, iNum, (LPARAM)lp);

        ReadProcessMemory(h, (LPVOID)lp, szText, iMax, 0l);

        VirtualFreeEx(h, lp, 0, MEM_RELEASE);

        CloseHandle(h);
};


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        hwnd = FindWindow("TfrmEditSector", NULL);
        hwnd = FindWindowEx(hwnd,NULL,"TframeHexEditor", NULL);
        hwnd = FindWindowEx(hwnd,NULL,"TStatusBar", NULL);

        if (!FileExists("my.log")) ShowMessage("No log");

        Form1->Memo1->Lines->LoadFromFile("my.log");

        int j = 0;

        while (j < Form1->Memo1->Lines->Capacity)
        {
                if (Form1->Memo1->Lines->Strings[j].c_str()[2] == 'L')
                {
                        AnsiString LBANumber = "";
                        int i = 9;
                        char c = Form1->Memo1->Lines->Strings[j].c_str()[i];
                        while (isspace(c) || isdigit(c))
                                {
                                        if (isdigit(c)) LBANumber += c;
                                        i++;
                                        c = Form1->Memo1->Lines->Strings[j].c_str()[i];
                                }
                                ReadLBA(LBANumber);
                }
                j++;
        }
        Application->Terminate();        
}
//---------------------------------------------------------------------------

Если возможно прошу объяснить мне возможные причины некорректной работы программы и пути их преодоления. Желательно с изменениями к данному коду.  smile 


Это сообщение отредактировал(а) seculorum - 10.8.2011, 16:35
PM MAIL   Вверх
bass
Дата 12.8.2011, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Цитата(seculorum @ 10.8.2011,  16:33)
Имеется приложение. Приложение должно выполнять следующие задачи:
-парсить файл и находить номера LBA(реализованно). 
-обращаться к окну другого приложения(вводить в поле найденный номер LBA) и пожимать сочетание горячих клавиш ctrl+G, до тех пор, пока надпись в панели статус бара другого приложения не примет требуемое значение. 
При выполнении программы не срабатывают функции SendMessage() для сообщений WM_SETTEXT (для передачи текста в TEdit), не срабатывает сочетание горячих клавиш, а также не происходит чтения строк из панели статус бара. При просмотре отладчиком видно что хэндлы всех необходимых компонентов находятся правильно (хэндлы найденные функциями в программе совпадают с хендлами полученными про помощи WinSigth32). Приложение правильно выполняет свои функции при проверке работы с окнами Notepad(изменение хэндлов для проверки работы функции).
Код всего приложения представлен ниже:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include "Unit1.h"
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1          *Form1;
HWND            hwnd;
int             iRes;
char            szText[200];
DWORD           ReadLBA(AnsiString LBANum);
AnsiString      ReadSBPanel(int PanelNum);
void GetPanelText(HWND hwndTaskbar, int iNum, char *szText, UINT iMax);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        
}
//---------------------------------------------------------------------------
DWORD           ReadLBA(AnsiString LBANum)
{
        HWND hEdit;
        hEdit = FindWindow("TfrmEditSector", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TToolBar", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TPanel", NULL);
        hEdit = FindWindowEx(hEdit, NULL, "TEdit", NULL);
        iRes = SendMessage(hEdit, WM_SETTEXT, 0, (int)LBANum.c_str());
        hEdit = FindWindow("TfrmEditSector", NULL);
        do
        {

                 iRes = PostMessage(hEdit,WM_KEYDOWN,VK_CONTROL,0);
                 iRes = PostMessage(hEdit,WM_KEYDOWN,'G',0);
                 iRes = PostMessage(hEdit,WM_KEYUP,'G',0);
                 iRes = PostMessage(hEdit,WM_KEYUP,VK_CONTROL,0);
                 Sleep(StrToInt(Form1->Edit1->Text));
                 GetPanelText(hwnd, 4, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 3, szText, 200);
                 ShowMessage(szText);
         GetPanelText(hwnd, 2, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 1, szText, 200);
                 ShowMessage(szText);
                 GetPanelText(hwnd, 0, szText, 200);
                 ShowMessage(szText);
        }
        while (szText[0] != 'L');
};
//---------------------------------------------------------------------------
void GetPanelText(HWND hwndStatusBar, int iNum, char *szText, UINT iMax)
{
        DWORD d;
        char **lp;
        hwndStatusBar = FindWindow("TfrmEditSector", NULL);
        hwndStatusBar = FindWindowEx(hwndStatusBar,NULL,"TframeHexEditor", NULL);
        hwndStatusBar = FindWindowEx(hwndStatusBar, NULL, "TStatusBar", NULL);

        DWORD RES;

        RES = GetWindowThreadProcessId(hwndStatusBar, &d);

        HANDLE h = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, d);

        lp = (LPSTR*)VirtualAllocEx(h, NULL, iMax, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

        memset(szText, 0, iMax);

        WriteProcessMemory(h, (LPVOID)lp, szText, iMax, NULL);

        SendMessage(hwndStatusBar, SB_GETTEXT, iNum, (LPARAM)lp);

        ReadProcessMemory(h, (LPVOID)lp, szText, iMax, 0l);

        VirtualFreeEx(h, lp, 0, MEM_RELEASE);

        CloseHandle(h);
};


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        hwnd = FindWindow("TfrmEditSector", NULL);
        hwnd = FindWindowEx(hwnd,NULL,"TframeHexEditor", NULL);
        hwnd = FindWindowEx(hwnd,NULL,"TStatusBar", NULL);

        if (!FileExists("my.log")) ShowMessage("No log");

        Form1->Memo1->Lines->LoadFromFile("my.log");

        int j = 0;

        while (j < Form1->Memo1->Lines->Capacity)
        {
                if (Form1->Memo1->Lines->Strings[j].c_str()[2] == 'L')
                {
                        AnsiString LBANumber = "";
                        int i = 9;
                        char c = Form1->Memo1->Lines->Strings[j].c_str()[i];
                        while (isspace(c) || isdigit(c))
                                {
                                        if (isdigit(c)) LBANumber += c;
                                        i++;
                                        c = Form1->Memo1->Lines->Strings[j].c_str()[i];
                                }
                                ReadLBA(LBANumber);
                }
                j++;
        }
        Application->Terminate();        
}
//---------------------------------------------------------------------------

Если возможно прошу объяснить мне возможные причины некорректной работы программы и пути их преодоления. Желательно с изменениями к данному коду.  smile

В вопросе стоит что опен процес не работаеть ..... Если да то скорей всего привелегий нехватаеть его открыть.....

TOKEN_PRIVILEGES Priv, PrivOld;
DWORD cbPriv = sizeof(PrivOld);
HANDLE hToken;

if (!OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE, &hToken))
{
if (GetLastError() != ERROR_NO_TOKEN){return ;}
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hToken)){return ;}
}
Priv.PrivilegeCount = 1;
Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);

if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv),&PrivOld, &cbPriv))
{CloseHandle(hToken);return ;}

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{CloseHandle(hToken);return ;}
PM MAIL   Вверх
seculorum
Дата 12.8.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Спасибо, будем тестить smile Еще нашел интересную статью на хабре по поводу доступа к чужим процессам... http://habrahabr.ru/blogs/cpp/93437/

Это сообщение отредактировал(а) seculorum - 12.8.2011, 08:34
PM MAIL   Вверх
Estranged
Дата 13.8.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: 3
Всего: 3



HANDLE h = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, d);
DWORD dwLastErr = GetLastError ();
Какой код возвращает?
PM MAIL   Вверх
seculorum
Дата 13.8.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



GetLastError возвращает 2. Метод предложенный bass'ом заработал, но не во всех случаях... Если программа запускается не под админом, все еще нет возможности доступа к требуемым полям... И прежние ошибки... Появилась идея вставить в код сплоит, который позволит запускать программу под правами администратора, ибо как показали исследования 3 дней функции для таких трюков отсутствуют... Спасибо всем за содействие. Тему считаю закрытой...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0984 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.