Какой параметр должна получить функция PostMessageA ???

Тема в разделе "WASM.RESEARCH", создана пользователем Alastor, 25 окт 2011.

  1. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Доброго времени всем форумчанам. Объясните пожалуйста, какие значения собственных параметров и откуда получит функция PostMessage?
    Понятно что какое-то ненулевое значение которое проверяется условием
    Код (Text):
    1. .text:0040145D                 test    eax, eax
    2. .text:0040145F                 jnz     short loc_401476
    Почитал описание функции, по сути PM может получать только хэндл окна, и доп.параметры, я думаю это как раз вот эти "String"
    Код (Text):
    1. .text:00401440                 push    eax             ; lpString2
    2. .text:00401441                 lea     ecx, [ebp+Str1]
    3. .text:00401447                 push    ecx             ; lpString1
    вопрос - что это за значения? думаю что из реестра, поскольку по природе PM что-нибудь, да откладывает в реестре.


    Код (Text):
    1. .text:0040143B                 call    unknown_libname_3 ; Microsoft VisualC 2-8/net runtime
    2. .text:00401440                 push    eax             ; lpString2
    3. .text:00401441                 lea     ecx, [ebp+Str1]
    4. .text:00401447                 push    ecx             ; lpString1
    5. .text:00401448                 call    ds:lstrcpyA
    6. .text:0040144E                 lea     edx, [ebp+Str1]
    7. .text:00401454                 push    edx             ; Str1
    8. .text:00401455                 call    sub_40125E
    9. .text:0040145A                 add     esp, 4
    10. .text:0040145D                 test    eax, eax
    11. .text:0040145F                 jnz     short loc_401476
    12. .text:00401461                 push    0               ; lParam
    13. .text:00401463                 push    0               ; wParam
    14. .text:00401465                 push    12h             ; Msg
    15. .text:00401467                 call    sub_401600
    16. .text:0040146C                 mov     eax, [eax+20h]
    17. .text:0040146F                 push    eax             ; hWnd
    18. .text:00401470                 call    ds:PostMessageA
    19. .text:00401476
    20. .text:00401476 loc_401476:                             ; CODE XREF: sub_401284+1DBj
    21. .text:00401476                 mov     [ebp+var_150], 1
    22. .text:00401480                 mov     [ebp+var_4], 0FFFFFFFFh
    23. .text:00401487                 lea     ecx, [ebp+var_38]
    24. .text:0040148A                 call    ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void)
    25. .text:0040148F                 mov     eax, [ebp+var_150]
    прикрепляю исполняемый файл.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Alastor
    Ставим брейк на PostMessageA в том месте в OllyDbg и смотрим параметры. В чем сложность ? Или прикол в том что данные из реестра берутся, а у вас их нету и вы хотите их "подогнать" вручную?
     
  3. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    в этом то и вся суть я не знаю откуда они должны браться и какие значения должны из себя представлять.

    в Olly Ничего определенного не увидел.
    Стэк
    Код (Text):
    1. 0012FD54   000B08B8  |hWnd = B08B8
    2. 0012FD58   00000012  |Message = WM_QUIT
    3. 0012FD5C   00000000  |ExitCode = 0
    4. 0012FD60   00000000  \lParam = 0
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Alastor
    А с чего вообще взяли, что именно в этой функции "ключ" к решению задачи.
     
  5. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    выше я уже показывал как происходит выход из программы

    Код (Text):
    1. .text:0040145D                 test    eax, eax
    2. .text:0040145F                 jnz     short loc_401476
    short loc_401476 - это адрес функции PostMessage, в результате вызова которой происходит закрытие прораммы.

    test eax, eax - это все равно что инструкция CMP, она задает условие выхода/невыхода из программы.

    Затрите ее, или смените jnz на ближний jmp и получите работоспособную программу. Но в моем случае, нужно найти кроме такого решения, еще и решение без изменения кода. А раз выход завязан именно на PM, то я так полагаю что она будет читать откуда-то какое-нибудь значение для своего запуска, и на мой взгляд, реестр - это самое подходящее место:
    Код (Text):
    1. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\NTCurrentVersion\Windows\USER\PostMessageLimit]
    только теперь не могу разобраться, точно ли в этой ветке решение и какое тогда значание у ключа PostMessageLimit или же я не в той области ищу.
     
  6. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Код (Text):
    1. loc_401476:
    2. mov     [ebp+var_150], 1
    3. mov     [ebp+var_4], 0FFFFFFFFh
    4. lea     ecx, [ebp+var_38]
    5. call    ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void)
    6. mov     eax, [ebp+var_150]
    после попавшегося мне на глаза
    Код (Text):
    1. call    ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void)
    я разуверился, что к запуску приложения причастны значения в реестре, передаваемые в функцию PostMessage. Похоже что должна вызываться командная строка и посредством ввода, опять-таки каких-то значений - необходимых для запуска приложения.


    пока все еще не запустил. у кого есть какие-нибудь идеи - поделитесь, буду рад услышать.
     
  7. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    Alastor
    Ваш код:
    Код (Text):
    1. 0040141B  |.  A0 5C514000   MOV     AL, BYTE PTR [40515C]
    2. 00401420  |.  8885 C4FEFFFF MOV     BYTE PTR [EBP-13C], AL
    3. 00401426  |.  B9 40000000   MOV     ECX, 40
    4. 0040142B  |.  33C0          XOR     EAX, EAX
    5. 0040142D  |.  8DBD C5FEFFFF LEA     EDI, DWORD PTR [EBP-13B]
    6. 00401433  |.  F3:AB         REP     STOS DWORD PTR ES:[EDI]
    7. 00401435  |.  66:AB         STOS    WORD PTR ES:[EDI]
    8. 00401437  |.  AA            STOS    BYTE PTR ES:[EDI]
    9. 00401438  |.  8D4D DC       LEA     ECX, DWORD PTR [EBP-24]
    10. 0040143B  |.  E8 B0010000   CALL    004015F0
    11. 00401440  |.  50            PUSH    EAX                              ; /String2
    12. 00401441  |.  8D8D C4FEFFFF LEA     ECX, DWORD PTR [EBP-13C]         ; |
    13. 00401447  |.  51            PUSH    ECX                              ; |String1
    14. 00401448  |.  FF15 00304000 CALL    DWORD PTR [<&KERNEL32.lstrcpyA>] ; \lstrcpyA
    15. 0040144E  |.  8D95 C4FEFFFF LEA     EDX, DWORD PTR [EBP-13C]
    16. 00401454  |.  52            PUSH    EDX                              ; /Arg1
    17. 00401455  |.  E8 04FEFFFF   CALL    0040125E                         ; \fk.0040125E
    18. 0040145A  |.  83C4 04       ADD     ESP, 4
    19. 0040145D  |.  85C0          TEST    EAX, EAX
    20. 0040145F  |.  75 15         JNZ     SHORT 00401476
    21. 00401461  |.  6A 00         PUSH    0
    22. 00401463  |.  6A 00         PUSH    0
    23. 00401465  |.  6A 12         PUSH    12
    24. 00401467  |.  E8 94010000   CALL    00401600
    25. 0040146C  |.  8B40 20       MOV     EAX, DWORD PTR [EAX+20]          ; |
    26. 0040146F  |.  50            PUSH    EAX                              ; |hWnd
    27. 00401470  |.  FF15 B4334000 CALL    DWORD PTR [<&USER32.PostMessageA>; \PostMessageA
    28. 00401476  |>  C785 B0FEFFFF>MOV     DWORD PTR [EBP-150], 1
    29. 00401480  |.  C745 FC FFFFF>MOV     DWORD PTR [EBP-4], -1
    30. 00401487  |.  8D4D C8       LEA     ECX, DWORD PTR [EBP-38]
    31. 0040148A  |.  E8 3F0A0000   CALL    <JMP.&MFC42.#617>
    32. 0040148F  |.  8B85 B0FEFFFF MOV     EAX, DWORD PTR [EBP-150]
    33. 00401495  |>  8B4D F4       MOV     ECX, DWORD PTR [EBP-C]
    34. 00401498  |.  64:890D 00000>MOV     DWORD PTR FS:[0], ECX
    35. 0040149F  |.  5F            POP     EDI
    36. 004014A0  |.  8BE5          MOV     ESP, EBP
    37. 004014A2  |.  5D            POP     EBP
    38. 004014A3  \.  C3            RETN
    по сути:
    - обнуляем кусок памяти
    - адресуемся к [0012FEDC]
    0012FEDC D4 B6 E5 73 Ф¶еs
    и дальше
    73E5B6D4 00 00 00 00 84 9A E3 73 00 00 00 00 2E 3F 41 56 ....„љгs.....?AV
    - копируем [кусок памяти] и [73E5B6D4]
    - - определили длину ненулевого стринга (а она "0" {все в нулях-то})
    - - "на выход"
    ps/ если бы стригн был ненулевым, сравнили бы его с "++"
    b если ок -> все хорошо
    нет - go out

    вывод:
    одну память обнуляем програмно (патчить как бы нельзя)
    вторая - MFC42...
    те. нужно искать подготовку адресации через [EBP-24], может быть там будут какие-то действия с реестром/внешними файлами с содержимым "++" .
     
  8. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Я уперся в то же самое, добрался до момента. Понятно сравнение и переход по условию "не ноль".
    Код (Text):
    1. .text:0040145D                 test    eax, eax
    2. .text:0040145F                 jnz     short loc_401476
    одна из строк кода ближнего перехода, начинающаяся с адреса 401476 имеет строку:
    Код (Text):
    1. .text:0040148A                 call    ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void)
    вот это наверное и есть передаваемые параметры в программу (судя по названию из командной строки, все-таки на счет реестра я ошибся).

    Надеясь на то, что я прав - занимаюсь пока безуспешным поиском этих самых параметров.
     
  9. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    Alastor
    не уверен.
    поскольку переменная [EBP-24] есть локальная, все происходит в текущей процедуре => нужно разбирать код выше 0040141B и до начала процедуры.
    а уж потом придется всплывать выше.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Alastor
    Нет, это адрес, следующий за call PostMessage
    По всей видимости по адресу 00401438 происходит _thiscall-вызов метода класса (локальная переменная ebp-24), который возвращает в eax указатель на некую строку. Затем эта строка копируется в локальный буфер ebp-13C и далее передается на проверку в функцию 0040125E, которая возвращает в eax либо не 0 (true) и тогда происходит скачок в обход PostMessage, либо 0 (false) с последующей посылкой сообщения WM_QUIT для выхода из проги.

    Вывод - копать нужно ф-ю проверки строки 0040125E и\или метод 004015F0, возвращающий эту строку
     
  11. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    leo
    на счет перехода
    Код (Text):
    1. short loc_401476
    - даже не увидел что я там написал ерунду - что это передача на код "закрытия" - просто запарился тогда :))))

    решение нашел:
    Код (Text):
    1. .text:0040123A ; int __cdecl sub_40123A(char *Str1)
    2. .text:0040123A sub_40123A      proc near               ; CODE XREF: sub_40125E+18p
    3. .text:0040123A
    4. .text:0040123A Str1            = dword ptr  8
    5. .text:0040123A
    6. .text:0040123A                 push    ebp
    7. .text:0040123B                 mov     ebp, esp
    8. .text:0040123D                 push    offset Str2     ;"++"
    9. .text:00401242                 mov     eax, [ebp+Str1]
    10. .text:00401245                 push    eax             ; Str1
    11. .text:00401246                 call    ds:_strcmpi
    12. .text:0040124C                 add     esp, 8
    13. .text:0040124F                 test    eax, eax
    14. .text:00401251                 jz      short loc_401257
    15. .text:00401253                 xor     eax, eax
    16. .text:00401255                 jmp     short loc_40125C
    вот смещение на переменную, которая хранит параметры для запуска - и как бы вы думали какие???? "++" конечно же :)))) Потом, далее по коду, который я столько приводил выше, в частности :
    Код (Text):
    1. .text:0040143B                 call    unknown_libname_3 ; Microsoft VisualC 2-8/net runtime
    2. .text:00401440                 push    eax             ; lpString2
    3. .text:00401441                 lea     ecx, [ebp+Str1]
    4. .text:00401447                 push    ecx             ; lpString1
    5. .text:00401448                 call    ds:lstrcpyA
    6. .text:0040144E                 lea     edx, [ebp+Str1]
    7. .text:00401454                 push    edx             ; Str1
    8. .text:00401455                 call    sub_40125E
    9. .text:0040145A                 add     esp, 4
    10. .text:0040145D                 test    eax, eax
    11. .text:0040145F                 jnz     short loc_401476
    происходит загрузка и проверка на наличие этих самых символов, и если они имеются и корректные, то парсятся командной строкой, вот тут:
    Код (Text):
    1. ext:004013FC                 call    ?ParseCommandLine@CWinApp@@QAEXAAVCCommandLineInfo@@@Z ; CWinApp::ParseCommandLine(CCommandLineInfo &)
    2. .text:00401401                 mov     ecx, [ebp+var_154]
    3. .text:00401407                 mov     edx, [ecx+78h]
    4. .text:0040140A                 push    edx
    5. .text:0040140B                 mov     ecx, [ebp+var_10]
    6. .text
    а потом при выполнении команды:
    Код (Text):
    1. .text:0040145D                 test    eax, eax
    2. .text:0040145F                 jnz     short loc_401476
    происходит проверка корректности запуска программы и если вернули не 0 - тогда:
    Код (Text):
    1. text:00401476 loc_401476:                             ; CODE XREF: sub_401284+1DBj
    2. .text:00401476                 mov     [ebp+var_150], 1
    3. .text:00401480                 mov     [ebp+var_4], 0FFFFFFFFh
    4. .text:00401487                 lea     ecx, [ebp+var_38]
    5. .text:0040148A                 call    ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void)
    запускаем программу, если нет - то передаем сигнал завершения работы через функцию PostMessageA, которая тут исполняет "приговор закрытия программы". нашел все-таки :)))