Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336

Вызов функции другого процесса (неверные регистры)

29.12.2015, 23:03. Показов 4810. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Я пытаюсь вызвать функцию из другого процесса, но вот беда - регистры формируются не те, из-за чего вызов функции происходит (отслеживаю через Cheat Engine debugger), но не делается то, что должно.
Что именно я делаю:
1. создаю CLRHost.dll, которую инжектирю через CheatEngine в приложение Wow-64.exe
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <Windows.h>
 
#include <metahost.h>
//#include <mscoree.h>
#include <string>
 
#pragma comment(lib, "mscoree.lib")
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
 
DWORD WINAPI StartTheDotNetRuntime(LPVOID lpParameter)
{
    ICLRMetaHost *lpMetaHost = NULL;
    HRESULT hr;
 
    // выделяем адрессное пространство
    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID *)&lpMetaHost);
    if (FAILED(hr)) return 1;
 
    DWORD dwVersion = 0;
    DWORD dwImageVersion = 0;
    ICLRRuntimeInfo * lpRuntimeInfo = NULL;
    // получаем информацию о CLR .NET
    hr = lpMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*)&lpRuntimeInfo);
    if (FAILED(hr)) return 2;
 
    ICLRRuntimeHost * lpRuntimeHost = NULL;
    // загружаем среду CLR
    hr = lpRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&lpRuntimeHost);
    if (FAILED(hr)) return 3;
 
    // запускаем CLR, используя CLR 4 версии
    hr = lpRuntimeHost->Start();
    if (FAILED(hr)) return 4;
 
    LPWSTR strDLLPath = new WCHAR[_MAX_PATH];
    ::GetModuleFileNameW((HINSTANCE)&__ImageBase, strDLLPath, _MAX_PATH);
 
    std::wstring tempPath = strDLLPath;
    INT64 index = tempPath.rfind('\\'); // последние символы в пути ""
    tempPath.erase(index, tempPath.length() - index); // удаляем все символы спереди, получается только имя
    tempPath += L"\\DomainManager.dll";
 
    DWORD dwRetCode = 0;
    // переходим в менеджер доменов и создаем домен для нашего приложения
    hr = lpRuntimeHost->ExecuteInDefaultAppDomain((LPWSTR)tempPath.c_str(), L"DomainManager.EntryPoint", L"Main", L"TestExecude.exe", &dwRetCode);
    if (FAILED(hr)) return 5;
 
    return 0;
}
 
BOOL APIENTRY DllMain(HINSTANCE hInts, DWORD reason, LPVOID reserved)
{
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
    {
        DWORD dwThread;
        // создаем поток с указанием функции для выполнения StartTheDotNetRuntime
        HANDLE hThread = CreateThread(0, 0, StartTheDotNetRuntime, NULL, 0, &dwThread);
    }
    case DLL_PROCESS_DETACH:
    {
 
    }
    }
    return true;
}

2. создается домен приложения в DomainManager
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
 
namespace DomainManager
{
    public interface IAssemblyLoader
    {
        void LoadAndRun(string file);
    }
 
    public class EntryPoint
    {
        [DllImport("User32.dll")]
        private static extern short GetAsyncKeyState(Keys vKey);
 
        [STAThread]
        public static int Main(string args)
        {
            bool firstLoaded = false;
            while (true)
            {
                if (!firstLoaded)
                {
                    firstLoaded = true;
                    new CleanDomain(args);
                }
 
                if ((GetAsyncKeyState(Keys.F11) & 1) == 1)
                {
                    new CleanDomain(args);
                }
 
                Thread.Sleep(10);
            }
            return 0;
        }
    }
 
    public static class DomainManager
    {
        public static AppDomain CurrentDomain { get; set; }
        public static CleanAssemblyLoader CurrentAssemblyLoader { get; set; }
    }
 
    public class CleanAssemblyLoader : MarshalByRefObject, IAssemblyLoader
    {
        public CleanAssemblyLoader()
        {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        }
 
        #region IAssemblyLoader Members
 
        public void LoadAndRun(string file)
        {
            Assembly asm = Assembly.Load(file);
            MethodInfo entry = asm.EntryPoint;
            //object o = asm.CreateInstance(entry.Name);
            entry.Invoke(null, new object[] {null});
        }
 
        #endregion
 
        private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name == Assembly.GetExecutingAssembly().FullName)
                return Assembly.GetExecutingAssembly();
 
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string shortAsmName = Path.GetFileName(args.Name);
            string fileName = Path.Combine(appDir, shortAsmName);
 
            if (File.Exists(fileName))
            {
                return Assembly.LoadFrom(fileName);
            }
            return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null;
        }
    }
 
    /// <summary> 
    /// The actual domain object we'll be using to load and run the Onyx binaries.
    /// </summary>
    public class CleanDomain
    {
        private readonly Random _rand = new Random();
        public CleanDomain(string assemblyName)
        {
            try
            {
                string appBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                var ads = new AppDomainSetup { ApplicationBase = appBase, PrivateBinPath = appBase };
                DomainManager.CurrentDomain = AppDomain.CreateDomain("CleanDomain_Internal_" + _rand.Next(0, 100000),
                                                                     null, ads);
                AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
                DomainManager.CurrentAssemblyLoader =
                    (CleanAssemblyLoader)
                    DomainManager.CurrentDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName,
                                                               typeof(CleanAssemblyLoader).FullName);
                //System.Windows.Forms.MessageBox.Show(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), assemblyName));
                
                DomainManager.CurrentAssemblyLoader.LoadAndRun(
                    Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), assemblyName));
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                DomainManager.CurrentAssemblyLoader = null;
                AppDomain.Unload(DomainManager.CurrentDomain);
            }
        }
 
        Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            try
            {
                Assembly assembly = System.Reflection.Assembly.Load(args.Name);
                if (assembly != null)
                    return assembly;
            }
            catch
            {
                // ignore load error 
            }
 
            // *** Try to load by filename - split out the filename of the full assembly name
            // *** and append the base path of the original assembly (ie. look in the same dir)
            // *** NOTE: this doesn't account for special search paths but then that never
            //           worked before either.
            string[] Parts = args.Name.Split(',');
            string File = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "" + Parts[0].Trim() + ".dll";
 
            return System.Reflection.Assembly.LoadFrom(File);
        }
    }
}

3. Вызываю функцию через delegat.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace TestExecude
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Int64 CastSpellOffset = 0x45C9F0; //0x45DE0B;
            Int64 address = Process.GetProcessesByName("Wow-64")[0].MainModule.BaseAddress.ToInt64() + CastSpellOffset;
            CastSpellByID Cast = (CastSpellByID)Marshal.GetDelegateForFunctionPointer(new IntPtr(address), typeof(CastSpellByID));
            Cast(19434, 0, new byte[16], 0, 0, 0, 0);
        }
 
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        delegate Int64 CastSpellByID(UInt64 spellId, Int64 itemId, byte[] guid, Int64 isTrade, Int64 a6, Int64 a7, Int64 a8);
    }
}

Что такое CastSpellByID? Эта функция, которая находится по адресу Wow-64.exe + CastSpellOffset (0x45C9F0). Если смотреть через IDA, то она находится по адресу 14045C9F0. А Cast(19434, 0, new byte[16], 0, 0, 0, 0); 19434 - это Aimshot.
С введением разобрались, теперь к проблеме. Перед тем, как проверить свою программу, я ставлю брейкпойнт в CheatEngine на функцию каста по адресу упомянутом выше Wow-64.exe + 45C9F0. Вызов функции происходит! но, значения регистров не там, где они должны быть.

Как показано на картинке, 1-вые значения регистров стандартные (т.е. вызывается непосредственно из игры). Наш Aimshot будет выглядеть, как 19434 dec = 4BEA hex. Отсюда видно, что ID заклинания находится в регистрах RDX и RBP.
На 2 картинке уже непосредственно мой вызов через инжект функции Cast(19434) и без лишних переменных, объявленный делегат при этом delegate Int64 CastSpellByID(UInt64 spellId);
На 3 картинке уже вызов Cast(19434, 0, new byte[16], 0, 0, 0, 0); (взято из другого, старого, уже не рабочего проекта) и delegate Int64 CastSpellByID(UInt64 spellId, Int64 itemId, byte[] guid, Int64 isTrade, Int64 a6, Int64 a7, Int64 a8).
Как видно во 2 и 3 случае ID заклинания 4BEA находится в регистре RCX, из-за чего происходит последующий вызов на несуществующий адрес другой функции.

Что можете посоветовать?
Миниатюры
Вызов функции другого процесса (неверные регистры)  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2015, 23:03
Ответы с готовыми решениями:

Завершение процесса при обнаружении другого процесса
Здравствуйте. Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за процессами в диспетчере, запущены 2...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Вызов функции другого класса, в котором есть переменные текущего
Есть форма (Ф), на ней есть листы с данными, листбокс и таймер, а так же функция, которая принимается строчные переменные, для вывода в...

26
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
02.01.2016, 16:50  [ТС]
Студворк — интернет-сервис помощи студентам
Возможно я погорячился, все функции лишь проверка на что-то, кроме 45E8C0, которая постоянно вызывается, или 45F440 - только во время самого каста.

Добавлено через 23 минуты
Цитата Сообщение от Konctantin Посмотреть сообщение
Вот сигнатура с клиента который содержит отладочные символы, староват правда, но понять думаю кое что получится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
char __usercall Spell_C_CastSpell@<al>(int a1@<edi>, __int64 a2@<rsi>, __int64 a3@<rdx>, unsigned __int8 a4@<cl>, int a5@<r8d>, int a6@<r9d>, __m128 xmm0_0@<xmm0>, int xmm1_4_0@<xmm1>, char a7, unsigned __int8 a8, unsigned __int8 a9, __int16 a12)
{
  int v12; // er13@1
  __int64 *v13; // r14@1
  unsigned __int8 v14; // r12@1
  signed __int64 v15; // rax@1
  __int64 v16; // rax@2
  unsigned __int64 v18; // [sp+40h] [bp-30h]@1
 
  v12 = a6;
  v13 = (__int64 *)(unsigned int)a5;
  v14 = a4;
  v18 = a3;
  v15 = CGPlayer_C::m_activePlayerPtr;
  if ( !CGPlayer_C::m_activePlayerPtr )
  {
    v16 = ClntObjMgrGetActivePlayer();
    LODWORD(v15) = ClntObjMgrObjectPtr(v16, 16LL, "../Object/ObjectClient/Player_C.h", 201LL);
    CGPlayer_C::m_activePlayerPtr = v15;
  }
  return Spell_C_CastSpell(
           a2,
           v18,
           v15,
           (unsigned int)a1,
           0LL,
           v14,
           v13,
           xmm0_0,
           xmm1_4_0,
           (char)v13,
           v12,
           a7,
           a8,
           a9,
           a12);
}
Да, сейчас буду разбираться, но все равно получается, что берутся эти 2 неизвестных мне значения, мой hex-rays этой функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
char __fastcall sub_14045E3A0(unsigned int a1, __int64 a2, __int64 a3, __int64 a4)
{
  __int64 Player; // rax@1
  __int64 v5; // rbx@1
  __int64 v6; // rdi@1
  __int64 v7; // rsi@1
  unsigned int ID; // ebp@1
  char v10; // [sp+30h] [bp-18h]@2
 
  Player = pPlayer;
  v5 = a4;
  v6 = a3;
  v7 = a2;
  ID = a1;
  if ( !pPlayer )
  {
    sub_140478A50(&v10);
    LODWORD(Player) = sub_14047A2E0(
                        &v10,
                        16i64,
                        "D:\\BuildServer\\WoW\\3\\work\\shared-checkout\\branches\\wow-patch-6_2_3-branch-fastpatch-0\\Wo"
                        "W\\Source\\Object/ObjectClient/Player_C.h",
                        206i64);
    pPlayer = Player;
  }
  return sub_14045C9F0(ID, Player, v7, v6, v5);
}
а2 - RDX, a3 - всегда 0, a4 - R9;
Проблема все равно остается в поиске этих значений, поскольку, насколько я понял, они инициализируются в момент загрузки Wow (логин скрин), т.к. в не зависимо от аккаунта(спец. брал чужой) и персонажа эти значения не меняются.
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
02.01.2016, 17:29  [ТС]
Нашел такую странность, если RDX = 20F310 и при вызове функции каста 45E3A0 на брейкпоинте не запускать дальше приложение Wow, и начать поиск значения 20F310, то найдется след. адрес 0020F138, который постоянно меняет значения.
К адресу 0020F138 много что обращается, включая неизвестные мне [MSCTF.dll+A16B0], [atidxx64.AmdDxGsaFreeCompiledShader+5978 E0], MSCTF.TF_IsThreadWithFlags+46C, [kernel32.UnhandledExceptionFilter+1498] и другие.
PS: кабы не пришлось все равно лезть в Directx
Миниатюры
Вызов функции другого процесса (неверные регистры)  
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
02.01.2016, 17:35  [ТС]
Интересно, можно ли узнать к какому модулю принадлежит выделенная память по этому адресу 0020F138?
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
02.01.2016, 20:52  [ТС]
Хм... мои расследования привели меня вот к теме стековый кадр. Пока, я понятия не имею, почему так происходит, и зачем (если это было сделано) это сделано (тавтология О_о).
Миниатюры
Вызов функции другого процесса (неверные регистры)  
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
05.01.2016, 15:21  [ТС]
Продолжение банкета. Через потоки определил расположение Stack. Возможно удастся выявить закономерность выделения потока + смещение от Stack low \ high потока.
Миниатюры
Вызов функции другого процесса (неверные регистры)  
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
05.01.2016, 21:42  [ТС]
Решил еще раз поискать адреса через CE. Через сканирование до адреса нашел следующие значения (на картинке). Использую самый первый статический адрес, пока накладок нет (4 раза проверил перезапуская WoW). T.e:
["Wow-64.exe"+01861C48] + 0x128 = адрес на RBP;
RBP = R9;
R9 - 1A0 = RDX;

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace TestExecude
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Int64 CastSpellOffset = 0x45E3A0; //0x45C9F0; //0x45DE0B;
            ProcessMemory mem_wow = new ProcessMemory();
            Int64 address = mem_wow.GetBaseAddress() + CastSpellOffset;
            CastSpellByID Cast = (CastSpellByID)Marshal.GetDelegateForFunctionPointer(new IntPtr(address), typeof(CastSpellByID));
            // ["Wow-64.exe"+01861C48] + 0x128 = RBP = R9
            Int64 rbp = mem_wow.ReadAddress(mem_wow.GetBaseAddress() + 0x01861C48) + 0x128;
            Cast(19434, rbp - 0x1A0, 0, rbp);
        }
 
        //char __fastcall sub_14045E3A0(unsigned int a1, __int64 a2, __int64 a3, __int64 a4)
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        delegate Int64 CastSpellByID(UInt64 a1, Int64 a2, Int64 a3, Int64 a4);
 
        [DllImport("kernel32.dll")]
        static extern bool ReadProcessMemory(IntPtr hProcess, Int64 lpBaseAddress, byte[] buffer, Int64 nSize, out Int64 lpNumberOfBytesRead);
 
        class ProcessMemory
        {
            Process pWow;
 
            public ProcessMemory()
            {
                pWow = Process.GetProcessesByName("Wow-64")[0];
            }
 
            public Int64 GetBaseAddress()
            {
                return pWow.MainModule.BaseAddress.ToInt64();
            }
 
            public Int64 ReadAddress(Int64 address)
            {
                Int64 numRead = 0;
                byte[] buffer = new byte[sizeof(Int64)];
                ReadProcessMemory(pWow.Handle, address, buffer, sizeof(Int64), out numRead);
                return BitConverter.ToInt64(buffer, 0);
            }
        }
    }
}


PS: особая благодарность за помощь Konctantin, решение найдено. Тему можно закрывать.
Миниатюры
Вызов функции другого процесса (неверные регистры)  
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
11.01.2016, 23:17  [ТС]
Предыдущее решение не совсем верное, и работает на "костылях".
Исследуя функции, что вызывают функцию каста 45E3A0, я наткнулся на интересную функцию 45E7D0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
char __fastcall sub_14045E7D0(__int64 a1, __int64 a2)
{
  __int64 v2; // rbx@1
  __int64 v3; // rdi@1
  __int64 v4; // rax@5
  __int64 v5; // rcx@6
  __int64 v6; // ST20_8@6
  int v7; // eax@6
  __int64 v8; // rcx@6
  unsigned int *v9; // rax@8
  char result; // al@10
  __int64 v11; // [sp+28h] [bp-10h]@6
 
  v2 = a2;
  v3 = a1;
  if ( a1
    && a2
    && *(_DWORD *)(*(_QWORD *)(a2 + 544) + 400i64)
    && dword_1414D3090
    && (LODWORD(v4) = sub_1400051F0(), v4)
    && (v5 = *(_QWORD *)(v4 + 8),
        LODWORD(v6) = *(_DWORD *)v5,
        HIDWORD(v6) = *(_DWORD *)(v5 + 4),
        LODWORD(v11) = *(_DWORD *)(v5 + 8),
        v7 = *(_DWORD *)(v5 + 12),
        v8 = *(_QWORD *)(v2 + 544),
        HIDWORD(v11) = v7,
        v6 == *(_QWORD *)(v8 + 80))
    && v11 == *(_QWORD *)(v8 + 88)
    && (LODWORD(v9) = sub_140235B70(&qword_1414C12F0), v9)
    && Spell_C_CastSpell(*v9, (__int64)&unk_1414DC9C0, 0i64, (__int64)&xmmword_14179D938) )
  {
    result = sub_14045B3D0(v3, 0i64, &unk_1414DC9C0);
  }
  else
  {
    result = 0;
  }
  return result;
}
Где Spell_C_CastSpell наша функция каста 45E3A0.
Spell_C_CastSpell(*v9, (__int64)&unk_1414DC9C0, 0i64, (__int64)&xmmword_14179D938)
V9 = ID каста
(__int64)&unk_1414DC9C0 = указатель на статичный массив из 20 байт, в котором постоянно нули :\
0i64 = 0
(__int64)&xmmword_14179D938 = указатель на GUID, который тоже постоянно нулевой
Для вызова функции просто так же передаем адреса на эти статичные переменные.
В отличие от предыдущего решения, который иногда не работал, этот работает на 100%.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2016, 23:17

Вызов функции из другого файла
Ребят! Привет! Я новый на этом форуме. Мне стало интересно как заставить программу перейти с одного кода (после выполнения) на другой (не...

Вызов функции из другого файла
Знаю этот вопрос, задавался не раз(возможно), но поиск показал одну тему в которой, небыло дано ясного ответа... Так вот в чем вопрос:...

Вызов функции из другого скрипта
Вот есть фоновый скрипт, в нём чисто запросы, обработчики с действиями... function GetHttpRequest(href, arg) { var xhr = new...

Вызов функции из другого файла
Доброго времени суток. Друзья подскажите, как можно вызвать функцию из другого файла? У меня сейчас tree сайта такого вида: ...

Вызов функции из другого скрипта
Доброго времени суток. Проблема заключается в следующем, имеется два скрипта (script1 и script2), нужно вызвать функции в script1, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru