Subversion Repositories Kolibri OS

Rev

Rev 111 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; @RCHER - Deflate unpacker v2.0 beta
  2. ;
  3. ; Written in pure assembler by Ivushkin Andrey aka Willow
  4. ;
  5. ; Created: May 6, 2005
  6. ;
  7. ; Last changed: July 14, 2005
  8. ;
  9. ; Compile with FASM
  10.  
  11. SYS equ meos
  12. OUTBUF equ 4*1024*1024
  13. png_imag = output+OUTBUF
  14. PARAM_PTR = os_work;png_image
  15. MEMINIT=next_code;output
  16. DUMPFILE equ '/hd/1/out.txt'
  17.  
  18. SHOW_RBLOCK equ 0;1
  19. SHOW_PNG_SEC equ 0;1
  20. SHOW_METH equ 0;1
  21. FILE_NUM equ 15;8
  22. MEMORY equ 0x800000
  23.  
  24. BITS equ 16
  25. BUFSIZE equ 32
  26. BUFPTR equ area
  27.  
  28. PASSW_LEN equ 32
  29. NO_STOPS equ 1
  30. SHOW_CHARS equ 0
  31. BSIZE equ 512
  32. INBUF equ BUFSIZE*BSIZE*2
  33. IGNORE_DIRS equ 0
  34.  
  35. MOVE_SLINE_LEV equ 8
  36.  
  37. DECRYPT_MODE equ 100b
  38. PNG_MODE equ 10b
  39. TAR_MODE equ 1000b
  40. STAY_MODE equ 10000b
  41. IPC_MODE equ 100000b
  42. RAW_MODE equ 1000000b
  43. THREAD_YES equ 10000000b
  44. LIST_MODE equ 100000000b
  45. MEM_MODE equ 1000000000b
  46. FIND_MODE equ 10000000000b
  47.  
  48. if SYS eq win
  49. format PE console
  50. entry start
  51. ;match =win,SYS
  52. ;{
  53. ;    include 'D:\Ivushkin\projects\fasmw\INCLUDE\win32a.inc'
  54. ;}
  55. else
  56. use32
  57.  
  58.   org    0x0
  59.  
  60.   db     'MENUET01'
  61.   dd     0x01
  62.   dd     start
  63.   dd     I_END
  64.   dd     MEMINIT
  65.   dd     main_stack;MEMORY-2048
  66. if  PARAM_PTR eq param
  67.   dd     0
  68. else
  69.   dd     PARAM_PTR
  70. end if
  71.   dd     0x0
  72.  
  73. if  PARAM_PTR eq param
  74.   param db 'N'
  75.   db '000015'
  76.   db '/hd/1/zip/gz/fasm-1~1.tgz',0
  77. end if
  78. ;match =meos,SYS
  79. ;{
  80.     include "macros.inc"
  81. ;    purge mov
  82.     include "debug.inc"
  83.     include 'dump.inc'
  84. ;}
  85. end if
  86.  
  87. include 'lang.inc'
  88. language equ lang
  89.  
  90. if SYS eq win
  91. section '.text' code readable executable writeable
  92. end if
  93.  
  94. include "arcmacro.inc"
  95. include "parser.inc"
  96. include "deflate.inc"
  97. include "sys.inc"
  98.  
  99. FileNum dd FILE_NUM
  100. ;FNAME equ '/hd/1/zip/pngsuite/s01n3p01.png'
  101.  
  102. start:
  103. if SYS eq win
  104.     invoke GetStdHandle, STD_OUTPUT_HANDLE
  105.     mov  [cons],eax
  106.     invoke GetStdHandle, STD_INPUT_HANDLE
  107.     mov  [cons_in],eax
  108.     Msg  0
  109.     Msg  1
  110. else
  111.     Msg  0
  112.     Msg  1
  113.     mcall 40,10000101b
  114. ;    jmp again
  115.     CmdLine
  116.   cmdl:
  117.     test [Flags],LIST_MODE
  118.     jz   red
  119.  
  120. ;    Dump [lpath],[lpath_len],os_work
  121. ;    ud2
  122.  red:
  123.     call draw_window
  124.     mcall 12,2
  125.  
  126.  still:
  127.     mcall 10
  128.     cmp  eax,1
  129.     je   red
  130.     cmp  eax,2
  131.     jne  .nokey
  132.     mcall 2
  133.     cmp  ah,9
  134.     jz   quit
  135.     jmp  still
  136.   .nokey:
  137.     cmp  eax,3
  138.     jne  still
  139.     mcall 17
  140.     cmp  ah,1
  141.     jne  still
  142.     mcall 23,30
  143.     cmp  eax,3
  144.     jne  .noquit
  145.     call KillViewer
  146.     mcall -1
  147.   .noquit:
  148.     mcall 17
  149.     mcall 64,1,MEMINIT
  150.     QueryFile
  151.     mov  [FileNum],FILE_NUM
  152.     test eax,eax
  153.     jnz  still
  154. end if
  155. again:
  156. ;    Dump Flags,4,os_work
  157.     mov  [fat_],fat
  158.     Newline
  159.     xor  eax,eax
  160. ;    and  [Flags],STAY_MODE
  161.     and  [CRC32],eax
  162.     and  [IDATsize],eax
  163.     mov  [Adler32],1
  164.     call OpenFile
  165.     test ebx,ebx
  166.     jnz   .sizeok2
  167.   .sizebad2:
  168.     Msg  14
  169.     jmp  quit
  170.   .sizeok2:
  171.     call KillViewer
  172.     xor  eax,eax
  173.     mov  ecx,(child_stack-fat)/4
  174.     mov  edi,fat
  175.     rep  stosd
  176.     mov  [filesize],ebx
  177.     test [Flags],RAW_MODE
  178.     jz   .norawm
  179.     mov  eax,[arc_base]
  180.     xor  ebx,ebx
  181.     call FileSeek
  182.     jmp  .sizeok
  183.   .norawm:
  184.     call SfxParse
  185.  
  186.     call ZipParse
  187.     cmp  edx,52
  188.     je   .notzip
  189.     mov  ecx,[FileNum]
  190.     call ZipFindN
  191.     cmp  edx,4
  192.     je   quit
  193.     test [Flags],DECRYPT_MODE
  194.     jz   .nopass
  195.     call ZipDecrypt
  196.     push esi
  197.     mov  ecx,31
  198.   ._:
  199.     mov  al,[esi]
  200.     push eax
  201.     call decrypt_byte
  202.     xor  al,byte[esp]
  203.     add  esp,4
  204.     call UKeys
  205.     mov  [esi],al
  206.     inc  esi
  207.     loop ._
  208.     pop  esi
  209.     ud2
  210.   .nopass:
  211.     cmp  [unp_size],0
  212.     jne  .sizeok
  213.   .sizebadq:
  214.     Msg  13
  215.     jmp  quit
  216.   .notzip:
  217.     call GzipParse
  218.     test edx,edx
  219.     jne   .notgzip
  220.     jmp  .sizeok
  221.   .notgzip:
  222.     call PngParse
  223.     test edx,edx
  224.     jz  .sizeok1
  225.     cmp  edx,21
  226.     je   .sizebad
  227.     test [Flags],RAW_MODE
  228.     jne  .sizeok
  229.     Msg  40
  230.     jmp  exit
  231.   .sizebad:
  232.     Msg  17
  233.     jmp  exit
  234.   .sizeok1:
  235.   if ~ SYS eq win
  236.   end if
  237.     Msg  39          ; unpacking PNG
  238.     mov  ecx,[unp_size]
  239.     add  ecx,output
  240.     mov  [png_],ecx
  241.     mov  eax,[PNG_info.Width]
  242.     imul eax,[PNG_info.Height]
  243.     lea  eax,[eax+eax*2]
  244.     add  ecx,eax
  245. ;    dps  'Mem='
  246. ;    dpd  ecx
  247.     mcall 64,1
  248.     test eax,eax
  249.     jz   .ok
  250.     Msg  41
  251.     jmp  exit
  252.   .ok:
  253.     mov  edi,[outp]
  254.     call Deflate.blkbegin
  255.     jmp  .defl_end
  256.   .sizeok:
  257.     mov  ecx,[unp_size]
  258.     dpd  ecx
  259.     add  ecx,output
  260. ;    mov  [png_],ecx
  261.     mcall 64,1
  262.     test eax,eax
  263.     jz   .ok2
  264.     Msg  41
  265.     jmp  exit
  266.   .ok2:
  267.     call Deflate                ; <===========
  268.   .defl_end:
  269.     test [bits],7
  270.     jnz  .esi_ok
  271.     dec  esi
  272.   .esi_ok:
  273.     push dword[esi] ; <- Adler !!!
  274.     mov  esi,output
  275.     sub  edi,esi
  276.     mov  ecx,edi
  277.     mov  [outfile.size],ecx
  278.     test [Flags],RAW_MODE
  279.     jnz  .skipAdler
  280.     test [Flags],PNG_MODE
  281.     jnz  .skipCRC
  282.     push esi ecx
  283.     call UCRC
  284.     Msg  11
  285.     mov  eax,[CRC32]
  286.     mov  edx,36
  287.     cmp  eax,[CRC_check]
  288.     je   .crcok
  289.     dec  edx
  290.   .crcok:
  291.     Msg  edx
  292.   if  SYS eq win
  293.   else
  294.     dph  eax
  295.   end if
  296.     pop  ecx esi
  297.     jmp  .skipAdler
  298.   .skipCRC:
  299. ;    dps  'Out='
  300. ;    dpd  ecx
  301.     call UAdler
  302.     Msg  10
  303.     mov  eax,[Adler32]
  304.     bswap eax   ; <- calculated Adler !!!
  305.     mov  edx,36
  306.     cmp  eax,[esp]
  307.     je   .adlok
  308.     dec  edx
  309.   .adlok:
  310.     Msg  edx
  311.   if  SYS eq win
  312.   else
  313.     dph  eax
  314.   end if
  315.   .skipAdler:
  316.     pop  eax
  317.     Newline
  318.   .nomoreIDAT:
  319.     mov  ebx,output
  320. if SYS eq win
  321.     Msg 37
  322.     invoke CloseHandle, [hnd]
  323.  
  324.     invoke CreateFile,dumpfile,GENERIC_WRITE, FILE_SHARE_WRITE, NULL, \
  325.     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL
  326.     mov  [hnd],eax
  327.     invoke WriteFile, eax,ebx,[outfile.size],cparam1,NULL
  328.     invoke CloseHandle, [hnd]
  329. else
  330.     test [Flags],PNG_MODE
  331.     jnz  .nosave
  332.     test [Flags],LIST_MODE
  333.     jnz  quit
  334.  
  335.     test [Flags],TAR_MODE
  336.     jnz  .nomsg
  337.     Msg 37
  338.   .nomsg:
  339.     mov  [outfile.out],ebx
  340.     mcall 58,outfile
  341. ;       dps  'Before Quit1'
  342. ;    ud2
  343.     test [Flags],TAR_MODE
  344.     jz   exit.pad
  345. ;    call StartPad
  346.   .nosave:
  347. end if
  348.     test  [Flags],PNG_MODE
  349.     jz   NoPng
  350.       xor  eax,eax
  351.       mov  edi,filters
  352.       mov  ecx,6
  353.       rep  stosd
  354.       mov  edi,[png_]
  355.       mov  esi,output
  356. ;//
  357.       mov  [outp],edi
  358. ;//
  359.       call PngFilter
  360.       call FiltStats
  361.       mov  [outfile.size],edi
  362.       mov  ebx,[outp];png_image
  363. if  SYS eq win
  364.   exit:
  365.     Msg  12
  366.     invoke CreateFile,outfile,GENERIC_WRITE, FILE_SHARE_WRITE, NULL, \
  367.     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL
  368.     mov  [hnd],eax
  369.     invoke WriteFile, eax,ebx,[outfile.size],cparam1,NULL
  370.     invoke CloseHandle, [hnd]
  371.        call  RunViewer
  372.        and  [arc_base],0
  373.     and  [Flags],STAY_MODE
  374. ;       dps  'Before Quit2'
  375.   quit:    
  376.     QueryFile
  377.     test eax,eax
  378.     jnz  again
  379.     invoke ExitProcess,0
  380. else
  381.   exit:
  382.     mov  [outfile.out],ebx
  383.     test [Flags],TAR_MODE
  384.     jz   .notar
  385.     Msg  37
  386.     test [Flags],LIST_MODE
  387.     jne  quit
  388.     mcall 58,outfile
  389.   .pad:
  390.     call StartPad
  391.   .notar:
  392.     Msg  12
  393.        call  RunViewer
  394.        and  [arc_base],0
  395.     and  [Flags],STAY_MODE
  396. quit:
  397.     test [Flags],STAY_MODE
  398.     jnz  red
  399.     mcall -1
  400. end if
  401.  
  402. NoPng:
  403.     test  [Flags],TAR_MODE
  404.   if SYS eq win
  405.     jz  quit
  406.   else
  407.     jz    still
  408.   end if
  409. ;    Dump output,255,os_work
  410. ;    ud2
  411. ;    mov   ecx,dumpf_len
  412. ;    mov   esi,dumpfile
  413. ;    mov   edi,filename
  414. ;    rep   movsb
  415. ;    call  OpenFile
  416. ;    test  ebx,ebx
  417. ;    jz    again.sizebadq
  418.     call  TarParse
  419.     mov   ecx,[FileNum]
  420.     call  TarFindN
  421. ;    dpd   [outfile.size]
  422.     cmp   [outfile.size],0
  423.     jz    again.sizebadq
  424.     mov   ebx,esi
  425.     jmp   exit
  426.  
  427. if ~ SYS eq win
  428. draw_window:
  429.     mcall 12,1
  430.     mov  ebx,15
  431.     mov  ecx,ebx
  432.     mov  edx,0x0e26830
  433.     mov  edi,edx
  434.     mcall 0,,,,0x1f2a870
  435.     mcall 8,,,1+1 shl 30
  436.     mcall 4,<6,5>,0x10d0d0d0,msgs+5,1
  437.     mcall ,<5,5>,0x10202020
  438.     ret
  439. end if
  440.  
  441. include 'data.inc'
  442.  
  443. if SYS eq win
  444. section '.idata' import data readable writeable
  445.  
  446.   library kernel,'KERNEL32.DLL',\
  447.           comdlg,'COMDLG32.DLL',\
  448.           user,'USER32.DLL'
  449.  
  450.   import kernel,\
  451.      CreateFile,'CreateFileA',\
  452.      GetFileSize,'GetFileSize',\
  453.      ReadFile,'ReadFile',\
  454.      WriteFile,'WriteFile',\
  455.      SetFilePointer,'SetFilePointer',\
  456.      CloseHandle,'CloseHandle',\
  457.         GetStdHandle,'GetStdHandle',\
  458.         WriteConsole,'WriteConsoleA',\
  459.         ReadConsole,'ReadConsoleA',\
  460.         CreateProcess,'CreateProcessA',\
  461.         WritePrivateProfileString,'WritePrivateProfileStringA',\    
  462.         ExitProcess,'ExitProcess'
  463.  
  464.   import comdlg,\
  465.      GetOpenFileName,'GetOpenFileNameA'
  466.  
  467.   import user,\
  468.         wsprintf,'wsprintfA',\
  469.         SendMessage,'SendMessageA',\
  470.         FindWindowEx,'FindWindowExA',\
  471.         WaitForInputIdle,'WaitForInputIdle'
  472.    
  473.  
  474. section '.reloc' fixups data readable discardable
  475. end if
  476.  
  477. if ~ SYS in <meos,win>
  478.     error "Please specify SYS: meos OR win"
  479. end if
  480.  
  481.  
  482.