Код (Text): BOOL __stdcall MyPeekMessageA(tagMSG *msg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { BOOL ret; // esi@1 signed int v6; // eax@4 signed int v8; // eax@6 ret = ((int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(TruePeekMessageA + 48))( msg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if ( ret ) { if ( msg->message == WM_KEYDOWN ) { v8 = sub_10001590(msg->wParam); if ( v8 >= 0 ) InterestingKeysBuffer[4 * v8] = 1; } else { if ( msg->message == 257 ) // WM_KEYUP { v6 = sub_10001590(msg->wParam); if ( v6 >= 0 ) { InterestingKeysBuffer[4 * v6] = 2; return ret; } } } } return ret; } Код (Text): 000A118 ; DWORD dwMilliseconds .bss:1000A118 dwMilliseconds dd 4E20h ; DATA XREF: StartAddressOfThread+12r .bss:1000A11C ; char byte_1000A11C[] .bss:1000A11C byte_1000A11C db 0Dh ; DATA XREF: sub_10001590:loc_100015A0r .bss:1000A11D ; char InterestingKeysBuffer[] .bss:1000A11D InterestingKeysBuffer dd 6D010000h ; DATA XREF: MyPeekMessageA+48w .bss:1000A11D ; MyPeekMessageA+67w ... .bss:1000A121 db 0 .bss:1000A122 db 0 .bss:1000A123 db 2 .bss:1000A124 db 69h Как записать значения в массив InterestingKeysBuffer[] из подгружаемой длл? Код (Text): BOOL InternalSendVkey(WORD vk) { DebugPrintF("BOOL InternalSendVkey(WORD vk)"); char** ptr; signed int ret; ret = ExternalWorkKBuff(vk);//sub_10001590 вызывается по указателю(без проблем) DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret); if ( ret >= 0 ) { ptr=(char*)0x1000A11D; ptr[4 * ret] = 1; } ret = ExternalWorkKBuff(vk);//sub_10001590 DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret); if ( ret >= 0 ) { ptr=(char*)0x1000A11D; ptr[4 * ret] = 2; } return true; } ??
Код (Text): ret = ExternalWorkKBuff(vk); DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret); if ( ret >= 0 ) { pointer=(char*)0x1000A11D? __asm { mov byte ptr pointer[ret*4], 1 } } поидее так. Поправьте если туплю. Но при реальном вводе с клавы ввод проходит а так нет. PS: Код (Text): signed int __cdecl sub_10001590(WPARAM bVK) { signed int result; // eax@1 result = 0; while ( bVK != (unsigned __int8)byte_1000A11C[4 * result] ) { ++result; if ( result >= 13 ) return -1; } return result; }
вот база иды а вот начало http://wasm.ru/forum/viewtopic.php?id=39072 там и сами файлы есть Задача: эмуляция ввода
Код (Text): bool InternalSendVkey(WORD vk) { MSG msg; ZeroMemory(&msg,sizeof(msg)); msg.message=WM_KEYDOWN; msg.wParam=vk; mess_stub(&msg,NULL,NULL,NULL,NULL); return true; } signed int __cdecl sub_10001590(WPARAM bVK) { char* some_buffer=(char*)0x1000A11C; __asm { mov ecx, [esp+4] xor eax, eax jmp short loc_100015A0 nop nop nop nop nop loc_100015A0: movzx edx, some_buffer[eax*4] cmp ecx, edx jz short locret_100015B5 inc eax cmp eax, 0Dh jl short loc_100015A0 or eax, 0FFFFFFFFh locret_100015B5: retn } } BOOL mess_stub(MSG *msg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { DebugPrintF("BOOL InternalSendVkey(WORD vk)"); char* InterestingKeysBuffer=(char*)0x1000A11D; __asm { mov eax, [edi+4] sub eax, 100h jz short loc_10001617 dec eax jnz short loc_1000162F mov eax, [edi+8] push eax add esp, 4 test eax, eax jl short loc_1000162F pop edi mov eax, esi pop esi retn 14h loc_10001617: mov ecx, [edi+8] push ecx call sub_10001590 add esp, 4 test eax, eax jl short loc_1000162F mov byte ptr InterestingKeysBuffer[eax*4], 1 loc_1000162F: pop edi mov eax, esi pop esi retn 14h } } ?????Так падает с аксес вилоатион.char* InterestingKeysBuffer=(char*)0x1000A11D; адреса валидные
вопрос в догонку как такое может быть Код (Text): #define VK_DIVIDE 0x6F Код (Text): bool InternalSendVkey(WORD vk) { MSG msg; GenerateKeyService(vk); while (PeekMessage(&msg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE)) { DebugPrintF("Deleting messages: %x vKey %x",msg.message,msg.wParam); } return true; } Код (Text): void GenerateKeyService ( WORD vk) { INPUT inpt[1]; DWORD64 tmpXMM0; int ret; __asm movq [tmpXMM0], xmm0; inpt[0].type=INPUT_KEYBOARD; inpt[0].ki.wVk=vk; inpt[0].ki.time=NULL; inpt[0].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[0].ki.wScan= MapVirtualKey(vk, 0); inpt[0].ki.dwFlags=NULL; inpt[1].type=INPUT_KEYBOARD; inpt[1].ki.wVk=vk; inpt[1].ki.time=NULL; inpt[1].ki.dwExtraInfo=GetMessageExtraInfo(); inpt[1].ki.wScan= MapVirtualKey(vk, 0); inpt[1].ki.dwFlags=KEYEVENTF_KEYUP; ret=SendInputServiceCall_sysenter(1,&inpt[0],sizeof(INPUT)); ret=SendInputServiceCall_sysenter(1,&inpt[1],sizeof(INPUT)); DebugPrintF("ret=SendInputServiceCall_sysenter=%x",ret); __asm movq xmm0, [tmpXMM0]; return; } Код (Text): int SendInputServiceCall_sysenter (UINT Count, LPINPUT Input, int SizeInput) { __asm { mov eax, NtUserSendInput push SizeInput push Input push Count push eax ; просто заполнитель до -8 push aa mov edx, esp sysenter aa: add esp, 16 ; очистка стека от временных переменных } } а вот лог: это результат: Код (Text): InternalSendVkey(VK_DIVIDE); InternalSendVkey(VK_DIVIDE); InternalSendVkey(VK_DIVIDE); InternalSendVkey(VK_DIVIDE); wm_keydown=0x100