Доброго времени всем форумчанам. Объясните пожалуйста, какие значения собственных параметров и откуда получит функция PostMessage? Понятно что какое-то ненулевое значение которое проверяется условием Код (Text): .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 Почитал описание функции, по сути PM может получать только хэндл окна, и доп.параметры, я думаю это как раз вот эти "String" Код (Text): .text:00401440 push eax ; lpString2 .text:00401441 lea ecx, [ebp+Str1] .text:00401447 push ecx ; lpString1 вопрос - что это за значения? думаю что из реестра, поскольку по природе PM что-нибудь, да откладывает в реестре. Код (Text): .text:0040143B call unknown_libname_3 ; Microsoft VisualC 2-8/net runtime .text:00401440 push eax ; lpString2 .text:00401441 lea ecx, [ebp+Str1] .text:00401447 push ecx ; lpString1 .text:00401448 call ds:lstrcpyA .text:0040144E lea edx, [ebp+Str1] .text:00401454 push edx ; Str1 .text:00401455 call sub_40125E .text:0040145A add esp, 4 .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 .text:00401461 push 0 ; lParam .text:00401463 push 0 ; wParam .text:00401465 push 12h ; Msg .text:00401467 call sub_401600 .text:0040146C mov eax, [eax+20h] .text:0040146F push eax ; hWnd .text:00401470 call ds:PostMessageA .text:00401476 .text:00401476 loc_401476: ; CODE XREF: sub_401284+1DBj .text:00401476 mov [ebp+var_150], 1 .text:00401480 mov [ebp+var_4], 0FFFFFFFFh .text:00401487 lea ecx, [ebp+var_38] .text:0040148A call ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void) .text:0040148F mov eax, [ebp+var_150] прикрепляю исполняемый файл.
Alastor Ставим брейк на PostMessageA в том месте в OllyDbg и смотрим параметры. В чем сложность ? Или прикол в том что данные из реестра берутся, а у вас их нету и вы хотите их "подогнать" вручную?
в этом то и вся суть я не знаю откуда они должны браться и какие значения должны из себя представлять. в Olly Ничего определенного не увидел. Стэк Код (Text): 0012FD54 000B08B8 |hWnd = B08B8 0012FD58 00000012 |Message = WM_QUIT 0012FD5C 00000000 |ExitCode = 0 0012FD60 00000000 \lParam = 0
выше я уже показывал как происходит выход из программы Код (Text): .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 short loc_401476 - это адрес функции PostMessage, в результате вызова которой происходит закрытие прораммы. test eax, eax - это все равно что инструкция CMP, она задает условие выхода/невыхода из программы. Затрите ее, или смените jnz на ближний jmp и получите работоспособную программу. Но в моем случае, нужно найти кроме такого решения, еще и решение без изменения кода. А раз выход завязан именно на PM, то я так полагаю что она будет читать откуда-то какое-нибудь значение для своего запуска, и на мой взгляд, реестр - это самое подходящее место: Код (Text): [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\NTCurrentVersion\Windows\USER\PostMessageLimit] только теперь не могу разобраться, точно ли в этой ветке решение и какое тогда значание у ключа PostMessageLimit или же я не в той области ищу.
Код (Text): loc_401476: mov [ebp+var_150], 1 mov [ebp+var_4], 0FFFFFFFFh lea ecx, [ebp+var_38] call ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void) mov eax, [ebp+var_150] после попавшегося мне на глаза Код (Text): call ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void) я разуверился, что к запуску приложения причастны значения в реестре, передаваемые в функцию PostMessage. Похоже что должна вызываться командная строка и посредством ввода, опять-таки каких-то значений - необходимых для запуска приложения. пока все еще не запустил. у кого есть какие-нибудь идеи - поделитесь, буду рад услышать.
Alastor Ваш код: Код (Text): 0040141B |. A0 5C514000 MOV AL, BYTE PTR [40515C] 00401420 |. 8885 C4FEFFFF MOV BYTE PTR [EBP-13C], AL 00401426 |. B9 40000000 MOV ECX, 40 0040142B |. 33C0 XOR EAX, EAX 0040142D |. 8DBD C5FEFFFF LEA EDI, DWORD PTR [EBP-13B] 00401433 |. F3:AB REP STOS DWORD PTR ES:[EDI] 00401435 |. 66:AB STOS WORD PTR ES:[EDI] 00401437 |. AA STOS BYTE PTR ES:[EDI] 00401438 |. 8D4D DC LEA ECX, DWORD PTR [EBP-24] 0040143B |. E8 B0010000 CALL 004015F0 00401440 |. 50 PUSH EAX ; /String2 00401441 |. 8D8D C4FEFFFF LEA ECX, DWORD PTR [EBP-13C] ; | 00401447 |. 51 PUSH ECX ; |String1 00401448 |. FF15 00304000 CALL DWORD PTR [<&KERNEL32.lstrcpyA>] ; \lstrcpyA 0040144E |. 8D95 C4FEFFFF LEA EDX, DWORD PTR [EBP-13C] 00401454 |. 52 PUSH EDX ; /Arg1 00401455 |. E8 04FEFFFF CALL 0040125E ; \fk.0040125E 0040145A |. 83C4 04 ADD ESP, 4 0040145D |. 85C0 TEST EAX, EAX 0040145F |. 75 15 JNZ SHORT 00401476 00401461 |. 6A 00 PUSH 0 00401463 |. 6A 00 PUSH 0 00401465 |. 6A 12 PUSH 12 00401467 |. E8 94010000 CALL 00401600 0040146C |. 8B40 20 MOV EAX, DWORD PTR [EAX+20] ; | 0040146F |. 50 PUSH EAX ; |hWnd 00401470 |. FF15 B4334000 CALL DWORD PTR [<&USER32.PostMessageA>; \PostMessageA 00401476 |> C785 B0FEFFFF>MOV DWORD PTR [EBP-150], 1 00401480 |. C745 FC FFFFF>MOV DWORD PTR [EBP-4], -1 00401487 |. 8D4D C8 LEA ECX, DWORD PTR [EBP-38] 0040148A |. E8 3F0A0000 CALL <JMP.&MFC42.#617> 0040148F |. 8B85 B0FEFFFF MOV EAX, DWORD PTR [EBP-150] 00401495 |> 8B4D F4 MOV ECX, DWORD PTR [EBP-C] 00401498 |. 64:890D 00000>MOV DWORD PTR FS:[0], ECX 0040149F |. 5F POP EDI 004014A0 |. 8BE5 MOV ESP, EBP 004014A2 |. 5D POP EBP 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], может быть там будут какие-то действия с реестром/внешними файлами с содержимым "++" .
Я уперся в то же самое, добрался до момента. Понятно сравнение и переход по условию "не ноль". Код (Text): .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 одна из строк кода ближнего перехода, начинающаяся с адреса 401476 имеет строку: Код (Text): .text:0040148A call ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void) вот это наверное и есть передаваемые параметры в программу (судя по названию из командной строки, все-таки на счет реестра я ошибся). Надеясь на то, что я прав - занимаюсь пока безуспешным поиском этих самых параметров.
Alastor не уверен. поскольку переменная [EBP-24] есть локальная, все происходит в текущей процедуре => нужно разбирать код выше 0040141B и до начала процедуры. а уж потом придется всплывать выше.
Alastor Нет, это адрес, следующий за call PostMessage По всей видимости по адресу 00401438 происходит _thiscall-вызов метода класса (локальная переменная ebp-24), который возвращает в eax указатель на некую строку. Затем эта строка копируется в локальный буфер ebp-13C и далее передается на проверку в функцию 0040125E, которая возвращает в eax либо не 0 (true) и тогда происходит скачок в обход PostMessage, либо 0 (false) с последующей посылкой сообщения WM_QUIT для выхода из проги. Вывод - копать нужно ф-ю проверки строки 0040125E и\или метод 004015F0, возвращающий эту строку
leo на счет перехода Код (Text): short loc_401476 - даже не увидел что я там написал ерунду - что это передача на код "закрытия" - просто запарился тогда ))) решение нашел: Код (Text): .text:0040123A ; int __cdecl sub_40123A(char *Str1) .text:0040123A sub_40123A proc near ; CODE XREF: sub_40125E+18p .text:0040123A .text:0040123A Str1 = dword ptr 8 .text:0040123A .text:0040123A push ebp .text:0040123B mov ebp, esp .text:0040123D push offset Str2 ;"++" .text:00401242 mov eax, [ebp+Str1] .text:00401245 push eax ; Str1 .text:00401246 call ds:_strcmpi .text:0040124C add esp, 8 .text:0040124F test eax, eax .text:00401251 jz short loc_401257 .text:00401253 xor eax, eax .text:00401255 jmp short loc_40125C вот смещение на переменную, которая хранит параметры для запуска - и как бы вы думали какие???? "++" конечно же ))) Потом, далее по коду, который я столько приводил выше, в частности : Код (Text): .text:0040143B call unknown_libname_3 ; Microsoft VisualC 2-8/net runtime .text:00401440 push eax ; lpString2 .text:00401441 lea ecx, [ebp+Str1] .text:00401447 push ecx ; lpString1 .text:00401448 call ds:lstrcpyA .text:0040144E lea edx, [ebp+Str1] .text:00401454 push edx ; Str1 .text:00401455 call sub_40125E .text:0040145A add esp, 4 .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 происходит загрузка и проверка на наличие этих самых символов, и если они имеются и корректные, то парсятся командной строкой, вот тут: Код (Text): ext:004013FC call ?ParseCommandLine@CWinApp@@QAEXAAVCCommandLineInfo@@@Z ; CWinApp::ParseCommandLine(CCommandLineInfo &) .text:00401401 mov ecx, [ebp+var_154] .text:00401407 mov edx, [ecx+78h] .text:0040140A push edx .text:0040140B mov ecx, [ebp+var_10] .text а потом при выполнении команды: Код (Text): .text:0040145D test eax, eax .text:0040145F jnz short loc_401476 происходит проверка корректности запуска программы и если вернули не 0 - тогда: Код (Text): text:00401476 loc_401476: ; CODE XREF: sub_401284+1DBj .text:00401476 mov [ebp+var_150], 1 .text:00401480 mov [ebp+var_4], 0FFFFFFFFh .text:00401487 lea ecx, [ebp+var_38] .text:0040148A call ??1CCommandLineInfo@@UAE@XZ ; CCommandLineInfo::~CCommandLineInfo(void) запускаем программу, если нет - то передаем сигнал завершения работы через функцию PostMessageA, которая тут исполняет "приговор закрытия программы". нашел все-таки ))