Привет. Решил немного пореверсить. Взял этот мотор, декодер сегментов. Код (Text): MODRM_MOD_MASK equ 11000000B MODRM_REG_MASK equ 00111000B MODRM_RM_MASK equ 00000111B SIB_SCALE_MASK equ 11000000B SIB_INDEX_MASK equ 00111000B SIB_BASE_MASK equ 00000111B OP_ESC_2B equ 0FH OP_BOUND equ 62H OP_ARPL equ 63H OP_IMUL4 equ 69H OP_IMUL1 equ 6BH OP_INSB equ 6CH OP_INSD equ 6DH OP_OUTSB equ 6EH OP_OUTSD equ 6FH OP_INT equ 0CDH OP_XLAT equ 0D7H OP_LAR equ 2 OP_LSL equ 3 OP_CMOVcc equ 40H OP_SETcc equ 90H OP_BT equ 0A3H OP_BTS equ 0ABH OP_BTC equ 0BBH OVSEG_DS equ 1 OVSEG_SS equ 2 OVSEG_ES equ 3 OVSEG_XY equ 4 ; MOVS, CMPS(Es:[Edi], Ds:[Esi]) QueryOverrideSegment proc Ip:PVOID, Pfx16:BOOLEAN mov edx,Ip movzx eax,byte ptr [edx] ; ; One-byte opcode map. E/O codes for ModRM field. ; 0123456789ABCDEF ; 0 1111000011110000 ; 1 1111000011110000 ; 2 1111000011110000 ; 3 1111000011110000 ; 4 0000000000000000 ; 5 0000000000000000 ; 6 0011000001010000 ; 7 0000000000000000 ; 8 1111111111111010 ; 9 0000000000000000 ; A 0000000000000000 ; B 0000000000000000 ; C 1100110000000000 ; D 1111000000000000 ; E 0000000000000000 ; F 0000000000000000 ; push 00000000000000000000000000000000B push 00000000000011110000000000110011B push 00000000000000000000000000000000B push 00000000000000000101111111111111B push 00000000000000000000101000001100B push 00000000000000000000000000000000B push 00001111000011110000111100001111B push 00001111000011110000111100001111B cmp al,OP_ESC_2B ; ; Two-byte opcode map. E code for ModRM field. ; 0123456789ABCDEF ; 0 0011000000000100 ; 1 0000000000000001 ; 2 0000000000000000 ; 3 0000000000000000 ; 4 1111111111111111 ; 5 0000000000000000 ; 6 0000000000000000 ; 7 0000000000000000 ; 8 0000000000000000 ; 9 1111111111111111 ; A 0001110000011101 ; B 1111111100011111 ; C 1100000000000000 ; D 0000000000000000 ; E 0000000000000000 ; F 0000000000000000 ; push 00000000000000000000000000000000B push 00000000000000000000000000000011B push 11111000111111111011100000111000B push 11111111111111110000000000000000B push 00000000000000000000000000000000B push 00000000000000001111111111111111B push 00000000000000000000000000000000B push 10000000000000000010000000001100B mov ecx,eax je Esc2B ; 2-byte escape. shr eax,5 and cl,31 bt dword ptr [esp + eax*4 + 8*4],ecx jc ModRM1 mov al,byte ptr [edx] sub al,6CH jb NoSeg1 sub al,2 jbe SegEs1 ; INS sub al,2 jbe SegDs1 ; OUTS sub al,(8FH - 6CH - 4) jb NoSeg1 .if Zero? ExtsGrp1A: ; Grp 1A test byte ptr [edx + 1],MODRM_REG_MASK ; ModR/M jnz NoSeg1 jmp ModRM1 .endif sub al,(0A0H - 8FH) jb NoSeg1 sub al,3 jbe SegDs1 ; MOV sub al,4 jbe SegXY ; MOVS, CMPS sub al,2 jbe NoSeg1 sub al,2 jbe SegEs1 ; STOS sub al,2 jbe SegDs1 ; LODS sub al,2 jbe SegEs1 ; SCAS sub al,(0C6H - 0AFH) jb NoSeg1 sub al,2 jbe ExtsGrp1A ; Grp 11 sub al,(OP_XLAT - 0C8H) jz SegDs1 ; XLAT ??? jb NoSeg1 sub al,(0F6H - OP_XLAT) jb NoSeg1 sub al,2 ja @f ; Grp 3 mov al,byte ptr [edx + 1] ; ModR/M and al,111000B cmp al,001000B jne ModRM1 NoSeg1: jmp NoSeg2 SegDs1: jmp SegDs2 SegEs1: jmp SegEs ModRM1: jmp ModRM2 @@: sub al,(0FEH - 0F6H - 2) jb NoSeg2 jnz @f ExtsGrp4: ; Grp 4 mov al,byte ptr [edx + 1] ; ModR/M and al,MODRM_REG_MASK cmp al,001000B jbe ModRM1 ; INC, DEC jmp NoSeg1 @@: ; Grp 5 mov al,byte ptr [edx + 1] ; ModR/M and al,MODRM_REG_MASK cmp al,111000B je NoSeg jmp ModRM1 Esc2B: movzx eax,byte ptr [edx + 1] mov ecx,eax inc edx shr eax,5 and cl,31 bt dword ptr [esp + eax*4],ecx jc ModRM1 mov al,byte ptr [edx] .if !al ; Grp 6 mov al,byte ptr [edx + 1] ; ModR/M and al,MODRM_REG_MASK cmp al,110000B jb ModRM1 NoSeg2: jmp NoSeg SegDs2: jmp SegDs .endif dec al .if Zero? ; Grp 7 mov al,byte ptr [edx + 1] and al,MODRM_REG_MASK cmp al,101000B je NoSeg ModRM2: jmp ModRM .endif sub al,(0AEH - 1) ; Grp 15 -> 4 jz ExtsGrp4 sub al,(0BAH - 0AEH) .if Zero? ; Grp 8 mov al,byte ptr [edx + 1] and al,MODRM_REG_MASK cmp al,100000B jb NoSeg jmp ModRM .endif sub al,(0C7H - 0BAH) jnz NoSeg ; Grp 9 mov al,byte ptr [edx + 1] and al,MODRM_REG_MASK cmp al,001000B je ModRM ; CMPXCHG8B NoSeg: xor eax,eax jmp Exit SegDs: mov al,OVSEG_DS jmp Exit SegSs: mov al,OVSEG_SS jmp Exit SegEs: mov al,OVSEG_ES jmp Exit SegXY: mov al,OVSEG_XY Exit: movzx eax,al add esp,32*2 ret ModRM: mov al,byte ptr [edx + 1] ; ModR/M mov ah,byte ptr [edx + 1] and al,MODRM_MOD_MASK and ah,MODRM_RM_MASK ; R/M rol al,2 ; MOD cmp al,11B je NoSeg .if !Pfx16 ; x32 sub ah,3 jbe SegDs dec ah .if Zero? ; SIB mov al,byte ptr [edx + 2] ; SIB and al,SIB_BASE_MASK sub al,100B ; Esp jz SegSs dec al jz SegSs jmp SegDs .endif dec ah jnz SegDs ; Esi/Edi test al,al jz SegDs ; Disp32 jmp SegSs ; Ebp .else ; x16 sub ah,2 jbe SegDs sub ah,2 jbe SegSs ; Bp sub ah,2 jbe SegDs dec ah jnz SegDs ; Bx test al,al jz SegDs ; Disp16 jmp SegSs ; Bp .endif QueryOverrideSegment endp Дамп. После небольших подсказок и просьбы оптимизации, выхлоп такой: Код (Text): ; FASM (Flat Assembler) - 32-bit flat binary MODRM_MOD_MASK = 11000000B MODRM_RM_MASK = 00000111B OVSEG_DS = 0x0 OVSEG_SS = 0x1 OVSEG_CS = 0x2 OVSEG_ES = 0x3 OVSEG_XY = 0x4 section '.data' data readable writeable TwoByteMap_Data: dd 0x0, 0x000F0033, 0x0, 0x00005FFF, 0x00000A0C, 0x0 dd 00000000000000000000000000000000B dd 00000000000000000000000000000011B dd 11111000111111111011100000111000B dd 11111111111111110000000000000000B dd 0x0 dd 00000000000000001111111111111111B dd 0x0 dd 10000000000000000010000000001100B OneByteMap_Data: dd 11110000111100001111000011110000B ; Opcode 0x00 - 0x1F dd 11110000111100001111000011110000B section '.text' code readable executable entry start start: sub_0: push ebp ; Пролог mov ebp, esp mov edx, [ebp+0x8] ; EDX = IP movzx eax, byte [edx] ; EAX = Opcode mov ecx, eax cmp al, 0x0F ; Проверка: двухбайтовый опкод (0x0F)? je loc_DA ; Jcc/ModR/M опкоды shr eax, 0x5 ; Подготовка индекса для битового теста and cl, 0x1F ; Подготовка бита bt [OneByteMap_Data+eax*4], ecx ; Проверка опкодов 0x00-0x1F jb ModRM_CHECK ; Если бит установлен, требуется ModR/M анализ ; --- Анализ диапазонов (RANGE_CHECK) --- mov al, [edx] sub al, 0x6C ; Opcode > 0x6B jb loc_130_DS ; Jmp (0x00-0x6B) -> DS (Default) sub al, 0x2 ; Opcode 0x6C, 0x6D (INS/OUTS) jbe SegSs_RET ; JBE -> SS sub al, 0x2 ; Opcode 0x70 - 0x7F (Короткие Jcc) jbe loc_138_CS ; JBE -> CS sub al, 0x1F ; Opcode 0x80 - 0x86 (Grp 1/2/3) jb loc_130_DS ; JB -> DS jne loc_77 ; JNE Opcode 0x87 (XCHG mem/reg) test byte [edx+0x1], 0x38 ; Проверка Opcode 0x87: REG-поле ModR/M jne loc_130_DS ; JNE -> DS jmp ModRM_CHECK ; JMP -> ModR/M анализ K ; JMP -> ModR/M анализ loc_77: sub al, 0x11 ; Opcode 0xA0 - 0xA3 (MOV AL/AX, mem) jb loc_130_DS ; JB -> DS sub al, 0x3 ; Opcode 0xA4, 0xA5 (MOVS) jbe loc_138_CS ; JBE -> CS (или ES, но CS для кода) sub al, 0x4 ; Opcode 0xA6, 0xA7 (CMPS, SCAS) jbe loc_140_XY ; JBE -> XY (ES/DS для строковых) sub al, 0x2 ; Opcode 0xA8, 0xA9 (TEST, MOV AL, imm) jbe loc_130_DS ; JBE -> DS sub al, 0x2 ; Opcode 0xAA, 0xAB (STOS) jbe SegSs_RET ; JBE -> SS (или ES, но SS для стека) sub al, 0x2 ; Opcode 0xAC, 0xAD (LODS) jbe loc_138_CS ; JBE -> CS sub al, 0x2 ; Opcode 0xAE, 0xAF (SCAS, CMPS) jbe SegSs_RET ; JBE -> SS sub al, 0x17 ; Opcode 0xC0 - 0xDF (CALL/RET, LOOP, Grp 4/5) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xE0-0xE3 (LOOP) jbe loc_130_DS ; JBE -> DS sub al, 0x0F ; Opcode 0xF0 - 0xF7 (LOCK/REP, Grp 3) jz loc_138_CS ; JZ -> CS (LOCK/REP) jb loc_130_DS ; JB -> DS sub al, 0x1F ; Opcode 0xF8 - 0xFA (CLC, STI) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xFB - 0xFF (HLT, Grp 5/6) ja ModRM_CHECK ; JA -> ModR/M анализ mov al, [edx+0x1] ; Анализ Grp 3 (TEST/NOT/NEG/MUL/DIV) and al, 0x38 sub al, 0x17 ; Opcode 0xC0 - 0xDF (CALL/RET, LOOP, Grp 4/5) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xE0-0xE3 (LOOP) jbe loc_130_DS ; JBE -> DS sub al, 0x0F ; Opcode 0xF0 - 0xF7 (LOCK/REP, Grp 3) jz loc_138_CS ; JZ -> CS (LOCK/REP) jb loc_130_DS ; JB -> DS sub al, 0x1F ; Opcode 0xF8 - 0xFA (CLC, STI) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xFB - 0xFF (HLT, Grp 5/6) ja ModRM_CHECK ; JA -> ModR/M анализ mov al, [edx+0x1] ; Анализ Grp 3 (TEST/NOT/NEG/MUL/DIV) and al, 0x38 or al, al jne loc_101 mov al, [edx+0x1] and al, 0x38 cmp al, 0x30 jb loc_130_DS jmp loc_130_DS loc_FF: jmp SegSs_RET loc_101: dec al jne loc_110 or al, al jne loc_101 mov al, [edx+0x1] and al, 0x38 cmp al, 0x30 jb loc_130_DS jmp loc_130_DS loc_FF: jmp SegSs_RET loc_101: dec al jne loc_110 mov al, [edx+0x1] and al, 0x38 cmp al, 0x28 jz loc_130_DS jmp ModRM_CHECK loc_110: sub al, 0xAD jz loc_138_CS sub al, 0x0C jne loc_123 mov al, [edx+0x1] and al, 0x38 cmp al, 0x20 jb loc_130_DS jmp ModRM_CHECK loc_123: sub al, 0x0D jne loc_130_DS mov al, [edx+0x1] and al, 0x38 cmp al, 0x8 jz ModRM_CHECK ; --- Анализ ModR/M (ModRM_CHECK) --- ModRM_CHECK: mov al,byte ptr [edx + 1] ; Загрузка ModR/M mov ah,byte ptr [edx + 1] mov cl, al and cl, MODRM_MOD_MASK ; MOD (биты 7-6) rol cl, 2 cmp cl, 11B ; Проверка MOD = 11B (регистр) je loc_130_DS ; Если регистр, DS and ah, MODRM_RM_MASK ; R/M (биты 2-0) cmp ah, 0x4 ; R/M = 4 (ESP/SIB)? je SegSs_RET cmp ah, 0x5 ; R/M = 5 (EBP/Disp32)? jne loc_130_DS ; JNE -> DS (другие регистры) jmp SegSs_RET ; R/M=EBP всегда SS (исправленная логика) ; --- Блоки установки сегмента (Финал) --- loc_130_DS: mov al, OVSEG_DS ; Return DS (0) jmp Exit_Common SegSs_RET: mov al, OVSEG_SS ; Return SS (1) jmp Exit_Common loc_138_CS: mov al, OVSEG_CS ; Return CS (2) jmp Exit_Common loc_13C_ES: mov al, OVSEG_ES ; Return ES (3) jmp Exit_Common loc_140_XY: mov al, OVSEG_XY ; Return XY (4) jmp Exit_Common Exit_Common: movzx eax, al leave ; Эпилог ret 0x8 sub_0 ENDP Может трассировать: Нашел ошибку(хз): Если этой штуке виртуальную байткод машину дать посмотреть ?
Код (Text): ; FASM (Flat Assembler) - 32-bit flat binary MODRM_MOD_MASK = 11000000B MODRM_RM_MASK = 00000111B OVSEG_DS = 0x0 OVSEG_SS = 0x1 OVSEG_CS = 0x2 OVSEG_ES = 0x3 OVSEG_XY = 0x4 section '.data' data readable writeable TwoByteMap_Data: dd 0x0, 0x000F0033, 0x0, 0x00005FFF, 0x00000A0C, 0x0 dd 00000000000000000000000000000000B dd 00000000000000000000000000000011B dd 11111000111111111011100000111000B dd 11111111111111110000000000000000B dd 0x0 dd 00000000000000001111111111111111B dd 0x0 dd 10000000000000000010000000001100B OneByteMap_Data: dd 11110000111100001111000011110000B ; Opcode 0x00 - 0x1F dd 11110000111100001111000011110000B section '.text' code readable executable entry start start: sub_0: push ebp ; Пролог mov ebp, esp mov edx, [ebp+0x8] ; EDX = IP movzx eax, byte [edx] ; EAX = Opcode mov ecx, eax cmp al, 0x0F ; Проверка: двухбайтовый опкод (0x0F)? je loc_DA ; Jcc/ModR/M опкоды shr eax, 0x5 ; Подготовка индекса для битового теста and cl, 0x1F ; Подготовка бита bt [OneByteMap_Data+eax*4], ecx ; Проверка опкодов 0x00-0x1F jb ModRM_CHECK ; Если бит установлен, требуется ModR/M анализ ; --- Анализ диапазонов (RANGE_CHECK) --- mov al, [edx] sub al, 0x6C ; Opcode > 0x6B jb loc_130_DS ; Jmp (0x00-0x6B) -> DS (Default) sub al, 0x2 ; Opcode 0x6C, 0x6D (INS/OUTS) jbe SegSs_RET ; JBE -> SS sub al, 0x2 ; Opcode 0x70 - 0x7F (Короткие Jcc) jbe loc_138_CS ; JBE -> CS sub al, 0x1F ; Opcode 0x80 - 0x86 (Grp 1/2/3) jb loc_130_DS ; JB -> DS jne loc_77 ; JNE Opcode 0x87 (XCHG mem/reg) test byte [edx+0x1], 0x38 ; Проверка Opcode 0x87: REG-поле ModR/M jne loc_130_DS ; JNE -> DS jmp ModRM_CHECK ; JMP -> ModR/M анализ loc_77: sub al, 0x11 ; Opcode 0xA0 - 0xA3 (MOV AL/AX, mem) jb loc_130_DS ; JB -> DS sub al, 0x3 ; Opcode 0xA4, 0xA5 (MOVS) jbe loc_138_CS ; JBE -> CS (или ES, но CS для кода) sub al, 0x4 ; Opcode 0xA6, 0xA7 (CMPS, SCAS) jbe loc_140_XY ; JBE -> XY (ES/DS для строковых) sub al, 0x2 ; Opcode 0xA8, 0xA9 (TEST, MOV AL, imm) jbe loc_130_DS ; JBE -> DS sub al, 0x2 ; Opcode 0xAA, 0xAB (STOS) jbe SegSs_RET ; JBE -> SS (или ES, но SS для стека) sub al, 0x2 ; Opcode 0xAC, 0xAD (LODS) jbe loc_138_CS ; JBE -> CS sub al, 0x2 ; Opcode 0xAE, 0xAF (SCAS, CMPS) jbe SegSs_RET ; JBE -> SS sub al, 0x17 ; Opcode 0xC0 - 0xDF (CALL/RET, LOOP, Grp 4/5) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xE0-0xE3 (LOOP) jbe loc_130_DS ; JBE -> DS sub al, 0x0F ; Opcode 0xF0 - 0xF7 (LOCK/REP, Grp 3) jz loc_138_CS ; JZ -> CS (LOCK/REP) jb loc_130_DS ; JB -> DS sub al, 0x1F ; Opcode 0xF8 - 0xFA (CLC, STI) jb loc_130_DS ; JB -> DS sub al, 0x2 ; Opcode 0xFB - 0xFF (HLT, Grp 5/6) ja ModRM_CHECK ; JA -> ModR/M анализ mov al, [edx+0x1] ; Анализ Grp 3 (TEST/NOT/NEG/MUL/DIV) and al, 0x38 cmp al, 0x8 ; Если REG-поле ModR/M == 1 (PUSH/POP mem) jne ModRM_CHECK ; JNE -> ModR/M анализ jmp loc_130_DS ; PUSH/POP mem -> DS ; --- Двухбайтовые опкоды (loc_DA) --- loc_DA: movzx eax, byte [edx+0x1] ; Второй байт опкода (0x0F XX) mov ecx, eax inc edx shr eax, 0x5 and cl, 0x1F bt [TwoByteMap_Data+eax*4], ecx ; Битовый тест mov al, [edx] or al, al jne loc_101 mov al, [edx+0x1] and al, 0x38 cmp al, 0x30 jb loc_130_DS jmp loc_130_DS loc_FF: jmp SegSs_RET loc_101: dec al jne loc_110 mov al, [edx+0x1] and al, 0x38 cmp al, 0x28 jz loc_130_DS jmp ModRM_CHECK loc_110: sub al, 0xAD jz loc_138_CS sub al, 0x0C jne loc_123 mov al, [edx+0x1] and al, 0x38 cmp al, 0x20 jb loc_130_DS jmp ModRM_CHECK loc_123: sub al, 0x0D jne loc_130_DS mov al, [edx+0x1] and al, 0x38 cmp al, 0x8 jz ModRM_CHECK ; --- Анализ ModR/M (ModRM_CHECK) --- ModRM_CHECK: mov al,byte ptr [edx + 1] ; Загрузка ModR/M mov ah,byte ptr [edx + 1] mov cl, al and cl, MODRM_MOD_MASK ; MOD (биты 7-6) rol cl, 2 cmp cl, 11B ; Проверка MOD = 11B (регистр) je loc_130_DS ; Если регистр, DS and ah, MODRM_RM_MASK ; R/M (биты 2-0) cmp ah, 0x4 ; R/M = 4 (ESP/SIB)? je SegSs_RET ; JE -> SS (Стек) cmp ah, 0x5 ; R/M = 5 (EBP/Disp32)? jne loc_130_DS ; JNE -> DS (другие регистры) jmp SegSs_RET ; R/M=EBP всегда SS (исправленная логика) ; --- Блоки установки сегмента (Финал) --- loc_130_DS: mov al, OVSEG_DS ; Return DS (0) jmp Exit_Common SegSs_RET: mov al, OVSEG_SS ; Return SS (1) jmp Exit_Common loc_138_CS: mov al, OVSEG_CS ; Return CS (2) jmp Exit_Common loc_13C_ES: mov al, OVSEG_ES ; Return ES (3) jmp Exit_Common loc_140_XY: mov al, OVSEG_XY ; Return XY (4) jmp Exit_Common Exit_Common: movzx eax, al leave ; Эпилог ret 0x8 sub_0 ENDP - выхлоп, вроде правильно вставилось(с мобилы)). --- Сообщение объединено, 23 ноя 2025 --- Собирать не хочет: Если сделать все ветвления длинными, тогда собирает:
Код (Text): 007EDF2A bswap esi 007EDF2C btc eax,9E 007EDF30 ror esi,1 007EDF32 xor esi,6B3E5C22 007EDF38 add esi,edx 007EDF3A sal cx,cl 007EDF3D mov ebp,esp 007EDF3F cmp esi,3F1237C1 007EDF45 sub esp,0C0 007EDF4B movsx eax,di 007EDF4E sar di,2B Мощная вещь для деобфускации --- Сообщение объединено, 23 ноя 2025 --- Морфит: Код (Text): MmAlloc proc S1ze:ULONG mov eax, pStore ; EAX = текущий указатель (возвращаемое значение) mov ecx, S1ze ; ECX = размер add pStore, ecx ; pStore += S1ze ret MmAlloc endp Код (Text): MmAlloc proc S1ze:ULONG ; --- [ 1. push eax ] --- sub esp, 4 ; PUSH EAX (1/2) mov dword ptr [esp], eax ; PUSH EAX (2/2) ; --- [ 2. push edx ] --- sub esp, 4 ; PUSH EDX (1/2) mov dword ptr [esp], edx ; PUSH EDX (2/2) ; --- [ 3. xor esi, esi ] --- mov esi, 0 ; XORS ESI, ESI ; --- [ 4. test ebp, ebp ] --- cmp ebp, 0 ; TEST EBP, EBP (Заменяем на CMP с нулем) ; --- [ 5. cmovnz ebp, esi ] --- ; EBP = ESI (0), если ZF=0. jnz EBP_Update_NZ ; Условный переход jmp EBP_Update_End ; Если ZF=1, пропускаем EBP_Update_NZ: mov ebp, esi ; CMOVNZ EBP, ESI (если ZF не установлен) EBP_Update_End: ; --- [ 6. mov edx, dword ptr [pStore] ] --- mov esi, 0FFFFFFFFh ; Устанавливаем ESI = -1 not esi ; ESI = 0 mov esi, dword ptr [pStore] ; ESI = pStore (используем ESI как temp) mov edx, esi ; MOV EDX, [pStore] ; --- [ 7. mov eax, edx ] --- xor eax, eax ; MOV EAX, EDX (1/2) xor eax, edx ; MOV EAX, EDX (2/2) ; --- [ 8. not ecx ] --- add ecx, 0FFFFFFFFh ; NOT ECX (эквивалентно ADD ECX, -1) ; --- [ 9. inc ecx ] --- add ecx, 1 ; INC ECX ; --- [ 10. cmp ecx, 100h ] --- sub ecx, 100h ; CMP ECX, 100h (Эквивалентно SUB, но не меняет ECX) add ecx, 100h ; Восстанавливаем ECX (SUB/ADD для CMP) ; --- [ 11. sub edx, ecx ] --- neg ecx ; NEG ECX (восстанавливаем S1ze) add edx, ecx ; SUB EDX, ECX (эквивалентно ADD EDX, S1ze) neg ecx ; NEG ECX (снова инвертируем для соответствия S1ze) ; --- [ 12. push edx ] --- sub esp, 4 ; PUSH EDX (1/2) mov dword ptr [esp], edx ; PUSH EDX (2/2) ; --- [ 13. jl Label_Junk ] --- jb Label_Junk ; JL (Jump Less) на самом деле JB (Jump Below) при беззнаковом сравнении. ; --- [ 14. jmp Label_End ] --- call Label_End ; JMP Label_End (Эквивалентно CALL, за которым следует RET, но здесь RET не будет) ret ; RET для сбалансирования CALL (Мусорная RET) Label_Junk: ; --- [ 15. pop ebx ] --- mov ebx, dword ptr [esp] ; POP EBX (1/2) add esp, 4 ; POP EBX (2/2) ; --- [ 16. push ebx ] --- sub esp, 4 ; PUSH EBX (1/2) mov dword ptr [esp], ebx ; PUSH EBX (2/2) ; --- [ 17. xor ebx, 0FFFFFFFFh ] --- mov esi, 0FFFFFFFFh ; ESI = -1 xor ebx, esi ; XOR EBX, -1 (эквивалент NOT EBX) ; --- [ 18. add ebx, 1 ] --- sub ebx, 0FFFFFFFFh ; ADD EBX, 1 (эквивалентно SUB EBX, -1) Label_End: ; --- [ 19. pop ebx ] --- mov ebx, dword ptr [esp] ; POP EBX (1/2) add esp, 4 ; POP EBX (2/2) ; --- [ 20. mov dword ptr [pStore], ebx ] --- ; Замена MOV на PUSH/POP через ESI push ebx ; PUSH EBX pop dword ptr [pStore] ; POP [pStore] (MOV [pStore], EBX) ; --- [ 21. pop edx ] --- mov edx, dword ptr [esp] ; POP EDX (1/2) add esp, 4 ; POP EDX (2/2) ; --- [ 22. pop eax ] --- mov eax, dword ptr [esp] ; POP EAX (1/2) add esp, 4 ; POP EAX (2/2) ; --- [ 23. ret ] --- jmp [esp] ; RET (замена на JMP на адрес возврата) MmAlloc endp ВМ тоже собрало, просто мечта виксов.) --- Сообщение объединено, 23 ноя 2025 --- Девирт своей же вм:
Врет про sdm, даже дополнила Ядро кидает #DF из за невалид стека при попытке #DB, бот не нашел решения кроме как переписать маны.
Утверждает что прерывание может возникнуть на середине инструкции: - из задачи потери точности системным профайлером(выравнивание rip). Про проскальзывание" гугл ничего не знает. Генератор чепухи похоже
Речевая модель взвешивает вероятность появления очередного слова в предложении на основании контекста. Нерешаемая проблема этого барахла в том, что оно всегда сочиняет ответ, тупо от балды, потому что так устроено.
Нужно сделать размеченные данные, где для каждого вопроса указано, должна ли модель отвечать, или сказать 'я не знаю'.
Вроде раз что то внятное выдала: Это по профайлеру проблема. Как такое решить из за выравнивания не понятно, система нелинейных уравнений наверно Когда профайлер семплит, он выравнивает Ip на размер счетчика(4). Можно создать 4 профиля с разными буферами(счетчиками) или с общим.
Дизасмит оно норм, но по архитектуре ничего нельзя обсудить. Выдает чепуху, что то постоянно придумывает. Свой выхлоп анализит, мысли вслух
С ассемблером Иван Иваныч (ИИ), можно сказать, что - совсем не дружит. Я думаю, процентов на 90, а то может и больше - выдаёт всякую хрень. Я у Ивана спрашивал: какой он ассемблер лучше знает? Ответил, что - NASM. Но наверняка, если потестировать - он и в NASM, скорее всего, много бреда будет выдавать. Это, наверное, связано с тем, что по ассемблеру мало информации, да и спрос на него небольшой. Кого в наше время ассемблер интересует? Кроме Инди да еще нескольких человек - никого. Пытался по RADARE2 Ивана потестировать - тоже в большинстве своём - выдаёт много ошибочной и недостоверной информации. А вот Питон - другое дело. Тут Иван Иваныч - король.
Реверсит годно, уже много потестил. Вот например даем дамп: Код (Text): это такой же дамп ? ; (PRTL_SRWLOCK) ; SRW_INITIALIZE equ 0 SRW_ACQUIRE_SHARED equ 1 SRW_RELEASE_SHARED equ 2 SRW_ACQUIRE_EXCLUSIVE equ 3 SRW_RELEASE_EXCLUSIVE equ 4 SIG_ppZwWaitForKeyedEvent equ 12345678H SIG_ppZwReleaseKeyedEvent equ 87654321H SRWE: DB 085H, 0C0H, 00FH, 084H, 099H, 003H, 000H, 000H, 048H, 00FH DB 084H, 057H, 002H, 000H, 000H, 048H, 00FH, 084H, 097H, 000H DB 000H, 000H, 048H, 00FH, 084H, 00DH, 001H, 000H, 000H, 048H DB 074H, 001H, 0C3H, 08BH, 0FFH, 055H, 08BH, 0ECH, 08BH, 045H DB 008H, 083H, 0C9H, 0FFH, 0F0H, 00FH, 0C1H, 008H, 0F6H, 0C1H DB 001H, 074H, 032H, 0F6H, 0C1H, 002H, 075H, 004H, 05DH, 0C2H DB 004H, 000H, 0F6H, 0C1H, 004H, 075H, 0F7H, 049H, 08DH, 041H DB 004H, 056H, 057H, 08BH, 07DH, 008H, 08BH, 0D0H, 08BH, 0F0H DB 08BH, 0C1H, 0F0H, 00FH, 0B1H, 037H, 03BH, 0C1H, 05FH, 05EH DB 075H, 0DEH, 052H, 0FFH, 075H, 008H, 0E8H, 0F2H, 003H, 000H DB 000H, 0EBH, 0D3H, 0CCH, 08BH, 0C1H, 083H, 0E0H, 0F0H, 0EBH DB 002H, 08BH, 000H, 083H, 078H, 004H, 000H, 074H, 0F8H, 08BH DB 040H, 004H, 083H, 0C0H, 00CH, 083H, 0CAH, 0FFH, 0F0H, 00FH DB 0C1H, 010H, 04AH, 085H, 0D2H, 07EH, 054H, 0EBH, 01FH, 08BH DB 0C1H, 083H, 0E0H, 0F0H, 083H, 0F8H, 010H, 00FH, 086H, 08AH DB 000H, 000H, 000H, 08DH, 041H, 0F0H, 08BH, 0D0H, 08BH, 0FEH DB 08BH, 0C1H, 0F0H, 00FH, 0B1H, 017H, 03BH, 0C1H, 075H, 06DH DB 05FH, 0EBH, 01BH, 08BH, 0FFH, 055H, 08BH, 0ECH, 056H, 08BH DB 075H, 008H, 06AH, 011H, 033H, 0C9H, 08BH, 0D6H, 058H, 0F0H DB 00FH, 0B1H, 00AH, 08BH, 0C8H, 083H, 0F9H, 011H, 075H, 005H DB 05EH, 05DH, 0C2H, 004H, 000H, 0F6H, 0C1H, 001H, 074H, 095H DB 0F6H, 0C1H, 002H, 057H, 074H, 0B3H, 0F6H, 0C1H, 008H, 075H DB 08BH, 053H, 08BH, 0C1H, 083H, 0E0H, 0F6H, 0F6H, 0C1H, 004H DB 075H, 01DH, 083H, 0C8H, 004H, 08BH, 0D0H, 08BH, 0F8H, 08BH DB 0DEH, 08BH, 0C1H, 0F0H, 00FH, 0B1H, 03BH, 03BH, 0C1H, 075H DB 018H, 052H, 056H, 0E8H, 055H, 003H, 000H, 000H, 05BH, 0EBH DB 0A5H, 08BH, 0D0H, 08BH, 0FEH, 08BH, 0C1H, 0F0H, 00FH, 0B1H DB 017H, 03BH, 0C1H, 074H, 0EFH, 08BH, 0C8H, 0EBH, 0C7H, 0A8H DB 002H, 08BH, 0C8H, 00FH, 084H, 06AH, 0FFH, 0FFH, 0FFH, 0EBH DB 0B5H, 033H, 0C0H, 0E9H, 072H, 0FFH, 0FFH, 0FFH, 08BH, 0FFH DB 053H, 08BH, 0DCH, 051H, 051H, 083H, 0E4H, 0F0H, 083H, 0C4H DB 004H, 055H, 08BH, 06BH, 004H, 089H, 06CH, 024H, 004H, 08BH DB 0ECH, 083H, 0ECH, 038H, 056H, 057H, 08BH, 07BH, 008H, 033H DB 0F6H, 089H, 075H, 0F8H, 08BH, 0C7H, 0F0H, 00FH, 0BAH, 028H DB 000H, 072H, 00BH, 05FH, 05EH, 08BH, 0E5H, 05DH, 08BH, 0E3H DB 05BH, 0C2H, 004H, 000H, 08BH, 00FH, 0EBH, 004H, 08BH, 0CEH DB 033H, 0F6H, 0F6H, 0C1H, 001H, 00FH, 084H, 0D0H, 000H, 000H DB 000H, 0F6H, 0C1H, 002H, 06AH, 003H, 05AH, 089H, 055H, 0E0H DB 089H, 075H, 0D8H, 0C6H, 045H, 0FFH, 000H, 00FH, 085H, 08DH DB 000H, 000H, 000H, 08DH, 045H, 0D0H, 089H, 045H, 0D4H, 08BH DB 0C1H, 0C1H, 0E8H, 004H, 089H, 045H, 0DCH, 083H, 0F8H, 001H DB 08DH, 045H, 0D0H, 077H, 072H, 089H, 075H, 0DCH, 00BH, 0C2H DB 08BH, 0D0H, 08BH, 0F0H, 08BH, 0C1H, 0F0H, 00FH, 0B1H, 037H DB 08BH, 0F0H, 03BH, 0F1H, 074H, 010H, 08DH, 045H, 0F8H, 050H DB 0E8H, 0F3H, 001H, 000H, 000H, 08BH, 07BH, 008H, 08BH, 037H DB 0EBH, 0A2H, 080H, 07DH, 0FFH, 000H, 08BH, 07BH, 008H, 075H DB 03BH, 0B8H, 000H, 004H, 000H, 000H, 085H, 0C0H, 077H, 002H DB 0EBH, 00DH, 08BH, 04DH, 0E0H, 0F6H, 0C1H, 002H, 074H, 005H DB 0F3H, 090H, 048H, 075H, 0F3H, 08DH, 045H, 0E0H, 0F0H, 00FH DB 0BAH, 030H, 001H, 00FH, 083H, 073H, 0FFH, 0FFH, 0FFH, 06AH DB 000H, 06AH, 000H, 08DH, 045H, 0D0H, 050H, 06AH, 000H, 0FFH DB 015H, 078H, 056H, 034H, 012H, 0E9H, 05EH, 0FFH, 0FFH, 0FFH DB 052H, 057H, 0E8H, 0F2H, 001H, 000H, 000H, 0EBH, 0BCH, 083H DB 0C8H, 00BH, 0EBH, 08EH, 08BH, 0C1H, 083H, 0E0H, 0F0H, 089H DB 045H, 0D0H, 08BH, 0C1H, 083H, 0E0H, 008H, 08DH, 055H, 0D0H DB 00BH, 0C2H, 083H, 0C8H, 007H, 0F6H, 0C1H, 004H, 089H, 075H DB 0D4H, 089H, 075H, 0DCH, 00FH, 085H, 06AH, 0FFH, 0FFH, 0FFH DB 0C6H, 045H, 0FFH, 001H, 0E9H, 061H, 0FFH, 0FFH, 0FFH, 08DH DB 041H, 001H, 08BH, 0D0H, 08BH, 0F7H, 08BH, 0C1H, 0F0H, 00FH DB 0B1H, 016H, 03BH, 0C1H, 00FH, 084H, 0FFH, 0FEH, 0FFH, 0FFH DB 08DH, 045H, 0F8H, 050H, 0E8H, 04FH, 001H, 000H, 000H, 0E9H DB 05AH, 0FFH, 0FFH, 0FFH, 08BH, 0FFH, 053H, 08BH, 0DCH, 051H DB 051H, 083H, 0E4H, 0F0H, 083H, 0C4H, 004H, 055H, 08BH, 06BH DB 004H, 089H, 06CH, 024H, 004H, 08BH, 0ECH, 083H, 0ECH, 038H DB 083H, 065H, 0F8H, 000H, 08BH, 053H, 008H, 056H, 057H, 06AH DB 011H, 059H, 033H, 0C0H, 0F0H, 00FH, 0B1H, 00AH, 08BH, 0C8H DB 085H, 0C9H, 075H, 028H, 05FH, 05EH, 08BH, 0E5H, 05DH, 08BH DB 0E3H, 05BH, 0C2H, 004H, 000H, 08BH, 04DH, 0E0H, 0F6H, 0C1H DB 002H, 074H, 005H, 0F3H, 090H, 048H, 075H, 0F3H, 08DH, 045H DB 0E0H, 0F0H, 00FH, 0BAH, 030H, 001H, 00FH, 082H, 0CEH, 000H DB 000H, 000H, 08BH, 0CEH, 0F6H, 0C1H, 001H, 074H, 011H, 08BH DB 0F1H, 0D1H, 0EEH, 083H, 0E6H, 001H, 075H, 036H, 0F7H, 0C1H DB 0F0H, 0FFH, 0FFH, 0FFH, 076H, 02EH, 0F6H, 0C1H, 002H, 075H DB 024H, 08DH, 041H, 010H, 083H, 0C8H, 001H, 08BH, 073H, 008H DB 08BH, 0D0H, 08BH, 0FEH, 08BH, 0C1H, 0F0H, 00FH, 0B1H, 017H DB 03BH, 0C1H, 074H, 0A6H, 08DH, 045H, 0F8H, 050H, 0E8H, 0B5H DB 000H, 000H, 000H, 08BH, 036H, 0EBH, 0BFH, 08DH, 041H, 001H DB 0EBH, 0DDH, 033H, 0C0H, 03BH, 0F0H, 0C7H, 045H, 0E0H, 002H DB 000H, 000H, 000H, 089H, 045H, 0DCH, 088H, 045H, 0FFH, 089H DB 045H, 0D8H, 075H, 04FH, 08DH, 045H, 0D0H, 089H, 045H, 0D4H DB 083H, 0C8H, 003H, 08BH, 07BH, 008H, 08BH, 0D0H, 08BH, 0F0H DB 08BH, 0C1H, 0F0H, 00FH, 0B1H, 037H, 08BH, 0F0H, 03BH, 0F1H DB 075H, 021H, 080H, 07DH, 0FFH, 000H, 075H, 012H, 0B8H, 000H DB 004H, 000H, 000H, 085H, 0C0H, 00FH, 087H, 05AH, 0FFH, 0FFH DB 0FFH, 0E9H, 062H, 0FFH, 0FFH, 0FFH, 052H, 057H, 0E8H, 0ACH DB 000H, 000H, 000H, 0EBH, 0E5H, 08DH, 045H, 0F8H, 050H, 0E8H DB 050H, 000H, 000H, 000H, 08BH, 0C7H, 08BH, 030H, 0E9H, 055H DB 0FFH, 0FFH, 0FFH, 089H, 045H, 0D4H, 08BH, 0C1H, 083H, 0E0H DB 0F0H, 089H, 045H, 0D0H, 08BH, 0C1H, 083H, 0E0H, 009H, 08DH DB 055H, 0D0H, 00BH, 0C2H, 083H, 0C8H, 006H, 0F6H, 0C1H, 004H DB 075H, 09DH, 0C6H, 045H, 0FFH, 001H, 0EBH, 097H, 06AH, 000H DB 06AH, 000H, 08DH, 045H, 0D0H, 050H, 06AH, 000H, 0FFH, 015H DB 078H, 056H, 034H, 012H, 0E9H, 01DH, 0FFH, 0FFH, 0FFH, 08BH DB 0FFH, 055H, 08BH, 0ECH, 08BH, 045H, 008H, 083H, 020H, 000H DB 05DH, 0C2H, 004H, 000H, 08BH, 0FFH, 055H, 08BH, 0ECH, 08BH DB 045H, 008H, 08BH, 008H, 085H, 0C9H, 075H, 037H, 064H, 08BH DB 00DH, 018H, 000H, 000H, 000H, 08BH, 049H, 030H, 083H, 079H DB 064H, 001H, 074H, 023H, 06AH, 040H, 059H, 089H, 008H, 00FH DB 031H, 08DH, 051H, 0FFH, 023H, 0C2H, 003H, 0C8H, 0C7H, 045H DB 008H, 000H, 000H, 000H, 000H, 08BH, 045H, 008H, 03BH, 0C1H DB 073H, 007H, 0F3H, 090H, 0FFH, 045H, 008H, 0EBH, 0F2H, 05DH DB 0C2H, 004H, 000H, 081H, 0F9H, 0FFH, 01FH, 000H, 000H, 073H DB 0D4H, 003H, 0C9H, 0EBH, 0D0H, 08BH, 0FFH, 055H, 08BH, 0ECH DB 08BH, 04DH, 00CH, 0F6H, 0C1H, 001H, 056H, 074H, 03DH, 08BH DB 0C1H, 083H, 0E0H, 0F0H, 08BH, 0F0H, 074H, 015H, 083H, 078H DB 004H, 000H, 075H, 009H, 08BH, 0D0H, 08BH, 000H, 089H, 050H DB 008H, 0EBH, 0F1H, 08BH, 040H, 004H, 089H, 046H, 004H, 08BH DB 075H, 008H, 08DH, 041H, 0FCH, 08BH, 0D0H, 08BH, 0C1H, 0F0H DB 00FH, 0B1H, 016H, 03BH, 0C1H, 075H, 005H, 05EH, 05DH, 0C2H DB 008H, 000H, 0A8H, 001H, 08BH, 0C8H, 074H, 002H, 0EBH, 0C3H DB 051H, 0FFH, 075H, 008H, 0E8H, 002H, 000H, 000H, 000H, 0EBH DB 0E8H, 08BH, 0FFH, 055H, 08BH, 0ECH, 08BH, 055H, 00CH, 053H DB 056H, 057H, 0F6H, 0C2H, 001H, 00FH, 085H, 08AH, 000H, 000H DB 000H, 08BH, 0C2H, 083H, 0E0H, 0F0H, 08DH, 048H, 004H, 08BH DB 031H, 085H, 0F6H, 08BH, 0F8H, 074H, 064H, 08BH, 046H, 008H DB 085H, 0C0H, 089H, 075H, 00CH, 075H, 040H, 08BH, 05DH, 008H DB 033H, 0FFH, 08BH, 0C2H, 0F0H, 00FH, 0B1H, 03BH, 03BH, 0C2H DB 075H, 02BH, 08BH, 045H, 00CH, 08BH, 076H, 008H, 08DH, 048H DB 010H, 0F0H, 00FH, 0BAH, 031H, 001H, 072H, 00DH, 06AH, 000H DB 06AH, 000H, 050H, 06AH, 000H, 0FFH, 015H, 021H, 043H, 065H DB 087H, 085H, 0F6H, 089H, 075H, 00CH, 075H, 0DCH, 05FH, 05EH DB 05BH, 05DH, 0C2H, 008H, 000H, 089H, 031H, 08BH, 0D0H, 0EBH DB 09DH, 08BH, 05EH, 010H, 0F6H, 0C3H, 001H, 074H, 0B8H, 083H DB 066H, 008H, 000H, 08BH, 04DH, 008H, 06AH, 0FBH, 089H, 047H DB 004H, 058H, 0F0H, 021H, 001H, 0EBH, 0B5H, 08BH, 0F0H, 08BH DB 000H, 089H, 070H, 008H, 08BH, 070H, 004H, 085H, 0F6H, 074H DB 0F2H, 03BH, 0F8H, 074H, 08AH, 089H, 031H, 0EBH, 086H, 08BH DB 075H, 008H, 08DH, 042H, 0FCH, 08BH, 0C8H, 08BH, 0C2H, 0F0H DB 00FH, 0B1H, 00EH, 03BH, 0C2H, 074H, 0B1H, 0A8H, 001H, 08BH DB 0D0H, 00FH, 084H, 05AH, 0FFH, 0FFH, 0FFH, 0EBH, 0E2H Код (Text): SRWE: ; DB 085H, 0C0H, 00FH, 084H, 099H, 003H, 000H, 000H test eax, eax ; (Проверка OpCode EAX) jz loc_409 ; JZ если EAX == 0 (SRW_INITIALIZE) ; DB 048H, 00FH, 084H, 057H, 002H, 000H, 000H loc_00A: cmp eax, 1 je loc_26B ; JE если EAX == 1 (SRW_ACQUIRE_SHARED) ; DB 048H, 00FH, 084H, 097H, 000H, 000H, 000H loc_011: cmp eax, 2 je loc_0B6 ; JE если EAX == 2 (SRW_RELEASE_SHARED) ; DB 048H, 00FH, 084H, 00DH, 001H, 000H, 000H loc_018: cmp eax, 3 je loc_12B ; JE если EAX == 3 (SRW_ACQUIRE_EXCLUSIVE) ; DB 048H, 074H, 001H, 0C3H loc_01F: cmp eax, 4 je loc_024 ; JE если EAX == 4 (SRW_RELEASE_EXCLUSIVE) ret ; Если OpCode > 4 loc_024: ; ... (Продолжение SRW_RELEASE_EXCLUSIVE Код (Text): ; ================================================================= ; КОНСТАНТЫ И ВНЕШНИЕ СИМВОЛЫ ; ================================================================= EXTERN ZwWaitForKeyedEvent:PROC EXTERN ZwReleaseKeyedEvent:PROC ; OpCodes для диспетчера SRW_INITIALIZE EQU 0 SRW_ACQUIRE_SHARED EQU 1 SRW_RELEASE_SHARED EQU 2 SRW_ACQUIRE_EXCLUSIVE EQU 3 SRW_RELEASE_EXCLUSIVE EQU 4 ; ================================================================= ; ДИСПЕТЧЕР КОМАНД (SRWE) ; ================================================================= ; Вход: EAX = OpCode, [ESP+4] = SRWLOCK* SRWE: TEST EAX, EAX JZ loc_405 ; EAX == 0: SRW_INITIALIZE CMP EAX, 1 JE loc_264 ; EAX == 1: SRW_ACQUIRE_SHARED CMP EAX, 2 JE loc_0B6 ; EAX == 2: SRW_RELEASE_SHARED CMP EAX, 3 JE loc_12B ; EAX == 3: SRW_ACQUIRE_EXCLUSIVE CMP EAX, 4 JE loc_024 ; EAX == 4: SRW_RELEASE_EXCLUSIVE RET ; ================================================================= ; SRW_RELEASE_EXCLUSIVE (OpCode 4) ; ================================================================= loc_024: PUSH EBP MOV EBP, ESP MOV EAX, [EBP+8] ; EAX = SRWLOCK* OR ECX, 0FFFFFFFFh ; ECX = -1 LOCK XADD [EAX], ECX ; Атомарный декремент. ECX = старое значение TEST CL, 1 ; Проверка Writer Bit (0x1) JZ loc_06A loc_03D: ; **Быстрый выход** POP EBP RET 4 loc_041: TEST CL, 4 ; Проверка Exclusive Waiter Bit (0x4) JNZ loc_03D ; Если нет Exclusive Waiter, выход DEC ECX ; (Ошибка дизассемблера? Должно быть LEA) LEA EAX, [ECX+4] ; EAX = Новое значение (сброс 0x1) PUSH ESI PUSH EDI MOV EDI, [EBP+8] ; EDI = SRWLOCK* MOV EDX, EAX MOV ESI, EAX MOV EAX, ECX ; EAX = Старое значение LOCK CMPXCHG [EDI], ESI ; Атомарная установка CMP EAX, ECX POP EDI POP ESI JNZ loc_03D ; Если Lock изменился, выход PUSH EDX ; Key PUSH DWORD [EBP+8] ; SRWLOCK* CALL ZwReleaseKeyedEvent ; Пробуждение ожидающих потоков JMP loc_03D ...
Ну, вообще, любопытно. Это же вы ИИ фактически машинный код для анализа/реверсинга предлагаете. А вы какой ИИ для таких задач предпочитаете? Клод, чатЖПТ, Джеминай, Копилот... ? Какой? Вы зарегестрированы в ИИ? Ещё интересно как дела обстоят в платных версиях? Так же или чуть получше, чем в бесплатных? Интересно, кто-нибудь пробовал работать в платном ИИ?
Это бесплатная быстрая версия. Которая долго думает меньше чепухи выдает, но все дело как я понял в описании не понятной системы, если все нюансы описать, тогда выхлоп внятный. Другие не смотрел. Был сложный семпл, на удивление он понял его суть, там не всякий человек поймет, посмотрим.
Самое интересное, что ИИ - это как обезьяна с гранатой. Никогда не знаешь, что она выдаст и куда кинет эту гранату. То на какой-нибудь сложной задаче - попадает точно в цель, то на каком-нибудь примитиве - бросает эту гранату в противоположном от цели направлении. Фаинд же писал в одном из своих комментариев, что ИИ угадывает/взвешивает и на основе этого порой выдумывает какой-то свой бред. Ну устроен он так внутри.
Возможно, и сильно, но вот ваш архивный файл почему-то не открывается, а это наводит на нехорошие подозрения, что вас приняли на работу тайным пиарщиком вашего ИИ.