Непонятная проблема

Тема в разделе "WASM.BEGINNERS", создана пользователем Cyber_Mozg, 24 авг 2024.

  1. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Парни всем привет сто лет тут не был, хоть и делфи плиз не удалять:
    1. Ребят что за студия
      Embarcadero® Delphi 11 Version 28.0.48361.3236
      Copyright © 2023 Embarcadero Technologies, Inc. All Rights Reserved.
      на W11 встроенный отладчик работает и есть ли он там вообще не могу понять
    2. вопрос
    Код (Delphi):
    1. var
    2. DeleteFile_,CopyFile_,WinExec_,MoveFile_,MessageBox_:pointer;
    3. function GetAPI(dll:string;api:string):pointer;
    4. var myhand:integer;
    5.     my:pointer;
    6.    begin
    7.    myhand := LoadLibraryA(pansichar(dll));
    8.    my := GetProcAddress(myhand,pansichar(api));
    9.    Result := my;
    10.  end;
    11. procedure CopyFile(const a,b:pansichar);
    12.  begin
    13.  asm
    14.  push 0
    15.  push b
    16.  push a
    17.  Call CopyFile_
    18.  end;
    19.  end;
    20. procedure  MessageBox(const Text, Caption: pansichar; Flags: Longint = $00000000);
    21.  begin
    22.  asm
    23.  push Flags
    24.  push Caption
    25.  push Text
    26.  push 0
    27.  Call MessageBox_
    28.  end;
    29.  end;
    30. begin
    31. CopyFile_ := GetApi('kernel32.dll','CopyFileA');
    32. MessageBox_ := GetApi('user32.dll','MessageBoxA');
    33.  MessageBox('АВАВАВ','АВАВАВ', $00000000);
    34. end.
    Вылетает с экзептом почему ????
     
    Последнее редактирование: 25 авг 2024
  2. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Cyber_Mozg, у меня на delphi 7 все работает без эксепшенов.

    Помнится, тут была реализация того что ты пытаешься сделать:
    https://www.delphibasics.info/home/delphibasicscounterstrikewireleases
    Воз можно поможет, но это не точно
    Код (Delphi):
    1. function EncryptStr(s: string; key: integer): string;
    2. var
    3.   i: Integer;
    4. begin
    5.   Result := '';
    6.   for i := 1 to Length(s) do
    7.   begin
    8.     Result := Result + '#' + IntToStr(Ord(s[i]) + key);
    9.   end;
    10. end; //EncryptStr
    11.  
    12. function DecryptStr(s: string; key: integer): string;
    13. var
    14.   ch: string;
    15. begin
    16.   Result := '';
    17.   repeat
    18.     if MatchesMask(s, '#*') then Delete(s, 1, 1);
    19.  
    20.     if Pos('#', s) > 0 then
    21.     begin
    22.       ch := Copy(s, 1, Pos('#', s) - 1);
    23.     end
    24.     else
    25.     begin
    26.       ch := s;
    27.     end;
    28.  
    29.     if ch <> '' then
    30.     begin
    31.       Result := Result + Char(abs(StrToInt(ch) - key));
    32.     end;
    33.  
    34.     Delete(s, 1, Length(ch));
    35.   until not MatchesMask(s, '#*');
    36. end; //DecryptStr
    37.  
    38. const
    39.   key = 101;
    40.  
    41. const
    42.   s_GetProcAddress = '#172#202#217#181#215#212#200#166#201#201#215#202#216#216';
    43.   s_LoadLibraryA = '#177#212#198#201#177#206#199#215#198#215#222#166';
    44.  
    45. const
    46.   s_MessageBoxA = '#178#202#216#216#198#204#202#167#212#221#166';
    47.  
    48. var
    49.   _LoadLibraryA: function(lpLibFileName: PAnsiChar): HMODULE; stdcall;
    50.   _GetProcAddress: function(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;
    51.  
    52. var
    53.   _MessageBoxA: function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
    54.  
    55. procedure init_api;
    56. const
    57.   s_kernel32_dll = '#208#202#215#211#202#209#152#151#147#201#209#209';
    58. var
    59.   h_kernel32_dll: THandle;
    60. begin
    61.   h_kernel32_dll := LoadLibrary(PChar(DecryptStr(s_kernel32_dll, key)));
    62.   @_GetProcAddress := GetProcAddress(h_kernel32_dll, PChar(DecryptStr(s_GetProcAddress, key)));
    63.   @_LoadLibraryA := _GetProcAddress(h_kernel32_dll, PChar(DecryptStr(s_LoadLibraryA, key)));
    64. end; //init_api
    65.  
    66. function kernel32_handle: THandle;
    67. const
    68.   s_kernel32_dll = '#208#202#215#211#202#209#152#151#147#201#209#209';
    69. begin
    70.   Result := _LoadLibraryA(PChar(DecryptStr(s_kernel32_dll, key)));
    71. end; //kernel32_handle
    72.  
    73. function user32_handle: THandle;
    74. const
    75.   s_user32_dll  = '#218#216#202#215#152#151#147#201#209#209';
    76. begin
    77.   Result := _LoadLibraryA(PChar(DecryptStr(s_user32_dll, key)));
    78. end; //user32_handle
    79.  
    80. function api_address(dll_handle: THandle; api_name: string): pointer;
    81. begin
    82.   Result := _GetProcAddress(dll_handle, PChar(DecryptStr(api_name, key)));
    83. end; //api_address
    В архиве немного другая реализация
     

    Вложения:

    • APISearch.rar
      Размер файла:
      2,4 КБ
      Просмотров:
      120
  3. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Спасибо большое за ссылку посмотрю, на текущий момент просто хочу понять почему не работает вызов Айпи Мессаджбокс
    отладчик какой использовать на W11 &
     
  4. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
  5. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    лучше сразу на win12 переходите
     
  6. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Ребзя по делу кто нибудь напишите, второй вопрос дебагер какой использовать в студии что-то непонятное
     
  7. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Cyber_Mozg, в delphi вроде интегрированный дебагер?
     
    Последнее редактирование: 24 авг 2024
  8. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Раньше был норм на ollydbg похож сейчас же вообще непонятно что там
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Cyber_Mozg,
    пожалуйста окружайте код программы тэгами [соdе=язык программирования] . . . [/соdе]
     
    Cyber_Mozg нравится это.
  10. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
  11. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    53
    MessageBox принимает 4 аргумента, а не 3.
     
  12. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    там все норм -
    Код (Delphi):
    1. push Flags
    2. push Caption
    3. push Text
    4. push 0
    5. Call MessageBox_
     
  13. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    122
  14. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    43
    Под какую битность скомпилировано? В каком конкретно месте вылетает?

    x64dbg (для любой битности).
    Если 32 бита, то, скорее всего, OllyDbg v2 будет работать (на W10 работает на ура).
     
  15. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
  16. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    upload_2024-8-26_19-15-58.png
    --- Сообщение объединено, 26 авг 2024 ---
    --- Сообщение объединено, 26 авг 2024 ---
    У вас В7, 10?
    --- Сообщение объединено, 26 авг 2024 ---
    парни нашел ошибку
    function GetAPI(dll:PWideChar;api:PWideChar):pointer;
    var myhand:integer;
    my:pointer;
    begin
    myhand := LoadLibrary(PWideChar(dll));
    my := GetProcAddress(myhand,PWideChar(api));
    Result := my;
    end;
     
  17. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    у меня старая древнющяя Delphi7 FUll :)
    32 bit
    AnsiChar (фиксов для WideChar не надо)
     
  18. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    хотя у меня своя реализация была
    Код (Delphi):
    1. function LoadLibrary; external kernelbase name 'LoadLibraryW';
    2. function LoadLibraryA; external kernelbase name 'LoadLibraryA';
    3. function LoadLibraryW; external kernelbase name 'LoadLibraryW'';
    я так понял проблема вся была в определении типов данных ANSI и Unicode хотя так и непонятно
    Чет туго не могу понять зачем вообще PWideChar, неужели просто если определить данные как стринг не пройдет?
    Код (Delphi):
    1. function GetAPI(dll:PWideChar;api:MarshaledAString):pointer;
    2. var myhand:integer;
    3.     my:pointer;
    4.    begin
    5.    myhand := LoadLibraryW([B]PWideChar[/B](dll));
    6.    my := GetProcAddress(myhand, MarshaledAString(api));
    7.    Result := my;
    8.  end;
    9.  procedure  MessageBox(const Text, Caption:MarshaledAString);
    10.  begin
    11.  asm
    12.  push 0
    13.  push Caption
    14.  push Text
    15.  push 0
    16.  Call MessageBox_
    17.  end;
    18.  end;
    Какие то типы данных новые, Ребзя правильно понимаю если использую LoadLibraryA то данные в Анси передаю если LoadLibraryW то юникод ???
    В общем я так понимаю нужно смотреть юниты и типы данных к примеру функция месседж бокс
    Код (Delphi):
    1. function MessageBox(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;
    и т.д.
    еще непонятно зачем в описании функции lpText, lpCaption: LPCWSTR а выще указывается тип
    Код (Delphi):
    1. LPWSTR = PWideChar;
    2.    LPSTR = MarshaledAString;
    3.   {$EXTERNALSYM LPSTR}
    4.   PLPSTR = ^LPSTR;
    5.   {$EXTERNALSYM PLPSTR}
    6.   LPCSTR = MarshaledAString;
    а
    Код (Delphi):
    1. MarshaledString = PWideChar;
    2.   MarshaledAString = _PAnsiChr;
    Зачем все так запутанно ????? может кто подсказать при загрузке файла (консольного ап.) в Оолу ошибка
    Объясните почему плз
     

    Вложения:

    Win32Api нравится это.
  19. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    447
    тип того
    A = ANSI
    W = Wide char
    спросите идиотов с МС зачем столько гавна нагородили

    не чтоб сразу в UTF8 все делать как в Линукс мирах
     
    sl0n и Win32Api нравится это.
  20. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    8
    в верхнем сообщении в исходнике объявлены указатели на функции WinAPI, но не инициализированы - то есть фактические адреса этих функций в момент запуска приложения не помещены в эти указатели.
    поэтому попытка вызвать функции вызывает запуск кода с адресом 0х0000000

    обычно когда приложение запускается, менеджер задач винды по списку импортируемых функций внутри .exe знает, чем и из каких dll хочет воспользоваться приложение
    и заменяет эти указатели в списке их фактическими адресами - которые могут меняться от машины к машине из-за разного оборудования, размера драйверов в памяти и т.д.

    это при статической линковке (когда в коде компилятору и линкеру явно указано что функция импортируемая)

    если же линковка динамическая, то приложение черпает функции не по фиксированному списку, а явно загружая нужные dll одну за другой по мере необходимости, через LoadLibrary() + GetProcAddress()

    при этом dll могут принадлежать как системе, и лежать в виде файлов в каталогах винды, так и дистрибутиву самого приложения.

    это не запутано, а гибко и удобно )

    потому что например в си/си++ рантайм библиотеках нужные импорты функций WinAPI уже заранее созданы условным Борландом и разработчик просто указывает их в своем исходнике, как любые другие стандартные функции си.

    если хочется не использовать стандартные библиотеки, хозяин барин - но тогда вся суета с загрузкой в память dll и поиском в них адресов нужных функций WinAPI ложится на программиста.

    юникод версии функций как правило ожидают строки с каждым символом величиной два байта, поэтому попытка передать обычную строку из байтов в ...W функцию приведет к ерунде и вместо символов, и возможно к падению приложения из-за того, что завершающий строку нулевой байт будет воспринят как чей-то второй в паре байт. А строка лишится конца.

    и наоборот, попытка передать в ...A функцию строку из двухбайтных символов часто приведет к ошибке из-за второго в строке байта, равного нулю. Если первый символ не из национальных алфавитов )

    при этом анализ/парсинг текстовых файлов ручками существенно проще в однобайтовой версии, поэтому эволюционно раньше всё было проще и в рамках 8бит на символ, а потом набежали китайцы со своими алфавитами и понеслась...
     
    Последнее редактирование: 8 сен 2024
    Cyber_Mozg нравится это.