Несколько дней назад мне понадобилось реализовать авто заполнение логина и пароля.
Вот то, что из этого получилось:
Поля ввода
являются объектами класса gui_InputLine и имеют такие id: LOGIN_ID_INPUTLINE, LOGIN_PW_INPUTLINE.
Задать им необходимые значения проще всего установив сплайс на конструктор данного класса (экспортируемая функция из GUI.dll gui_InputLine::gui_InputLine(gui_Base *,char const *))
с помощью функции gui_InputLine::SetInputText(char const *).
Code:
#include <Windows.h>
#include "../externalModules/spliceHookClass.h"
#include "dbgLib.h"
const char nameInputLineID [] = "LOGIN_ID_INPUTLINE";
const char passInputLineID [] = "LOGIN_PW_INPUTLINE";
DWORD setInputText;
DWORD inputLineConstrOrig;
spliceHook inputLineConstrHk;
DWORD stage = 0;
static char login [4096];
static char password [4096];
void __declspec(naked) constructorSplice()
{
DWORD parentItem;
char * newItemId;
DWORD pThis;
DWORD result;
//инициализация
_asm
{
//пролог ф-и
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
//и сохранение необходимых значений (this и параметры)
mov eax, [ebp+0x8]
mov [parentItem],eax
mov eax, [ebp+0xC]
mov [newItemId],eax
mov [pThis],ecx
}
//сравнение id элемента с искомым
if(stage == 0 &&!strcmp(nameInputLineID,newItemId))
stage = 1;
else if(stage == 1 && !strcmp(passInputLineID,newItemId))
stage = 2;
//вызов оригинальной функции и сохранение результатов вызова
_asm
{
mov ecx,[pThis]
push [newItemId]
push [parentItem]
call [inputLineConstrOrig]
mov [result],eax
}
//установка логина
if(stage == 1)
{
_asm
{
mov ecx,[result]
lea eax, login
push eax
call [setInputText]
mov eax,[result]
mov ecx,[pThis]
mov esp,ebp
pop ebp
retn 8
}
}
//установка пароля и завершение работы
if(stage == 2)
{
_asm
{
mov ecx,[result]
lea eax, password
push eax
call [setInputText]
}
inputLineConstrHk.UnHook();
_asm
{
mov eax,[result]
mov ecx,[pThis]
mov esp,ebp
pop ebp
retn 8
}
}
}
void fillLoginData(const char * pLogin, const char * pPassword)
{
strcpy(login,pLogin);
strcpy(password,pPassword);
HMODULE hDll = GetModuleHandleA("GUI.dll");
dbgBreak(!hDll);
DWORD inputLineConstr = (DWORD)GetProcAddress(hDll,"??0gui_InputLine@@QAE@PAVgui_Base@@PBD@Z");
dbgBreak(!inputLineConstr);
setInputText = (DWORD)GetProcAddress(hDll,"?SetInputText@gui_InputLine@@QAEXPBD@Z");
dbgBreak(!setInputText);
inputLineConstrOrig = inputLineConstrHk.Hook((PTR)inputLineConstr,(PTR)constructorSplice);
}