IDA need help

Тема в разделе "WASM.RESEARCH", создана пользователем punxer, 2 ноя 2010.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. BOOL __stdcall MyPeekMessageA(tagMSG *msg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
    2. {
    3.   BOOL ret; // esi@1
    4.   signed int v6; // eax@4
    5.   signed int v8; // eax@6
    6.  
    7.   ret = ((int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(TruePeekMessageA + 48))(
    8.           msg,
    9.           hWnd,
    10.           wMsgFilterMin,
    11.           wMsgFilterMax,
    12.           wRemoveMsg);
    13.   if ( ret )
    14.   {
    15.     if ( msg->message == WM_KEYDOWN )
    16.     {
    17.       v8 = sub_10001590(msg->wParam);
    18.       if ( v8 >= 0 )
    19.         InterestingKeysBuffer[4 * v8] = 1;
    20.     }
    21.     else
    22.     {
    23.       if ( msg->message == 257 )                // WM_KEYUP
    24.       {
    25.         v6 = sub_10001590(msg->wParam);
    26.         if ( v6 >= 0 )
    27.         {
    28.           InterestingKeysBuffer[4 * v6] = 2;
    29.           return ret;
    30.         }
    31.       }
    32.     }
    33.   }
    34.   return ret;
    35. }
    Код (Text):
    1. 000A118 ; DWORD dwMilliseconds
    2. .bss:1000A118 dwMilliseconds  dd 4E20h                ; DATA XREF: StartAddressOfThread+12r
    3. .bss:1000A11C ; char byte_1000A11C[]
    4. .bss:1000A11C byte_1000A11C   db 0Dh                  ; DATA XREF: sub_10001590:loc_100015A0r
    5. .bss:1000A11D ; char InterestingKeysBuffer[]
    6. .bss:1000A11D InterestingKeysBuffer dd 6D010000h      ; DATA XREF: MyPeekMessageA+48w
    7. .bss:1000A11D                                         ; MyPeekMessageA+67w ...
    8. .bss:1000A121                 db    0
    9. .bss:1000A122                 db    0
    10. .bss:1000A123                 db    2
    11. .bss:1000A124                 db 69h
    Как записать значения в массив InterestingKeysBuffer[] из подгружаемой длл?

    Код (Text):
    1. BOOL InternalSendVkey(WORD vk)
    2. {
    3.     DebugPrintF("BOOL InternalSendVkey(WORD vk)");
    4.     char**  ptr;
    5.            signed int ret;
    6.  
    7.     ret = ExternalWorkKBuff(vk);//sub_10001590 вызывается по указателю(без проблем)
    8.     DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret);
    9.     if ( ret >= 0 )
    10.     {
    11.         ptr=(char*)0x1000A11D;
    12.         ptr[4 * ret] = 1;
    13.     }
    14.     ret = ExternalWorkKBuff(vk);//sub_10001590
    15.     DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret);
    16.     if ( ret >= 0 )
    17.     {
    18.         ptr=(char*)0x1000A11D;
    19.         ptr[4 * ret] = 2;
    20.     }
    21.     return true;
    22.  
    23. }
    ??
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1.     ret = ExternalWorkKBuff(vk);
    2.     DebugPrintF("ExternalWorkKBuff(vk) returned: %d",ret);
    3.     if ( ret >= 0 )
    4.     {
    5.         pointer=(char*)0x1000A11D?
    6.  
    7.         __asm
    8.         {
    9.              mov     byte ptr pointer[ret*4], 1
    10.         }
    11.  
    12.        
    13.     }
    поидее так. Поправьте если туплю.
    Но при реальном вводе с клавы ввод проходит а так нет.
    PS:
    Код (Text):
    1. signed int __cdecl sub_10001590(WPARAM bVK)
    2. {
    3.   signed int result; // eax@1
    4.  
    5.   result = 0;
    6.   while ( bVK != (unsigned __int8)byte_1000A11C[4 * result] )
    7.   {
    8.     ++result;
    9.     if ( result >= 13 )
    10.       return -1;
    11.   }
    12.   return result;
    13. }
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    вот база иды
    а вот начало
    http://wasm.ru/forum/viewtopic.php?id=39072
    там и сами файлы есть

    Задача: эмуляция ввода
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. bool InternalSendVkey(WORD vk)
    2. {
    3.     MSG msg;
    4.     ZeroMemory(&msg,sizeof(msg));
    5.     msg.message=WM_KEYDOWN;
    6.     msg.wParam=vk;
    7.     mess_stub(&msg,NULL,NULL,NULL,NULL);
    8.     return true;
    9. }
    10.  
    11.  
    12. signed int __cdecl sub_10001590(WPARAM bVK)
    13. {
    14.     char* some_buffer=(char*)0x1000A11C;
    15.     __asm
    16.     {
    17.  
    18.                  mov     ecx, [esp+4]
    19.                  xor     eax, eax
    20.                  jmp     short loc_100015A0
    21.                  nop
    22.                  nop
    23.                  nop
    24.                  nop
    25.                  nop
    26. loc_100015A0:
    27.                  movzx   edx, some_buffer[eax*4]
    28.                  cmp     ecx, edx
    29.                  jz      short locret_100015B5
    30.                  inc     eax
    31.                  cmp     eax, 0Dh
    32.                  jl      short loc_100015A0
    33.                  or      eax, 0FFFFFFFFh
    34.  
    35.  locret_100015B5:                      
    36.                  retn
    37.  
    38.    
    39.    
    40.    
    41.     }
    42. }
    43.  
    44. BOOL mess_stub(MSG *msg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
    45. {
    46.     DebugPrintF("BOOL InternalSendVkey(WORD vk)");
    47.  
    48.     char*   InterestingKeysBuffer=(char*)0x1000A11D;
    49.     __asm
    50.     {
    51.        
    52.         mov     eax, [edi+4]
    53.         sub     eax, 100h
    54.         jz      short loc_10001617
    55.         dec     eax
    56.         jnz     short loc_1000162F
    57.         mov     eax, [edi+8]
    58.         push    eax
    59.         add     esp, 4
    60.         test    eax, eax
    61.         jl      short loc_1000162F
    62.         pop     edi
    63.         mov     eax, esi
    64.         pop     esi
    65.         retn    14h
    66.  
    67.  
    68.     loc_10001617:                          
    69.         mov     ecx, [edi+8]
    70.         push    ecx
    71.         call    sub_10001590
    72.         add     esp, 4
    73.         test    eax, eax
    74.         jl      short loc_1000162F
    75.         mov     byte ptr InterestingKeysBuffer[eax*4], 1
    76.     loc_1000162F:
    77.         pop     edi
    78.         mov     eax, esi
    79.         pop     esi
    80.         retn    14h
    81.     }
    82.  
    83. }
    ?????Так падает с аксес вилоатион.char* InterestingKeysBuffer=(char*)0x1000A11D; адреса валидные
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    вопрос в догонку
    как такое может быть
    Код (Text):
    1. #define VK_DIVIDE         0x6F
    Код (Text):
    1. bool InternalSendVkey(WORD vk)
    2. {
    3.     MSG msg;
    4.     GenerateKeyService(vk);
    5.     while (PeekMessage(&msg,NULL,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE))
    6.     {
    7.         DebugPrintF("Deleting messages: %x vKey %x",msg.message,msg.wParam);
    8.     }
    9.  
    10.     return true;
    11. }
    Код (Text):
    1. void GenerateKeyService ( WORD vk)
    2. {
    3.  
    4.  
    5.  
    6.     INPUT       inpt[1];
    7.     DWORD64     tmpXMM0;
    8.     int         ret;
    9.  
    10.     __asm movq [tmpXMM0], xmm0;
    11.  
    12.     inpt[0].type=INPUT_KEYBOARD;
    13.     inpt[0].ki.wVk=vk;
    14.     inpt[0].ki.time=NULL;
    15.     inpt[0].ki.dwExtraInfo=GetMessageExtraInfo();
    16.     inpt[0].ki.wScan=   MapVirtualKey(vk, 0);
    17.     inpt[0].ki.dwFlags=NULL;
    18.  
    19.     inpt[1].type=INPUT_KEYBOARD;
    20.     inpt[1].ki.wVk=vk;
    21.     inpt[1].ki.time=NULL;
    22.     inpt[1].ki.dwExtraInfo=GetMessageExtraInfo();
    23.     inpt[1].ki.wScan=   MapVirtualKey(vk, 0);
    24.     inpt[1].ki.dwFlags=KEYEVENTF_KEYUP;
    25.  
    26.     ret=SendInputServiceCall_sysenter(1,&inpt[0],sizeof(INPUT));
    27.     ret=SendInputServiceCall_sysenter(1,&inpt[1],sizeof(INPUT));
    28.    
    29.     DebugPrintF("ret=SendInputServiceCall_sysenter=%x",ret);
    30.    
    31.    
    32.  
    33.    
    34.  
    35.  
    36.     __asm movq xmm0, [tmpXMM0];
    37.     return;
    38. }
    Код (Text):
    1. int SendInputServiceCall_sysenter (UINT Count, LPINPUT Input, int SizeInput)
    2. {
    3.     __asm
    4.     {
    5.         mov eax, NtUserSendInput
    6.         push SizeInput
    7.         push Input
    8.         push Count
    9.         push eax    ; просто заполнитель до -8
    10.         push aa
    11.         mov edx, esp
    12.         sysenter
    13. aa:
    14.         add esp, 16    ; очистка стека от временных переменных
    15.     }
    16. }
    а вот лог:

    это результат:
    Код (Text):
    1.         InternalSendVkey(VK_DIVIDE);
    2.         InternalSendVkey(VK_DIVIDE);
    3.  
    4.         InternalSendVkey(VK_DIVIDE);
    5.         InternalSendVkey(VK_DIVIDE);
    wm_keydown=0x100