делать больше нечего - переписывать - посмотрел на что сигнатура стоит переставил пару строк перекомпилил и все.
Ну не только, или ... едва ли только. Ентропия, "поведенческие вещи" вызывают срабатывание триггеров AV. Спокойнее переписать модуль на python и спать спокойно. Тем более что он окажется, порой, в два раза короче чем сишка. ))
Можно сделать как угодно, но по моему это не интересно, поэтом пусть остается так как есть. В архиве памятник тупиковой ветви эволюции --- Сообщение объединено, 1 июн 2019 --- У каждого есть свое драгоценное мнение - по моему это чушь - не вдаваясь в подробности.
Понял. Все равно спасибо. Вот пытаюсь разобраться как ты подключаешь плагины. Плагин. Их у меня два : plgDesktop plgTelnet ... и пока одинаковые Код (ASM): .586 .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\msvcrt.lib include macros.mac CALL_BACK_VTBL struct pAddConnectionData dd ? DelConnectionData dd ? CALL_BACK_VTBL ends .data? hDefaultProcessHeap dd ? G_ServMain dd ? .data G_Clbck CALL_BACK_VTBL <> .code ; ########################################################################## LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD .if reason == DLL_PROCESS_ATTACH invoke GetProcessHeap mov hDefaultProcessHeap, eax mov eax, 1 .elseif reason == DLL_PROCESS_DETACH .elseif reason == DLL_THREAD_ATTACH .elseif reason == DLL_THREAD_DETACH .endif ret LibMain Endp ; ########################################################################## SetCallBacks proc uses esi edi ebx pVtbl:dword .if pVtbl != 0 invoke memcpy, addr G_Clbck, pVtbl, sizeof CALL_BACK_VTBL .endif ret SetCallBacks endp ; ########################################################################## ;############################################# PluginMain proc uses esi edi ebx hsokt:dword LOCAL lSockt : dword push hsokt pop lSockt Scall G_Clbck.pAddConnectionData, lSockt Scall G_Clbck.DelConnectionData, lSockt ret PluginMain endp ;############################################# End LibMain Не понимаю пока смысла PluginMain , но хотел бы чтобы в Ядро попала строка - "I'm from Plug Desktop". И Ядро соответственно эту строку вывело. Не знаю как туда передать эту строку. Ядро Код (ASM): .686 .mmx .xmm .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\msvcrt.lib include macros.mac CALL_BACK_VTBL struct pAddConnectionData dd ? DelConnectionData dd ? CALL_BACK_VTBL ends .data? g_isPlug dd ? ptDeskPlg db 300 dup (?) ptTelnPlg db 300 dup (?) pDesktopSession dd ? pTelnetSession dd ? hDeskPlg dd ? hTelnPlg dd ? .data g_calback CALL_BACK_VTBL <offset AddConnectionData, offset DelConnectionData> szDeskPlg db "plgDesktop.dll",0 szTelnPlg db "plgTelnet.dll",0 szplmain db "PluginMain",0 sxsetclb db "SetCallBacks",0 sznoplug db "You have not installed a single plug-in",0dh,0ah db " - server operation is not possible!!!",0 szRerror db "Server Errror",0 .code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start: call GetPlugins invoke ExitProcess, 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetPlugins proc uses esi edi ebx LOCAL lsMonm[300]:byte mov g_isPlug, 0 invoke GetModuleFileName, 0, addr lsMonm, 300 lea esi, lsMonm .while eax != 0 .if byte ptr [esi+eax] == 5ch mov [esi+eax+1], byte ptr 0 invoke lstrcpy, addr ptDeskPlg, addr lsMonm invoke lstrcat, addr ptDeskPlg, addr szDeskPlg invoke lstrcpy, addr ptTelnPlg, addr lsMonm invoke lstrcat, addr ptTelnPlg, addr szTelnPlg .break .endif dec eax .endw invoke LoadLibrary, addr szDeskPlg mov hDeskPlg, eax .if eax != 0 invoke GetProcAddress, hDeskPlg, addr szplmain mov pDesktopSession, eax invoke GetProcAddress, hDeskPlg, addr sxsetclb Scall eax, offset g_calback inc g_isPlug .endif invoke LoadLibrary, addr szTelnPlg mov hTelnPlg, eax .if eax != 0 invoke GetProcAddress, hTelnPlg, addr szplmain mov pTelnetSession, eax invoke GetProcAddress, hTelnPlg, addr sxsetclb Scall eax, offset g_calback inc g_isPlug .endif .if g_isPlug == 0 invoke MessageBox, 0, addr sznoplug, addr szRerror, 0 invoke ExitProcess, 0 .endif ret GetPlugins endp end start Вроде все учел, НО мое Ядро НЕ собирается. Пишет Код (Text): Assembling: core.asm error A4910: cannot open file: C:\masm32\bin\ml.err core.asm(42) : error A2006: : AddConnectionData core.asm(42) : error A2006: : DelConnectionData ... тоже не понимаю как устранить. Подскажи пожалуйста. Тебе все равно плагины не нравятся ))) Спасибо. Вот архивчик с моими страданиями ))
ошибка тут g_calback CALL_BACK_VTBL <offset AddConnectionData, offset DelConnectionData> Тела этих функций находятся в коде сервера в плагине только адреса для обратного вызова. Адреса заполняются при загрузке плагина. По сути проблемы - структура должна быть пустая. G_Clbck CALL_BACK_VTBL <>
Не ну в плагинах она есть и пустая. А, то есть прототипы я должен прописать же в core.asm ? Код (ASM): .686 .mmx .xmm .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\msvcrt.lib include macros.mac DelConnectionData proto :dword AddConnectionData proto :dword CALL_BACK_VTBL struct pAddConnectionData dd ? DelConnectionData dd ? CALL_BACK_VTBL ends .data? g_isPlug dd ? ptDeskPlg db 300 dup (?) ptTelnPlg db 300 dup (?) pDesktopSession dd ? pTelnetSession dd ? hDeskPlg dd ? hTelnPlg dd ? .data g_calback CALL_BACK_VTBL <offset AddConnectionData, offset DelConnectionData> ;G_Clbck CALL_BACK_VTBL <> szDeskPlg db "plgDesktop.dll",0 szTelnPlg db "plgTelnet.dll",0 szplmain db "PluginMain",0 sxsetclb db "SetCallBacks",0 sznoplug db "You have not installed a single plug-in",0dh,0ah db " - server operation is not possible!!!",0 szRerror db "Server Errror",0 .code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start: call GetPlugins invoke ExitProcess, 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetPlugins proc uses esi edi ebx LOCAL lsMonm[300]:byte mov g_isPlug, 0 invoke GetModuleFileName, 0, addr lsMonm, 300 lea esi, lsMonm .while eax != 0 .if byte ptr [esi+eax] == 5ch mov [esi+eax+1], byte ptr 0 invoke lstrcpy, addr ptDeskPlg, addr lsMonm invoke lstrcat, addr ptDeskPlg, addr szDeskPlg invoke lstrcpy, addr ptTelnPlg, addr lsMonm invoke lstrcat, addr ptTelnPlg, addr szTelnPlg .break .endif dec eax .endw invoke LoadLibrary, addr szDeskPlg mov hDeskPlg, eax .if eax != 0 invoke GetProcAddress, hDeskPlg, addr szplmain mov pDesktopSession, eax invoke GetProcAddress, hDeskPlg, addr sxsetclb Scall eax, offset g_calback inc g_isPlug .endif invoke LoadLibrary, addr szTelnPlg mov hTelnPlg, eax .if eax != 0 invoke GetProcAddress, hTelnPlg, addr szplmain mov pTelnetSession, eax invoke GetProcAddress, hTelnPlg, addr sxsetclb Scall eax, offset g_calback inc g_isPlug .endif .if g_isPlug == 0 invoke MessageBox, 0, addr sznoplug, addr szRerror, 0 invoke ExitProcess, 0 .endif ret GetPlugins endp end start ... все равно не собирается Код (Text): C:\_temp\_plg01>\masm32\bin\Link /SUBSYSTEM:CONSOLE /FIXED:NO core.obj Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. core.obj : error LNK2001: unresolved external symbol _DelConnectionData@4 core.obj : error LNK2001: unresolved external symbol _AddConnectionData@4 core.exe : fatal error LNK1120: 2 unresolved externals
я только сейчас увидел что ты делаешь - ты типа ядро собираешь для плагинов У тебя немного странное представление о структуре программы. Ядро не только грузит плагины - оно обеспечивает авторизацию и транспортировку данных клиенту. В твоем ядре как я понял только одна функция загрузки плагинов - маловато будет.
... еще не понятно. один адрес "pAddConnectionData" а другой "DelConnectionData" - без "p" Код (ASM): CALL_BACK_VTBL struct pAddConnectionData dd ? DelConnectionData dd ? CALL_BACK_VTBL ends а прототипы : DelConnectionData proto :dword AddConnectionData proto :dword без буквы "p" Ну да. Я же учусь. Моя задача - подгрузить плагин и вывести в ядре строку из плагина. Например "I'm from Plugue #N", где N - количеств номер dll - ки Чисто для расширения собственных горизонтов.
правильно с р. потому что ссылка на элементы используется в плагине. ядру все рано что там написано - просто два дворда. --- Сообщение объединено, 1 июн 2019 --- может ты просто хочешь отладить процедуру загрузки плагинов - сделай заглушки для этих функций.
Вроде все правильно нарисовано. Но, ты очень много значения придаешь этим функциям - они нужны только чтобы показать ИП адреса актуальных подключений в окошке вызванном из трея. Закомментируй это ; Scall G_Clbck.pAddConnectionData, lSockt в плагине и пересобери его. Эти калбаки не мешают основной работе - они для информации. Не очень понятно куда ты хочешь выводить строку ? Ядро принимает вызов от клиента, проводит авторизацию, потом по ИДу сервиса передает соответствующему плагину клиентский сокет и все. Что плагин пишет в сокет ядру плевать. Так что я не понимаю твоей инициативы
Исключительно для образовательных целей - больше ничего с плагинами делать не буду. В архиве клиент(ядро+4 плагина) и сервер (ядро+4 плагина) 4-тый плагин клиента шлет 4-тому плагину сервера строку из эдит бокса - плагин сервера ее получает и отправляет назад - клиентский плагин выводит ее в мессбоксе. В прицепе если тебе хочется понять как взаимодействует ядро с плагинами, то это облегчит тебе задачу.
Из всей истории с плагинами мне показалось немного интересно только если клиент будет полагинный, а сервер нет. И то только потому. что легко можно урезать функциональность - убрал плагин для телнет и нет телнета Больше ничего.
В результате экскримента ) со скринлогерами победителем оказался вариант openGL. Так что использую его. Всем спасибо за внимание.