Есть некоторое приложение, в котором нажимая на кнопку получаем модальное окно с просьбой в одно текстовое поле ввести имя пользователя, а в другое - пароль. Задача: написать программу, которая бы вводила пароль и имя пользователя, а потом сама нажимала кнопку. Программе (исходник которой ниже) удалось только нажать кнопку. А вот заполнить текстовые поля - нет. Где ошибки в моём исходнике и как их исправить? | Код | #include <string.h> #include <stdio.h> #include <windows.h> #include <winuser.h>
// КОНФИГУРАЦИЯ #define MAX_STR 100 #define MY_NAME "StillPhelix" #define NAMEWIN "Password"
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ (некрасивно, но просто, хотя и безвкусно) HWND regnum = 0; HWND me_hwnd = 0; HWND hackreg = 0; HWND username = 0; HWND input_but = 0; int N = 0;
// ПЕРЕЧИСЛЕНИЕ ОКОН ВЕРХНЕГО УРОВНЯ // =========================================================================== // ищем окно с заголовком NAMEWIN и заносим его хэндл в гл. переменную me_hwnd BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { char buf[MAX_STR];
// читаем заголовок GetWindowText(hwnd, buf, MAX_STR - 1);
// это NAMEWIN? if (strstr(buf, NAMEWIN) == buf) { // получаем его hwnd и прекращаем просмотр окон me_hwnd = hwnd; return 0; }
// просмотр окон продолжается return 1; }
// ПЕРЕЧИСЛЕНИЕ ДОЧЕРНИХ ОКОН crackme // =========================================================================== // получаем хэндлы всех интересующих нас окон // (порядок окон определяем либо экпериментально, либо тестовым прогоном // с отладочным выводом информации по каждому из окон) BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam) {
switch(++N) { case 1: // конопка ввода input_but = hwnd; return 0;
case 4: // окно для ввода пароля regnum = hwnd; break;
case 5: // окно с именем пользователя username = hwnd; break;
case 6: // text со строкой "Password" hackreg = hwnd; break; } if(lParam == 0) EnumChildWindows(hwnd, EnumChildWindowsProc, 1); return 1; }
int main() { WORD TwoChar; unsigned char ch; char regnum_buf[100] = "]UMQAAI]MY"; char username_buf[100] = ""; int lenText;
// TITLE printf("autocrack for crackme.58DD2D69h.CPP by StillPhelix\n");
// перечисляем окна верхнего уровня в поиске нашего EnumWindows(&EnumWindowsProc, 0); if (me_hwnd == 0) { printf("-ERR: %s not running!\x7\n", NAMEWIN); return -1; }
// получаем хэнделы интересующих нас дочерних окон EnumChildWindows(me_hwnd, &EnumChildWindowsProc, 0);
// получаем имя пользователя и, если оно недостаточно длинное, // вводим имя по умолчанию lenText = GetWindowTextLength(username); // получит введенное имя GetWindowText(username, username_buf, lenText+1); if (strlen(username_buf)>=0xA); else { // имя слишком коротко, вводим в окно имя по умолчанию SendMessage(username, WM_SETFOCUS, 1, 0); SendMessage(username, WM_SETTEXT, 0, (LPARAM)MY_NAME); SendMessage(username, WM_KILLFOCUS, 1, 0); }
// вводим сгенерированный номер в окно ломаемого приложения SendMessage(regnum, WM_SETTEXT, 0, (LPARAM) regnum_buf);
// нажимаем на кнопку "Ввод" SendMessage(input_but, WM_SETFOCUS, 1, 0); SendMessage(input_but, BM_SETSTATE, 1, 0); PostMessage(input_but, WM_KILLFOCUS, 0, 0);
return 0; }
|
|