Задача: имеется сервер из нескольких программ (сервисов), работающий с mySQL. Все запросы выполняются к стандартной libmysql.dll через "коммутирующую" библиотеку сервера mysql.dll. Требуется врезаться в mysql.dll для передачи управления обработки запросов своей DLL: Вариант-A: {Server} --> mysql.dll --> new.dll --> libmysql.dll или Вариант-B: {Server} --> mysql.dll --> new.dll --> mysql.dll --> libmysql.dll mysql.dll вызывает функции: mysql_affected_rows @29 mysql_close @32 mysql_errno @41 mysql_fetch_lengths @47 mysql_fetch_row @48 mysql_free_result @52 mysql_init @60 mysql_insert_id @61 mysql_real_connect @77 mysql_real_escape_string @78 mysql_real_query @79 mysql_store_result @94 Простое решение по варианту-A, типа пробросить все 12 функций к libmysql.dll не срабатывает из-за того, что вызов mysql_real_query приводит к следующему вызову mysql_read_query_result и т.д. Получается стандартная тупиковая ситуация, когда и новая DLL отдельно выполняет тесты всех функций, и сервер стартует нормально, но клиентская программа к серверу не коннектится. Делаю попытку пройти по варианту-B. В mysql.dll к трем DLL из IAT (KERNEL32.dll, libapr.dll и LIBMYSQL.dll): Old: 00005000: CA 57 00 00-96 59 00 00-84 59 00 00-72 59 00 00 KERNEL32.dll 00005010: 62 59 00 00-52 59 00 00-3C 59 00 00-2C 59 00 00 00005020: 1A 59 00 00-0E 59 00 00-04 59 00 00-F8 58 00 00 00005030: EA 58 00 00-DA 58 00 00-CE 58 00 00-B2 58 00 00 00005040: 08 57 00 00-1A 57 00 00-28 57 00 00-34 57 00 00 00005050: 40 57 00 00-4E 57 00 00-62 57 00 00-76 57 00 00 00005060: 8A 57 00 00-A0 57 00 00-BA 57 00 00-D8 57 00 00 00005070: E6 57 00 00-F4 57 00 00-06 58 00 00-16 58 00 00 00005080: 24 58 00 00-36 58 00 00-50 58 00 00-6A 58 00 00 00005090: 80 58 00 00-98 58 00 00-00 00 00 00-E4 56 00 00 LIBMYSQL.dll 000050A0: CE 56 00 00-BC 56 00 00-A8 56 00 00-8C 56 00 00 000050B0: 7E 56 00 00-68 56 00 00-5A 56 00 00-4C 56 00 00 000050C0: 36 56 00 00-24 56 00 00-10 56 00 00-00 00 00 00 000050D0: F4 55 00 00-E4 55 00 00-C4 55 00 00-00 00 00 00 libapr.dll добавляем функцию linqdsql из новой DLL - libmxsql.dll. Для этого (т.к. размер IAT менять проблематично) вырезаем из нее mysql_errno и mysql_close: New: 00005000: CA 57 00 00-96 59 00 00-84 59 00 00-72 59 00 00 KERNEL32.dll 00005010: 62 59 00 00-52 59 00 00-3C 59 00 00-2C 59 00 00 00005020: 1A 59 00 00-0E 59 00 00-04 59 00 00-F8 58 00 00 00005030: EA 58 00 00-DA 58 00 00-CE 58 00 00-B2 58 00 00 00005040: 08 57 00 00-1A 57 00 00-28 57 00 00-34 57 00 00 00005050: 40 57 00 00-4E 57 00 00-62 57 00 00-76 57 00 00 00005060: 8A 57 00 00-A0 57 00 00-BA 57 00 00-D8 57 00 00 00005070: E6 57 00 00-F4 57 00 00-06 58 00 00-16 58 00 00 00005080: 24 58 00 00-36 58 00 00-50 58 00 00-6A 58 00 00 00005090: 80 58 00 00-98 58 00 00-00 00 00 00-E4 59 00 00 libapr.dll 000050A0: D4 59 00 00-B4 59 00 00-00 00 00 00-E4 56 00 00 LIBMYSQL.dll 000050B0: CE 56 00 00-BC 56 00 00-A8 56 00 00-8C 56 00 00 000050C0: 7E 56 00 00-68 56 00 00-36 56 00 00-24 56 00 00 000050D0: 10 56 00 00-00 00 00 00-F6 55 00 00-00 00 00 00 LIBMXSQL.dll Для недостающего свободного место смещаем секцию Export (libapr.dll и LIBMYSQL.dll меняются местами для облегчения последующей правки): Old: 000059B0: 00 00 00 00-5F 3D 51 42-00 00 00 00-E2 59 00 00 _=QB тY 000059C0: 01 00 00 00-01 00 00 00-01 00 00 00-D8 59 00 00 ╪Y 000059D0: DC 59 00 00-E0 59 00 00-E0 11 00 00-EC 59 00 00 ▄Y рY р ьY 000059E0: 00 00 6D 79-73 71 6C 2E-64 6C 6C 00-63 72 65 61 mysql.dll crea 000059F0: 74 65 4F 62-6A 65 63 74-00 00 00 00-00 00 00 00 teObject New: 000059B0: 00 00 00 00-CA 00 5F 61-70 72 5F 70-6F 6F 6C 5F ╩ _apr_pool_ 000059C0: 63 6C 65 61-6E 75 70 5F-72 65 67 69-73 74 65 72 cleanup_register 000059D0: 40 31 36 00-12 01 5F 61-70 72 5F 73-6C 65 65 70 @16 _apr_sleep 000059E0: 40 38 00 00-B1 00 5F 61-70 72 5F 70-61 6C 6C 6F @8 ▒ _apr_pallo 000059F0: 63 40 38 00-6C 69 62 61-70 72 2E 64-6C 6C 00 00 c@8 libapr.dll 00005A00: 00 00 00 00-5F 3D 51 42-00 00 00 00-32 5A 00 00 _=QB 2Z 00005A10: 01 00 00 00-01 00 00 00-01 00 00 00-28 5A 00 00 (Z 00005A20: 2C 5A 00 00-30 5A 00 00-E0 11 00 00-3C 5A 00 00 ,Z 0Z р <Z 00005A30: 00 00 6D 79-73 71 6C 2E-64 6C 6C 00-63 72 65 61 mysql.dll crea 00005A40: 74 65 4F 62-6A 65 63 74-00 00 00 00-00 00 00 00 teObject Соответственно изменяю остальные таблицы: Old: 000054A0: 04 56 00 00-D0 50 00 00-80 55 00 00-00 00 00 00 V ╨P АU 000054B0: 00 00 00 00-FA 56 00 00-9C 50 00 00-E4 54 00 00 ·V ЬP фT 000054C0: 00 00 00 00-00 00 00 00-A2 59 00 00-00 50 00 00 вY P 000054D0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00 New: 000054A0: F4 59 00 00-9C 50 00 00-B0 55 00 00-00 00 00 00 ЇY ЬP ░U 000054B0: 00 00 00 00-FA 56 00 00-AC 50 00 00-04 55 00 00 ·V мP U 000054C0: 00 00 00 00-00 00 00 00-A2 59 00 00-00 50 00 00 вY P 000054D0: DC 55 00 00-00 00 00 00-00 00 00 00-02 56 00 00 ▄U V 000054E0: D8 50 00 00-00 00 00 00-00 00 00 00-00 00 00 00 ╪P 000054F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00 Old: 000054E0: 00 00 00 00-CA 57 00 00-96 59 00 00-84 59 00 00 ╩W ЦY ДY 000054F0: 72 59 00 00-62 59 00 00-52 59 00 00-3C 59 00 00 rY bY RY <Y 00005500: 2C 59 00 00-1A 59 00 00-0E 59 00 00-04 59 00 00 ,Y Y Y Y 00005510: F8 58 00 00-EA 58 00 00-DA 58 00 00-CE 58 00 00 °X ъX ┌X ╬X 00005520: B2 58 00 00-08 57 00 00-1A 57 00 00-28 57 00 00 ▓X W W (W 00005530: 34 57 00 00-40 57 00 00-4E 57 00 00-62 57 00 00 4W @W NW bW 00005540: 76 57 00 00-8A 57 00 00-A0 57 00 00-BA 57 00 00 vW КW аW ║W 00005550: D8 57 00 00-E6 57 00 00-F4 57 00 00-06 58 00 00 ╪W цW ЇW X 00005560: 16 58 00 00-24 58 00 00-36 58 00 00-50 58 00 00 X $X 6X PX 00005570: 6A 58 00 00-80 58 00 00-98 58 00 00-00 00 00 00 jX АX ШX 00005580: E4 56 00 00-CE 56 00 00-BC 56 00 00-A8 56 00 00 фV ╬V ╝V иV 00005590: 8C 56 00 00-7E 56 00 00-68 56 00 00-5A 56 00 00 МV ~V hV ZV 000055A0: 4C 56 00 00-36 56 00 00-24 56 00 00-10 56 00 00 LV 6V $V V 000055B0: 00 00 00 00-F4 55 00 00-E4 55 00 00-C4 55 00 00 ЇU фU ─U New: 00005500: 00 00 00 00-CA 57 00 00-96 59 00 00-84 59 00 00 ╩W ЦY ДY 00005510: 72 59 00 00-62 59 00 00-52 59 00 00-3C 59 00 00 rY bY RY <Y 00005520: 2C 59 00 00-1A 59 00 00-0E 59 00 00-04 59 00 00 ,Y Y Y Y 00005530: F8 58 00 00-EA 58 00 00-DA 58 00 00-CE 58 00 00 °X ъX ┌X ╬X 00005540: B2 58 00 00-08 57 00 00-1A 57 00 00-28 57 00 00 ▓X W W (W 00005550: 34 57 00 00-40 57 00 00-4E 57 00 00-62 57 00 00 4W @W NW bW 00005560: 76 57 00 00-8A 57 00 00-A0 57 00 00-BA 57 00 00 vW КW аW ║W 00005570: D8 57 00 00-E6 57 00 00-F4 57 00 00-06 58 00 00 ╪W цW ЇW X 00005580: 16 58 00 00-24 58 00 00-36 58 00 00-50 58 00 00 X $X 6X PX 00005590: 6A 58 00 00-80 58 00 00-98 58 00 00-00 00 00 00 jX АX ШX 000055A0: E4 59 00 00-D4 59 00 00-B4 59 00 00-00 00 00 00 фY ╘Y ┤Y 000055B0: E4 56 00 00-CE 56 00 00-BC 56 00 00-A8 56 00 00 фV ╬V ╝V иV 000055C0: 8C 56 00 00-7E 56 00 00-68 56 00 00-36 56 00 00 МV ~V hV 6V 000055D0: 24 56 00 00-10 56 00 00-00 00 00 00-F6 55 00 00 $V V ЎU 000055E0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00 Old: 000055C0: 00 00 00 00-CA 00 5F 61-70 72 5F 70-6F 6F 6C 5F ╩ _apr_pool_ 000055D0: 63 6C 65 61-6E 75 70 5F-72 65 67 69-73 74 65 72 cleanup_register 000055E0: 40 31 36 00-12 01 5F 61-70 72 5F 73-6C 65 65 70 @16 _apr_sleep 000055F0: 40 38 00 00-B1 00 5F 61-70 72 5F 70-61 6C 6C 6F @8 ▒ _apr_pallo 00005600: 63 40 38 00-6C 69 62 61-70 72 2E 64-6C 6C 00 00 c@8 libapr.dll <--Уходит в район секции Export 00005610: 36 00 6D 79-73 71 6C 5F-66 72 65 65-5F 72 65 73 6 mysql_free_res 00005620: 75 6C 74 00-32 00 6D 79-73 71 6C 5F-66 65 74 63 ult 2 mysql_fetc 00005630: 68 5F 72 6F-77 00 31 00-6D 79 73 71-6C 5F 66 65 h_row 1 mysql_fe 00005640: 74 63 68 5F-6C 65 6E 67-74 68 73 00-22 00 6D 79 tch_lengths " my 00005650: 73 71 6C 5F-63 6C 6F 73-65 00 2B 00-6D 79 73 71 sql_close + mysq 00005660: 6C 5F 65 72-72 6E 6F 00-4D 00 6D 79-73 71 6C 5F l_errno M mysql_ 00005670: 72 65 61 6C-5F 63 6F 6E-6E 65 63 74-00 00 3C 00 real_connect < 00005680: 6D 79 73 71-6C 5F 69 6E-69 74 00 00-4E 00 6D 79 mysql_init N my 00005690: 73 71 6C 5F-72 65 61 6C-5F 65 73 63-61 70 65 5F sql_real_escape_ 000056A0: 73 74 72 69-6E 67 00 00-4F 00 6D 79-73 71 6C 5F string O mysql_ 000056B0: 72 65 61 6C-5F 71 75 65-72 79 00 00-3D 00 6D 79 real_query = my 000056C0: 73 71 6C 5F-69 6E 73 65-72 74 5F 69-64 00 1F 00 sql_insert_id 000056D0: 6D 79 73 71-6C 5F 61 66-66 65 63 74-65 64 5F 72 mysql_affected_r 000056E0: 6F 77 73 00-5E 00 6D 79-73 71 6C 5F-73 74 6F 72 ows ^ mysql_stor 000056F0: 65 5F 72 65-73 75 6C 74-00 00 4C 49-42 4D 59 53 e_result LIBMYS 00005700: 51 4C 2E 64-6C 6C 00 00-FD 00 47 65-74 43 6F 6D QL.dll ¤ GetCom New: 000055F0: 00 00 00 00-00 00 01 00-6C 69 6E 71-64 73 71 6C linqdsql 00005600: 00 00 4C 49-42 4D 58 53-51 4C 2E 64-6C 6C 00 00 LIBMXSQL.dll 00005610: 36 00 6D 79-73 71 6C 5F-66 72 65 65-5F 72 65 73 6 mysql_free_res 00005620: 75 6C 74 00-32 00 6D 79-73 71 6C 5F-66 65 74 63 ult 2 mysql_fetc 00005630: 68 5F 72 6F-77 00 31 00-6D 79 73 71-6C 5F 66 65 h_row 1 mysql_fe 00005640: 74 63 68 5F-6C 65 6E 67-74 68 73 00-22 00 6D 79 tch_lengths " my 00005650: 73 71 6C 5F-63 6C 6F 73-65 00 2B 00-6D 79 73 71 sql_close + mysq 00005660: 6C 5F 65 72-72 6E 6F 00-4D 00 6D 79-73 71 6C 5F l_errno M mysql_ 00005670: 72 65 61 6C-5F 63 6F 6E-6E 65 63 74-00 00 3C 00 real_connect < 00005680: 6D 79 73 71-6C 5F 69 6E-69 74 00 00-4E 00 6D 79 mysql_init N my 00005690: 73 71 6C 5F-72 65 61 6C-5F 65 73 63-61 70 65 5F sql_real_escape_ 000056A0: 73 74 72 69-6E 67 00 00-4F 00 6D 79-73 71 6C 5F string O mysql_ 000056B0: 72 65 61 6C-5F 71 75 65-72 79 00 00-3D 00 6D 79 real_query = my 000056C0: 73 71 6C 5F-69 6E 73 65-72 74 5F 69-64 00 1F 00 sql_insert_id 000056D0: 6D 79 73 71-6C 5F 61 66-66 65 63 74-65 64 5F 72 mysql_affected_r 000056E0: 6F 77 73 00-5E 00 6D 79-73 71 6C 5F-73 74 6F 72 ows ^ mysql_stor 000056F0: 65 5F 72 65-73 75 6C 74-00 00 4C 49-42 4D 59 53 e_result LIBMYS 00005700: 51 4C 2E 64-6C 6C 00 00-FD 00 47 65-74 43 6F 6D QL.dll ¤ GetCom За IAT стоит список адресов процедур из mysql.dll (что это вообще такое???) и не дающий исправить ее размер. Правим его для организации свободного места в процедурах: Old: 000050E0: 40 10 00 10-50 10 00 10-70 10 00 10-C0 10 00 10 @ P p └ 000050F0: 40 11 00 10-60 11 00 10-A0 11 00 10-80 11 00 10 @ ` а А 00005100: 90 11 00 10-80 10 00 10 New: 000050E0: 3D 10 00 10-50 10 00 10-70 10 00 10-C0 10 00 10 = P p └ 000050F0: 40 11 00 10-5D 11 00 10-A0 11 00 10-8C 11 00 10 @ ] а М 00005100: 96 11 00 10-80 10 00 10 Исправляем вызовы: Old: 10001200 $-FF25 D8500010 JMP DWORD PTR DS:[<&libapr._apr_pool_cle>; libapr._apr_pool_cleanup_register@16 10001206 $-FF25 D4500010 JMP DWORD PTR DS:[<&libapr._apr_sleep@8>>; libapr._apr_sleep@8 1000120C $-FF25 D0500010 JMP DWORD PTR DS:[<&libapr._apr_palloc@8>; libapr._apr_palloc@8 10001212 $-FF25 C8500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_free_>; LIBMYSQL.mysql_free_result 10001218 $-FF25 C4500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_fetch>; LIBMYSQL.mysql_fetch_row 1000121E $-FF25 C0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_fetch>; LIBMYSQL.mysql_fetch_lengths 10001224 $-FF25 BC500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_close>; LIBMYSQL.mysql_close 1000122A $-FF25 B8500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_errno>; LIBMYSQL.mysql_errno 10001230 $-FF25 B4500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_connect 10001236 $-FF25 B0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_init>>; LIBMYSQL.mysql_init 1000123C $-FF25 AC500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_escape_string 10001242 $-FF25 A8500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_query 10001248 $-FF25 A4500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_inser>; LIBMYSQL.mysql_insert_id 1000124E $-FF25 A0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_affec>; LIBMYSQL.mysql_affected_rows 10001254 $-FF25 9C500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_store>; LIBMYSQL.mysql_store_result New: 10001200 $-FF25 A4500010 JMP DWORD PTR DS:[<&libapr._apr_pool_cle>; libapr._apr_pool_cleanup_register@16 10001206 $-FF25 A0500010 JMP DWORD PTR DS:[<&libapr._apr_sleep@8>>; libapr._apr_sleep@8 1000120C $-FF25 9C500010 JMP DWORD PTR DS:[<&libapr._apr_palloc@8>; libapr._apr_palloc@8 10001212 $-FF25 D0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_free_>; LIBMYSQL.mysql_free_result 10001218 $-FF25 CC500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_fetch>; LIBMYSQL.mysql_fetch_row 1000121E $-FF25 C8500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_fetch>; LIBMYSQL.mysql_fetch_lengths 10001224 $-FF25 D8500010 JMP DWORD PTR DS:[<&LIBMXSQL.linqdsql>] ; LIBMXSQL.linqdsql 1000122A $-FF25 D8500010 JMP DWORD PTR DS:[<&LIBMXSQL.linqdsql>] ; LIBMXSQL.linqdsql 10001230 $-FF25 C4500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_connect 10001236 $-FF25 C0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_init>>; LIBMYSQL.mysql_init 1000123C $-FF25 BC500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_escape_string 10001242 $-FF25 B8500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_real_>; LIBMYSQL.mysql_real_query 10001248 $-FF25 B4500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_inser>; LIBMYSQL.mysql_insert_id 1000124E $-FF25 B0500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_affec>; LIBMYSQL.mysql_affected_rows 10001254 $-FF25 AC500010 JMP DWORD PTR DS:[<&LIBMYSQL.mysql_store>; LIBMYSQL.mysql_store_result И, наконец, правим вызов из процедуры mysql.dll функции из libmysql.dll: Old: 10001160 . 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 10001164 . 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] 10001168 . 50 PUSH EAX 10001169 . 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4] 1000116C . 52 PUSH EDX 1000116D . 50 PUSH EAX 1000116E . E8 CF000000 CALL <JMP.&LIBMYSQL.mysql_real_query> 10001173 . 85C0 TEST EAX,EAX 10001175 . 0F94C0 SETE AL 10001178 . C2 0800 RETN 8 New: 1000115B 90 NOP 1000115C 90 NOP 1000115D . 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 10001161 . 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] 10001165 . 50 PUSH EAX 10001166 . 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4] 10001169 . 52 PUSH EDX 1000116A . 50 PUSH EAX 1000116B . E8 D2000000 CALL <JMP.&LIBMYSQL.mysql_real_query> 10001170 . 85C0 TEST EAX,EAX 10001172 . 0F94C0 SETE AL 10001175 . 60 PUSHAD 10001176 . EB 07 JMP SHORT mysql.1000117F 10001178 > 61 POPAD 10001179 . 90 NOP 1000117A . 90 NOP 1000117B . 90 NOP 1000117C . C2 0800 RETN 8 1000117F > 90 NOP 10001180 . 90 NOP 10001181 . E8 9E000000 CALL <JMP.&LIBMXSQL.linqdsql> 10001186 .^EB F0 JMP SHORT mysql.10001178 И... стандартная тупиковая ситуация - сервер стартует нормально, но клиент к серверу не коннектится. Что делать? Написать свою DLL, пусть даже частично эмулирующую LIBMYSQL.dll? Нереально! Что происходит? Меняются регистры/стек после вызова "своей" функции? Или просто новая DLL работает "не правильно"? HELP!!! PS. Действующие лица (их можно взять из http://tor.net.ua/files/ ): linqd-3.1.12-setup.exe - тот самый сервер mysql.dll - библиотека сервера для работы с mySQL (исправленная) old_mysql.dll - то же, но оригинальная libapr.dll - служебная библиотека сервера libmxsql.dll - "новая" DLL libmySQL.dll - размера 249856K от mySQL 4.0.16
Понял... Упростим вопрос: 1000115B 90 NOP 1000115C 90 NOP 1000115D 90 NOP 1000115E 90 NOP 1000115F 90 NOP 10001160 90 NOP 10001161 90 NOP 10001162 90 NOP 10001163 90 NOP 10001164 90 NOP 10001165 90 NOP 10001166 90 NOP 10001167 . 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 1000116B . 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] 1000116F . 50 PUSH EAX 10001170 . 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4] 10001173 . 52 PUSH EDX 10001174 . 50 PUSH EAX 10001175 . E8 C8000000 CALL <JMP.&LIBMYSQL.mysql_real_query> 1000117A . 85C0 TEST EAX,EAX 1000117C . 0F94C0 SETE AL 1000117F . 90 NOP 10001180 . 90 NOP 10001181 . 90 NOP 10001182 . 90 NOP 10001183 . 90 NOP 10001184 . 90 NOP 10001185 . 90 NOP 10001186 . 90 NOP 10001187 . 90 NOP 10001188 . 90 NOP 10001189 . C2 0800 RETN 8 Как ^^^сюда^^^ вставить вызов своей функции, чтобы сохранить работоспособноть оригинального кода?