Парни всем привет сто лет тут не был, хоть и делфи плиз не удалять: Ребят что за студия Embarcadero® Delphi 11 Version 28.0.48361.3236 Copyright © 2023 Embarcadero Technologies, Inc. All Rights Reserved. на W11 встроенный отладчик работает и есть ли он там вообще не могу понять вопрос Код (Delphi): var DeleteFile_,CopyFile_,WinExec_,MoveFile_,MessageBox_:pointer; function GetAPI(dll:string;api:string):pointer; var myhand:integer; my:pointer; begin myhand := LoadLibraryA(pansichar(dll)); my := GetProcAddress(myhand,pansichar(api)); Result := my; end; procedure CopyFile(const a,b:pansichar); begin asm push 0 push b push a Call CopyFile_ end; end; procedure MessageBox(const Text, Caption: pansichar; Flags: Longint = $00000000); begin asm push Flags push Caption push Text push 0 Call MessageBox_ end; end; begin CopyFile_ := GetApi('kernel32.dll','CopyFileA'); MessageBox_ := GetApi('user32.dll','MessageBoxA'); MessageBox('АВАВАВ','АВАВАВ', $00000000); end. Вылетает с экзептом почему ????
Cyber_Mozg, у меня на delphi 7 все работает без эксепшенов. Помнится, тут была реализация того что ты пытаешься сделать: https://www.delphibasics.info/home/delphibasicscounterstrikewireleases Воз можно поможет, но это не точно Код (Delphi): function EncryptStr(s: string; key: integer): string; var i: Integer; begin Result := ''; for i := 1 to Length(s) do begin Result := Result + '#' + IntToStr(Ord(s[i]) + key); end; end; //EncryptStr function DecryptStr(s: string; key: integer): string; var ch: string; begin Result := ''; repeat if MatchesMask(s, '#*') then Delete(s, 1, 1); if Pos('#', s) > 0 then begin ch := Copy(s, 1, Pos('#', s) - 1); end else begin ch := s; end; if ch <> '' then begin Result := Result + Char(abs(StrToInt(ch) - key)); end; Delete(s, 1, Length(ch)); until not MatchesMask(s, '#*'); end; //DecryptStr const key = 101; const s_GetProcAddress = '#172#202#217#181#215#212#200#166#201#201#215#202#216#216'; s_LoadLibraryA = '#177#212#198#201#177#206#199#215#198#215#222#166'; const s_MessageBoxA = '#178#202#216#216#198#204#202#167#212#221#166'; var _LoadLibraryA: function(lpLibFileName: PAnsiChar): HMODULE; stdcall; _GetProcAddress: function(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall; var _MessageBoxA: function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall; procedure init_api; const s_kernel32_dll = '#208#202#215#211#202#209#152#151#147#201#209#209'; var h_kernel32_dll: THandle; begin h_kernel32_dll := LoadLibrary(PChar(DecryptStr(s_kernel32_dll, key))); @_GetProcAddress := GetProcAddress(h_kernel32_dll, PChar(DecryptStr(s_GetProcAddress, key))); @_LoadLibraryA := _GetProcAddress(h_kernel32_dll, PChar(DecryptStr(s_LoadLibraryA, key))); end; //init_api function kernel32_handle: THandle; const s_kernel32_dll = '#208#202#215#211#202#209#152#151#147#201#209#209'; begin Result := _LoadLibraryA(PChar(DecryptStr(s_kernel32_dll, key))); end; //kernel32_handle function user32_handle: THandle; const s_user32_dll = '#218#216#202#215#152#151#147#201#209#209'; begin Result := _LoadLibraryA(PChar(DecryptStr(s_user32_dll, key))); end; //user32_handle function api_address(dll_handle: THandle; api_name: string): pointer; begin Result := _GetProcAddress(dll_handle, PChar(DecryptStr(api_name, key))); end; //api_address В архиве немного другая реализация
Спасибо большое за ссылку посмотрю, на текущий момент просто хочу понять почему не работает вызов Айпи Мессаджбокс отладчик какой использовать на W11 &
Ребзя по делу кто нибудь напишите, второй вопрос дебагер какой использовать в студии что-то непонятное
Под какую битность скомпилировано? В каком конкретно месте вылетает? x64dbg (для любой битности). Если 32 бита, то, скорее всего, OllyDbg v2 будет работать (на W10 работает на ура).
Cyber_Mozg а где именно у вас ошибка? попробовал ради фана и интереса - пашет без ошибок https://prnt.sc/MLph-Rg_PDTI
--- Сообщение объединено, 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;
хотя у меня своя реализация была Код (Delphi): function LoadLibrary; external kernelbase name 'LoadLibraryW'; function LoadLibraryA; external kernelbase name 'LoadLibraryA'; function LoadLibraryW; external kernelbase name 'LoadLibraryW''; я так понял проблема вся была в определении типов данных ANSI и Unicode хотя так и непонятно Чет туго не могу понять зачем вообще PWideChar, неужели просто если определить данные как стринг не пройдет? Код (Delphi): function GetAPI(dll:PWideChar;api:MarshaledAString):pointer; var myhand:integer; my:pointer; begin myhand := LoadLibraryW([B]PWideChar[/B](dll)); my := GetProcAddress(myhand, MarshaledAString(api)); Result := my; end; procedure MessageBox(const Text, Caption:MarshaledAString); begin asm push 0 push Caption push Text push 0 Call MessageBox_ end; end; Какие то типы данных новые, Ребзя правильно понимаю если использую LoadLibraryA то данные в Анси передаю если LoadLibraryW то юникод ??? В общем я так понимаю нужно смотреть юниты и типы данных к примеру функция месседж бокс Код (Delphi): function MessageBox(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall; и т.д. еще непонятно зачем в описании функции lpText, lpCaption: LPCWSTR а выще указывается тип Код (Delphi): LPWSTR = PWideChar; LPSTR = MarshaledAString; {$EXTERNALSYM LPSTR} PLPSTR = ^LPSTR; {$EXTERNALSYM PLPSTR} LPCSTR = MarshaledAString; а Код (Delphi): MarshaledString = PWideChar; MarshaledAString = _PAnsiChr; Зачем все так запутанно ????? может кто подсказать при загрузке файла (консольного ап.) в Оолу ошибка Объясните почему плз
тип того A = ANSI W = Wide char спросите идиотов с МС зачем столько гавна нагородили не чтоб сразу в UTF8 все делать как в Линукс мирах
в верхнем сообщении в исходнике объявлены указатели на функции WinAPI, но не инициализированы - то есть фактические адреса этих функций в момент запуска приложения не помещены в эти указатели. поэтому попытка вызвать функции вызывает запуск кода с адресом 0х0000000 обычно когда приложение запускается, менеджер задач винды по списку импортируемых функций внутри .exe знает, чем и из каких dll хочет воспользоваться приложение и заменяет эти указатели в списке их фактическими адресами - которые могут меняться от машины к машине из-за разного оборудования, размера драйверов в памяти и т.д. это при статической линковке (когда в коде компилятору и линкеру явно указано что функция импортируемая) если же линковка динамическая, то приложение черпает функции не по фиксированному списку, а явно загружая нужные dll одну за другой по мере необходимости, через LoadLibrary() + GetProcAddress() при этом dll могут принадлежать как системе, и лежать в виде файлов в каталогах винды, так и дистрибутиву самого приложения. это не запутано, а гибко и удобно ) потому что например в си/си++ рантайм библиотеках нужные импорты функций WinAPI уже заранее созданы условным Борландом и разработчик просто указывает их в своем исходнике, как любые другие стандартные функции си. если хочется не использовать стандартные библиотеки, хозяин барин - но тогда вся суета с загрузкой в память dll и поиском в них адресов нужных функций WinAPI ложится на программиста. юникод версии функций как правило ожидают строки с каждым символом величиной два байта, поэтому попытка передать обычную строку из байтов в ...W функцию приведет к ерунде и вместо символов, и возможно к падению приложения из-за того, что завершающий строку нулевой байт будет воспринят как чей-то второй в паре байт. А строка лишится конца. и наоборот, попытка передать в ...A функцию строку из двухбайтных символов часто приведет к ошибке из-за второго в строке байта, равного нулю. Если первый символ не из национальных алфавитов ) при этом анализ/парсинг текстовых файлов ручками существенно проще в однобайтовой версии, поэтому эволюционно раньше всё было проще и в рамках 8бит на символ, а потом набежали китайцы со своими алфавитами и понеслась...