阅读 stp(Designaknit Stitch Pattern)-文件 II

逆向工程 艾达 文件格式
2021-06-20 18:06:22

我知道这不是“阅读 stp(Designaknit Stitch Pattern)-Files”的答案,但我认为这是一种答案。
我相信我找到了正确的函数(使用 ida - 我称之为 testStp),但我不知道到底发生了什么。我不明白汇编代码。

我附上了函数的开头和第一个跳转点。
首先,变量被声明在某些位置(var_84D....)在哪里以及为什么???
然后 stp 文件打开。
什么使test esi esi???一个对比 ??空的文件 ???
如果 ?那么jnz short loc_4144FF
否则mov ebx, 0FFFFFFFDh|| jmp loc_414C93(函数的退出点???)

  • fopen = 打开文件
  • fseek = 设置文件位置
  • ftell = 读取当前位置
  • fread = 读取文件
  • fclose = 关闭文件

mov edi, offset AD7c; "D7c"- 3 个字节读入字符串 ???
(这意味着抵消... ??)
mov ecx, 3???
mov esi, [esp + 34h]????
repe CMPSB'比较(显然在“D7c”上 - 文件中的前 3 个字节)
如果 ? 那么jz short loc_41458A
否则mov ebx, 0FFFFFFFCh| jmp loc_414C93(函数的退出点???)

接下来我不知道。

我希望有人可以帮助我并告诉我各个语句的作用,并说明我是否找到了正确的功能。还有怎么sub_421CF0办???

阿尔弗雷德

这是子的开始和第一次跳转:

.text:004144A8                 align 10h  
.text:004144B0  
.text:004144B0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦  
.text:004144B0  
.text:004144B0  
.text:004144B0 ; int __cdecl TestSTP(int,int,int,char *,int,int)  
.text:004144B0 TestSTP         proc near               ; CODE XREF: Pattern2Sl4(x,x,x,x,x)+5A1 p  
.text:004144B0                                         ; CB_CurrentPattern(x,x,x,x)+47B p ...  
.text:004144B0  
.text:004144B0 var_84D         = byte ptr -84Dh  
.text:004144B0 var_84C         = dword ptr -84Ch  
.text:004144B0 var_848         = dword ptr -848h  
.text:004144B0 var_844         = dword ptr -844h  
.text:004144B0 var_840         = dword ptr -840h  
.text:004144B0 var_83C         = word ptr -83Ch  
.text:004144B0 var_838         = dword ptr -838h  
.text:004144B0 var_834         = dword ptr -834h  
.text:004144B0 var_830         = dword ptr -830h  
.text:004144B0 var_82C         = dword ptr -82Ch  
.text:004144B0 var_828         = dword ptr -828h  
.text:004144B0 var_824         = dword ptr -824h  
.text:004144B0 var_820         = word ptr -820h  
.text:004144B0 var_81C         = dword ptr -81Ch  
.text:004144B0 var_818         = dword ptr -818h  
.text:004144B0 var_814         = dword ptr -814h  
.text:004144B0 var_810         = dword ptr -810h  
.text:004144B0 var_80C         = dword ptr -80Ch  
.text:004144B0 var_808         = dword ptr -808h  
.text:004144B0 var_804         = dword ptr -804h  
.text:004144B0 var_800         = dword ptr -800h  
.text:004144B0 var_400         = dword ptr -400h  
.text:004144B0 arg_0           = dword ptr  4  
.text:004144B0 arg_4           = dword ptr  8  
.text:004144B0 arg_8           = dword ptr  0Ch  
.text:004144B0 arg_C           = dword ptr  10h  
.text:004144B0 arg_10          = dword ptr  14h  
.text:004144B0 arg_14          = dword ptr  18h  
.text:004144B0  
.text:004144B0                 sub     esp, 850h  
.text:004144B6                 mov     [esp+850h+var_818], 1  
.text:004144BE                 push    ebx  
.text:004144BF                 push    esi  
.text:004144C0                 push    edi  
.text:004144C1                 push    ebp  
.text:004144C2                 xor     edi, edi  
.text:004144C4                 mov     [esp+860h+var_82C], edi  
.text:004144C8                 mov     [esp+860h+var_80C], edi  
.text:004144CC                 cmp     [esp+860h+arg_10], edi  
.text:004144D3                 jnz     loc_41455C  
.text:004144D9                 mov     eax, [esp+860h+arg_C]  
.text:004144E0                 push    offset aRb      ; "rb"  
.text:004144E5                 push    eax             ; char *  
.text:004144E6                 call    ds:fopen  
.text:004144EC                 add     esp, 8  
.text:004144EF                 mov     esi, eax  
.text:004144F1                 test    esi, esi  
.text:004144F3                 jnz     short loc_4144FF  
.text:004144F5                 mov     ebx, 0FFFFFFFDh  
.text:004144FA                 jmp     loc_414C93  
.text:004144FF ; ------------------------------------------------  
.text:004144FF  
.text:004144FF loc_4144FF:          ; CODE XREF: TestSTP+43 j  
.text:004144FF                 push    2               ; int  
.text:00414501                 mov     edi, ds:fseek  
.text:00414507                 push    0               ; __int32  
.text:00414509                 push    esi             ; FILE *  
.text:0041450A                 call    edi ; fseek  
.text:0041450C                 add     esp, 0Ch  
.text:0041450F                 push    esi             ; FILE *  
.text:00414510                 call    ds:ftell  
.text:00414516                 add     esp, 4  
.text:00414519                 mov     ebp, eax  
.text:0041451B                 push    349h  
.text:00414520                 push    offset aURefKnittingCo ; "U:\\Ref\\Knitting\\Common\\STI.C"  
.text:00414525                 push    ebp  
.text:00414526                 push    0  
.text:00414528                 call    sub_421CF0  
.text:0041452D                 mov     [esp+870h+var_82C], eax  
.text:00414531                 add     esp, 10h  
.text:00414534                 push    0               ; int  
.text:00414536                 push    0               ; __int32  
.text:00414538                 push    esi             ; FILE *  
.text:00414539                 call    edi ; fseek  
.text:0041453B                 mov     eax, [esp+86Ch+var_82C]  
.text:0041453F                 add     esp, 0Ch  
.text:00414542                 push    esi             ; FILE *  
.text:00414543                 push    1               ; size_t  
.text:00414545                 push    ebp             ; size_t  
.text:00414546                 push    eax             ; void *  
.text:00414547                 call    ds:fread  
.text:0041454D                 add     esp, 10h  
.text:00414550                 push    esi             ; FILE *  
.text:00414551                 call    ds:fclose  
.text:00414557                 add     esp, 4  
.text:0041455A                 jmp     short loc_41456E  
.text:0041455C ; ------------------------------------------------  
.text:0041455C  
.text:0041455C loc_41455C:         ; CODE XREF: TestSTP+23 j  
.text:0041455C                 mov     eax, [esp+860h+arg_10]  
.text:00414563                 mov     ebp, [esp+860h+arg_14]  
.text:0041456A                 mov     [esp+860h+var_82C], eax  
.text:0041456E  
.text:0041456E loc_41456E:             ; CODE XREF: TestSTP+AA j  
.text:0041456E                 mov     edi, offset aD7c ; "D7c"  
.text:00414573                 mov     ecx, 3  
.text:00414578                 mov     esi, [esp+34h]  
.text:0041457C                 repe cmpsb  
.text:0041457E                 jz      short loc_41458A  
.text:00414580                 mov     ebx, 0FFFFFFFCh  
.text:00414585                 jmp     loc_414C93  
.text:0041458A ; ------------------------------------------------  
.text:0041458A  
.text:0041458A loc_41458A:             ; CODE XREF: TestSTP+CE j  
.text:0041458A                 mov     eax, [esp+860h+var_82C]  
.text:0041458E                 mov     ecx, [esp+860h+var_82C]  
.text:00414592                 mov     ax, [eax+5]  
.text:00414596                 mov     dx, [ecx+3]  
.text:0041459A         mov     word ptr [esp+860h+var_84C+2], ax  
.text:0041459F            mov     word ptr [esp+860h+var_84C], dx  
.text:004145A4                 cmp     ax, 46Ah  
.text:004145A8                 ja      loc_414C8E  
.text:004145AE                 cmp     dx, 320h  
.text:004145B3                 ja      loc_414C8E  
.text:004145B9                 mov     eax, [esp+860h+var_84C]  
.text:004145BD                 and     eax, 0FFFFh  
.text:004145C2                 mov     [esp+860h+var_840], eax  
.text:004145C6                 mov     eax, [esp+860h+var_84C+2]  
.text:004145CA                 and     eax, 0FFFFh  
.text:004145CF                 push    363h  
.text:004145D4                 mov     [esp+864h+var_814], eax  
.text:004145D8                 push    offset aURefKnittingCo ; "U:\\Ref\\Knitting\\Common\\STI.C"  
.text:004145DD                 mov     eax, [esp+868h+var_840]  
.text:004145E1                 imul    eax, [esp+868h+var_814]  
.text:004145E6                 mov     [esp+868h+var_810], eax  
.text:004145EA                 add     eax, 411h  
.text:004145EF                 mov     [esp+868h+var_824], eax  
.text:004145F3                 push    eax  
.text:004145F4                 push    0  
.text:004145F6                 call    sub_421CF0  
.text:004145FB                 mov     edx, [esp+870h+var_824]  
.text:004145FF                 mov     [esp+870h+var_830], eax  
.text:00414603                 add     esp, 10h  
.text:00414606                 mov     edi, eax  
.text:00414608                 xor     eax, eax  
.text:0041460A                 mov     ecx, edx  
.text:0041460C                 shr     ecx, 2  
.text:0041460F                 rep stosd  
.text:00414611                 mov     ecx, edx  
.text:00414613                 and     ecx, 3  
.text:00414616                 rep stosb  
.text:00414618          mov     dx, word ptr [esp+860h+var_84C+2]  
.text:0041461D                mov     ebx, dword ptr aSti ; "Sti"  
.text:00414623                 mov     eax, [esp+860h+var_830]  
.text:00414627                 mov     ecx, eax  
.text:00414629                 mov     [eax], ebx  
.text:0041462B                 mov     [eax+4], dx  
.text:0041462F                 mov     edx, [esp+860h+var_82C]  
.text:00414633            mov     ax, word ptr [esp+860h+var_84C]  
.text:00414638                 mov     [ecx+6], ax  
.text:0041463C                 mov     al, [edx+1Fh]  
.text:0041463F                 mov     ecx, [esp+860h+var_830]  
.text:00414643                 test    al, al  
.text:00414645                 jnz     short loc_414656  
.text:00414647                 mov     word ptr [ecx+8], 20h  
.text:0041464D                 add     ecx, 8  
.text:00414650                 mov     [esp+860h+var_828], ecx  
.text:00414654                 jmp     short loc_414668  
.text:00414656 ; ------------------------------------------------  
.text:00414656  
.text:00414656 loc_414656:             ; CODE XREF: TestSTP+195 j  
.text:00414656                 movsx   ax, al  
.text:0041465A                 add     ax, 100h  
.text:0041465E                 add     ecx, 8  
.text:00414661                 mov     [ecx], ax  
.text:00414664                 mov     [esp+860h+var_828], ecx  
.text:00414668  
.text:00414668 loc_414668:         ; CODE XREF: TestSTP+1A4 j  
.text:00414668                 mov     eax, [esp+860h+var_82C]  
.text:0041466C                 mov     al, [eax+2Ch]  
.text:0041466F         mov     byte ptr [esp+860h+var_820], al  
.text:00414673                 cmp     al, 0Eh  
.text:00414675                 jz      short loc_41467F  
.text:00414677                 cmp     al, 0Fh  
.text:00414679                 mov     [esp+860h+var_84D], al  
.text:0041467D                 jnz     short loc_414684  
.text:0041467F  
.text:0041467F loc_41467F:          ; CODE XREF: TestSTP+1C5 j  
.text:0041467F                 mov     [esp+860h+var_84D], 0  
.text:00414684  
.text:00414684 loc_414684:          ; CODE XREF: TestSTP+1CD j  
.text:00414684                 mov     ecx, [esp+860h+var_830]  
.text:00414688            mov     al, byte ptr [esp+860h+var_820]  
.text:0041468C                 mov     dl, [esp+860h+var_84D]  
.text:00414690                 add     ecx, 410h  
.text:00414696                 mov     ebx, [esp+860h+var_830]  
.text:0041469A                 mov     esi, [esp+860h+var_82C]  
.text:0041469E                 add     ebx, 10h  
.text:004146A1                 add     esi, 0F8h  
.text:004146A7                 mov     [esp+860h+var_848], ecx  
.text:004146AB                 push    offset WindowName  
.text:004146B0                 mov     byte ptr [ecx-406h], 0  
.text:004146B7                 mov     [ecx-405h], al  
.text:004146BD                 mov     [ecx-405h], dl  
.text:004146C3                 mov     ecx, [esp+864h+var_82C]  
.text:004146C7                 push    ecx  
.text:004146C8                 call    sub_41D5A0  
.text:004146CD                 mov     eax, [esp+868h+var_84C+2]  
.text:004146D1                 mov     [esp+868h+var_808], esi  
.text:004146D5                 add     esp, 8  
.text:004146D8                 push    eax  
.text:004146D9                 push    esi  
.text:004146DA                 call    sub_4141D0  
.text:004146DF                 add     esp, 8  
.text:004146E2                 add     esi, eax  
.text:004146E4                 mov     eax, [esp+860h+var_84C+2]  
.text:004146E8                 mov     [esp+860h+var_804], esi  
.text:004146EC                 push    eax  
.text:004146ED                 push    esi  
.text:004146EE                 call    sub_4141D0  
.text:004146F3                 add     esp, 8  
.text:004146F6                 add     esi, eax  
.text:004146F8                 mov     al, [esi+6EFh]  
.text:004146FE                 mov     [esp+860h+var_834], esi  
.text:00414702                 add     esi, 6EFh  
.text:00414708                 cmp     al, 20h  
.text:0041470A                 mov     [esp+860h+var_838], esi  
.text:0041470E                 jnz     short loc_414716  
.text:00414710                 cmp     byte ptr [esi+2], 2Eh  
.text:00414714                 jz      short loc_414720  
.text:00414716  
.text:00414716 loc_414716:             ; CODE XREF: TestSTP+25E j  
.text:00414716                 cmp     byte ptr [esi+2], 20h  
.text:0041471A                 jnz     short loc_414781  
.text:0041471C                 cmp     al, 2Eh  
.text:0041471E                 jnz     short loc_414781  
.text:00414720  
.text:00414720 loc_414720:          ; CODE XREF: TestSTP+264 j  
.text:00414720                 mov     [esp+860h+var_81C], 30h  
.text:00414728                 mov     edi, esi  
.text:0041472A  
.text:0041472A loc_41472A:             ; CODE XREF: TestSTP+2CF j  
.text:0041472A                 test    byte ptr [edi+1], 3  
.text:0041472E                 jz      short loc_414778  
.text:00414730                 xor     eax, eax  
.text:00414732                 mov     al, [edi]  
.text:00414734                 push    eax             ; int  
.text:00414735          push    offset a_gdejziki ; " .âäàåçêèë"  
.text:0041473A                 call    ds:__imp_strchr  
.text:00414740                 add     esp, 8  
.text:00414743                 test    eax, eax  
.text:00414745                 jz      short loc_414754  
.text:00414747      sub     eax, offset a_gdejziki ; " .âäàåçêèë"  
.text:0041474C                 mov     al, byte_42EB00[eax]  
.text:00414752                 mov     [edi], al  

-------------------------------------------------------------------------------------------------------------------------------  



.text:00421CE6                 align 10h  
.text:00421CF0  
.text:00421CF0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦  
.text:00421CF0  
.text:00421CF0  
.text:00421CF0 sub_421CF0      proc near ; CODE XREF: .text:00403D0C p  
.text:00421CF0                                         ; .text:00403E2C p ...  
.text:00421CF0  
.text:00421CF0 var_4           = dword ptr -4  
.text:00421CF0 arg_0           = dword ptr  4  
.text:00421CF0 arg_4           = dword ptr  8  
.text:00421CF0 arg_8           = dword ptr  0Ch  
.text:00421CF0 arg_C           = dword ptr  10h  
.text:00421CF0  
.text:00421CF0                 sub     esp, 4  
.text:00421CF3                 push    ebx  
.text:00421CF4                 push    esi  
.text:00421CF5                 mov     esi, [esp+0Ch+arg_4]  
.text:00421CF9                 push    edi  
.text:00421CFA                 push    ebp  
.text:00421CFB                 cmp     esi, 7FFFFFC0h  
.text:00421D01                 jbe     short loc_421D0D  
.text:00421D03                 xor     eax, eax  
.text:00421D05                 pop     ebp  
.text:00421D06                 pop     edi  
.text:00421D07                 pop     esi  
.text:00421D08                 pop     ebx  
.text:00421D09                 add     esp, 4  
.text:00421D0C                 retn  
.text:00421D0D ; ------------------------------------------------  
.text:00421D0D  
.text:00421D0D loc_421D0D:          ; CODE XREF: sub_421CF0+11 j  
.text:00421D0D                 mov     edi, [esp+14h+arg_0]  
.text:00421D11                 and     edi, 7FFFFFFFh  
.text:00421D17                 cmp     edi, 8  
.text:00421D1A                 jb      short loc_421D26  
.text:00421D1C                 xor     eax, eax  
.text:00421D1E                 pop     ebp  
.text:00421D1F                 pop     edi  
.text:00421D20                 pop     esi  
.text:00421D21                 pop     ebx  
.text:00421D22                 add     esp, 4  
.text:00421D25                 retn  
.text:00421D26 ; ------------------------------------------------  
.text:00421D26  
.text:00421D26 loc_421D26:           ; CODE XREF: sub_421CF0+2A j  
.text:00421D26                 mov     eax, edi  
.text:00421D28                 shl     eax, 5  
.text:00421D2B               lea     ebx, dword_429BC8[eax+eax*2]  
.text:00421D32                 cmp     dword ptr [ebx+10h], 0  
.text:00421D36                 jnz     short loc_421D51  
.text:00421D38                 push    7Fh  
.text:00421D3A                 push    10h  
.text:00421D3C                 push    0FDh  
.text:00421D41                 push    80000h  
.text:00421D46                 push    0  
.text:00421D48                 push    ebx  
.text:00421D49                 call    sub_421ED0  
.text:00421D4E                 add     esp, 18h  
.text:00421D51  
.text:00421D51 loc_421D51:           ; CODE XREF: sub_421CF0+46 j  
.text:00421D51                 cmp     [ebx+5Ch], esi  
.text:00421D54                 jnz     short loc_421D65  
.text:00421D56                 push    edi  
.text:00421D57                 push    esi  
.text:00421D58                 push    offset aSomeoneTriesTo ; "Someone tries to allocate %u bytes in p"...  
.text:00421D5D                 call    sub_420DB0  
.text:00421D62                 add     esp, 0Ch  
.text:00421D65  
.text:00421D65 loc_421D65:           ; CODE XREF: sub_421CF0+64 j  
.text:00421D65                 lea     edi, [esi+2Bh]  
.text:00421D68                 mov     eax, [ebx+58h]  
.text:00421D6B                 shr     edi, 5  
.text:00421D6E                 inc     edi  
.text:00421D6F                 test    eax, eax  
.text:00421D71                 jz      short loc_421D7E  
.text:00421D73         push    0FFFFFFFFh      ; dwMilliseconds  
.text:00421D75                 push    eax             ; hHandle  
.text:00421D76                 call    ds:WaitForSingleObject  
.text:00421D7C                 jmp     short loc_421D8A  
.text:00421D7E ; ------------------------------------------------  
.text:00421D7E  
.text:00421D7E loc_421D7E:        ; CODE XREF: sub_421CF0+81 j  
.text:00421D7E                 lea     eax, [ebx+18h]  
.text:00421D81               mov     ebp, ds:EnterCriticalSection  
.text:00421D87        push    eax             ; lpCriticalSection  
.text:00421D88                 call    ebp ; EnterCriticalSection  
.text:00421D8A  
.text:00421D8A loc_421D8A:           ; CODE XREF: sub_421CF0+8C j  
.text:00421D8A                 push    edi  
.text:00421D8B                 push    esi  
.text:00421D8C                 push    ebx  
.text:00421D8D                 call    sub_421AD0  
.text:00421D92                 mov     [esp+20h+var_4], eax  
.text:00421D96                 add     esp, 0Ch  
.text:00421D99                 mov     eax, [ebx+58h]  
.text:00421D9C                 test    eax, eax  
.text:00421D9E                 jz      short loc_421DA9  
.text:00421DA0                 push    eax             ; hMutex  
.text:00421DA1                 call    ds:ReleaseMutex  
.text:00421DA7                 jmp     short loc_421DB5  
.text:00421DA9 ; ------------------------------------------------  
.text:00421DA9  
.text:00421DA9 loc_421DA9:           ; CODE XREF: sub_421CF0+AE j  
.text:00421DA9                 lea     eax, [ebx+18h]  
.text:00421DAC         mov     ebp, ds:LeaveCriticalSection  
.text:00421DB2        push    eax             ; lpCriticalSection  
.text:00421DB3                 call    ebp ; LeaveCriticalSection  
.text:00421DB5  
.text:00421DB5 loc_421DB5:           ; CODE XREF: sub_421CF0+B7 j  
.text:00421DB5                 cmp     [esp+14h+var_4], 0  
.text:00421DBA                 jz      short loc_421E18  
.text:00421DBC                 mov     edx, [esp+14h+var_4]  
.text:00421DC0                 mov     edi, [esp+14h+var_4]  
.text:00421DC4                 sub     edx, 20h  
.text:00421DC7                 xor     eax, eax  
.text:00421DC9                 mov     ecx, esi  
.text:00421DCB                 shr     ecx, 2  
.text:00421DCE                 rep stosd  
.text:00421DD0                 mov     ecx, esi  
.text:00421DD2                 and     ecx, 3  
.text:00421DD5                 rep stosb  
.text:00421DD7                 mov     ebp, [edx+4]  
.text:00421DDA                 mov     eax, [ebx+3Ch]  
.text:00421DDD                 sub     ebp, esi  
.text:00421DDF                 mov     ch, al  
.text:00421DE1                 sub     ebp, 28h  
.text:00421DE4                 mov     cl, al  
.text:00421DE6                 mov     eax, ecx  
.text:00421DE8                 mov     edi, [esp+14h+var_4]  
.text:00421DEC                 shl     eax, 10h  
.text:00421DEF                 add     edi, esi  
.text:00421DF1                 mov     ax, cx  
.text:00421DF4                 mov     ecx, ebp  
.text:00421DF6                 shr     ecx, 2  
.text:00421DF9                 rep stosd  
.text:00421DFB                 mov     ecx, ebp  
.text:00421DFD                 and     ecx, 3  
.text:00421E00                 rep stosb  
.text:00421E02                 mov     ebp, [edx+4]  
.text:00421E05                 mov     ecx, [esp+14h+arg_8]  
.text:00421E09                 mov     eax, [esp+14h+arg_C]  
.text:00421E0D                 mov     [ebp+edx-8], ecx  
.text:00421E11                 mov     ebp, [edx+4]  
.text:00421E14                 mov     [ebp+edx-4], eax  
.text:00421E18  
.text:00421E18 loc_421E18:           ; CODE XREF: sub_421CF0+CA j  
.text:00421E18                 mov     eax, [esp+14h+var_4]  
.text:00421E1C                 pop     ebp  
.text:00421E1D                 pop     edi  
.text:00421E1E                 pop     esi  
.text:00421E1F                 pop     ebx  
.text:00421E20                 add     esp, 4  
.text:00421E23                 retn  
.text:00421E23 sub_421CF0      endp  

更新

我认为 Guntram Blohm 帮助了我(感谢德国对我的感谢 - 我希望他能进一步帮助我),我们正走在正确的轨道上。这就是为什么我仍然尝试了一下,希望能更清楚一点。第一:较旧的 Designaknit 格式是 *.pat。但我不知道 *.sti 格式?

托盘数据的数量可能会超过 48 个,但只有这 48 个是重要的,因为程序只有 48 种颜色。
第一种颜色(大小为 25 字节)从 325 开始!!最后一个数据块后面的(13 个块)字节。然后,颜色块48用于跟随每25个字节。未使用的颜色用数字 0h 标记。也许其他色块已被保留(在 48 种调色板颜色之前和之后)以供将来更新更多颜色?
数据本身通过一个简单的 run-ength-Encryption 进行压缩。但是,字节已被加密。我做了很多测试,发现了很多:
在图像的左下角开始有多个相同的像素,所以你可以计算出这张表的数量:

左 4 位
0 = B
16 = A
32 = 9
48 = 8
64 = F
80 = E
96 = D
112 = C

右 4 位:
5 = 0
4 = 1
7 = 2
6 = 3
1 = 4
0 = 5
3 = 6
2 = 7
D = 8
C = 9
F = 10
9 = 12
8 = 13
B = 14
A = 15

这意味着如果在文件 z 中的位置 FC。B. B7(十六进制)是这样“7 = 2”像素“B = 0”+左下角共有2个相同颜色的像素可用。
这对于每个文件都是相同的。但是,此表此后在每个像素处发生变化并且也因文件而异。
这同样适用于调色板编号。在我的测试中,看起来托盘会在系统上的每个像素之后彻底混合。例如,从 1 + 2 = 3 + 4 开始准备,从 3 + 4 = + 1 秒开始,然后在整个范围内重复此操作。但它也可以混合不同(但仍在系统上)(示例 1 = 2、2 = 1、3 = 4、4 = 3 ...)或保持不变。
ti mix,而且像素数的变化可能由一个不同的键控制,该键与文件的变化不同(位置 41h、60h、20h(字节)、35h(4 个字节)、39h( 4 个字节)、3dh(2 个字节)和 3fh(2 个字节)——来自 Guntram)我不知道我是否正确,但也许 sub_41D5A0 是一个简单的 RLE 解码,然后解密在 sub_41cf20 中获得的数据作为密钥? ?

阿尔弗雷德

更新 2

你好,你的项目真的非常非常好,对我帮助很大。我认为数据块的第二部分被正确解码。对于提花,必须始终显示相同的字符(实心块!字符)。用于更改孔图案右/左图案、电缆等。然后,在第二部分中出现了各种字符(z. B. right Decreuse, left Decreuse, double Decreuse, eyelet, right transfer, transfer left ....)从字体文件中取出字符以表明这一点。我刚试过,就像我说的那样。这些文件然后在第一部分中只有相同的字符,并且在模式的第二部分中存在(具有不同的指令 - 重新分配 - 右 - 左等)但互联网几乎完全以 Jacquard stp 格式可用。
如果我可以汇编,那就太好了。来自第一封邮件的忠告。
非常感
谢阿尔弗雷德

2个回答

你真的应该学习一些汇编器和 x86 处理器架构来尝试这个。

给你一个开始:

var_*声明对应的局部变量的当前函数的栈。变量之间的字节数为您提供了有关这些变量大小的提示。例如,您有 a var_400、 avar_800和 a var_804这些是堆栈顶部下方偏移量,因此您有 1 个变量,范围从 400 到 0 ,另一个范围从 800 到 400,另一个范围从 804 到 800(还有很多我现在省略了)。由于这些是十六进制数,并且十六进制 400 等于 1024 年,这似乎是 2 个字符数组,每个大小为 1K(可能用作读取文件时的缓冲区)和一个 4 字节整数。

call顾名思义,A是一个函数调用。在调用之前,函数参数被push放入栈中;调用后,结果值在eax寄存器中。因此,例如,在您fopen调用之前,您会看到 a push eax- 这是文件名 - 并且在该 a 之前push offset aRb- 它将指针推送到字符串“rb”,这是 .rb 的模式参数fopen文件名 ,eax已在之前的指令中设置 , mov eax, [esp+860h+arg_C],所以现在您知道此函数的第 4 个参数 ( arg_0=1, arg_4=2, arg_8=3, arg_C=4) 是要读取的文件名。

函数调用后,结果在eax. 这段代码移动eaxesi,然后测试是否esi为 0(从技术上讲,它检查是否有任何位被设置,如果你andesi 与它自己,test操作码在and不存储结果情况下执行。test XXX,XXX是检查是否XXX为 0的常用模式)。如果不是,则函数继续;如果esi为 0,则“某事”的值为fffffffd,对应于 -3 。所以这整个部分看起来像

if ((fp=fopen(filename, "rb"))==NULL)
    do_something_with(-3);               <-- probably just a return

并且从那时起esi寄存器用于fp变量。

接下来,您的代码fseeks 到文件末尾(请参阅push 2用于whence参数和push 0用于position参数),然后调用ftell. 显然它使用它来查找文件的大小。

sub_421CF0使用参数 (0, filesize, "U:...\STI.C", 841) 调用,其结果sub_421CF0用作以下fread. 即使不看那个函数,我也会打赌它使用malloc或类似的东西来分配内存,并抛出一条错误消息,其中包含源代码文件名和行号,以防它失败。

在 fread 之后,正如你所说,有些东西被比作D7c. 如果您下载一个 stp 文件,并对其进行十六进制转储,您会看到它也以 开头D7c因此,即使没有进一步检查代码,fffffffc如果文件没有正确的标头并且似乎不是有效的 stp 文件,我会说这部分返回错误(-4 对应于)。

总而言之,是的,您似乎找到了正确的功能 - 打开文件,找到它的大小,分配该大小的缓冲区,将整个文件读入该缓冲区,并检查缓冲区是否以正确的魔法开始字节是一个明确的提示。

(此外,您会看到程序员在这里通过不检查 的返回值而犯了一个主要错误fread;即使文件大小足够,也不能保证 fread 返回所请求的字节数)。

但是要从中了解文件格式,您确实必须投入更多时间来检查对已读取字节做了什么。你真的需要学习 x86 架构和汇编程序,因为不太可能有人会为你完成所有其余的代码。但是,如果您理解我说到这里的内容,那么您就走上了一条正确的道路。

更新

更仔细地查看您的函数,这似乎是从 STP 文件到 STI 文件的转换函数,并且有一个类似的函数 sub_413b60,它对以D4c开头的文件D6c(可能是较旧的文件格式版本)执行相同的操作。

遵循该函数sub_4144B0对文件格式给出了很好的提示,扩展了您在第一个问题中找到的知识

在偏移量 F8 处,实际上可能有几个 (1..n) 数据块,它们都具有相同的格式:

2 bytes height
2 bytes size; this seems to be capped at 21000, read on
(size) bytes data

该高度不必匹配在文件被赋予高度偏移5,但高度匹配的文件偏移量表示的那些块的末尾。

在那之后,还有另一个相同结构的区块链;同样,高度为文件偏移量 5 的块是最后一个块。

在那之后,有 1775 字节的 Palette 数据,相当于 71 个条目,而不是您在数据格式示例中的 48 个条目。

上述块内的数据是加密的。有一个函数sub_41D5A0,它使用简单的异或解密来解密所有这些。此函数遍历块,解密它们,直到找到具有正确高度的块;然后重复这个过程。

xor 键本身设置在 中sub_41cf20,从 开始调用sub_41D5A0这个函数似乎从文件位置 41h 和 60h 获取字符串(1),以及来自位置 20h(字节)、35h(4 字节)、39h(4 字节)、3dh(2 字节)和 3fh(2 字节)的整数值) 生成一个长字符串,然后作为初始化器在静态缓冲区中的 424310 处生成一个 21000 字节的异或模式。这个缓冲区的大小,以及循环在 21001 处终止的事实,就是我说大小的原因似乎被限制在那里。不过,密钥生成本身似乎非常复杂,因此有必要进行一些动态分析以验证我假设的代码所做的事情是否真的如此,但我还没有这样做。

(1) 在这种情况下的字符串是指帕斯卡类型的字符串;1 字节长度;长度字节数据。

更新二

我解码了更多的文件格式,并在https://github.com/gbl/D7CReader 上建立了一个可以读取文件的 java 项目

这里有一些关于数据块和调色板条目的更多信息:

第一个数据块链似乎包含针脚本身。在 XOR 解码和 RLE 解压缩之后,似乎使用了大部分可打印的字符,例如 '!' 和数字。这些字符是调色板表的索引;这解释了为什么该表的第一个条目 - 不可打印的 ascii 字符 - 似乎未使用。

RLE 解压非常简单。最高位清除 (<=127) 的输入字节按原样传递。设置了最高位 (>=128) 的输入字节是一个计数;字节本身,清除最高字节后,是重复次数,下一个字节是需要重复的字节。因此,例如,83 21表示!字符的3 次重复95 31表示 21 次重复131 38 34表示184

生成加密密钥时,算法以一串数字开始,然后通过xor使用从字节索引派生的值对每个字节进行扩展来扩展该字符串这意味着 xor 字符串在变为二进制之前以几位数字开头。由于所有数字的 ascii 十六进制值为3X,并且大多数 RLE 长度字节看起来像8X,这解释了大多数加密 RLE 字节如何以 开头BX,至少在加密 RLE 流的开头。

第二个数据块链似乎包含针迹类型。它的 RLE 编码就像第一个一样,但结果字节是原始文件中查找表的索引,位于颜色表后面。在我所有的文件中,结果是一个完整的!字符这些似乎还有更多的事情发生,我假设当每行的列数不是恒定的时,这个块会有一些标记,但我没有对此进行进一步调查。

另请参阅https://pypi.org/project/DAKimport/,它是使用 Guntram 的 Java 代码并通过进一步反汇编 Silverknit Utility 开发的。