home *** CD-ROM | disk | FTP | other *** search
/ The Elite Hackers Toolkit / TheEliteHackersToolkitVolume1_1998.rar / HACKERS.BIN / appcraks / STNPEER.ZIP / STNPEER.ASM < prev    next >
Assembly Source File  |  1998-01-26  |  15KB  |  503 lines

  1. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2. ;
  3. ;                STNPEER.ASM - remover for Stone's PE-crypter
  4. ;                   (C) Copyright 1998 by ANAKiN [DaVinci]
  5. ;
  6. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  7.  
  8. .386p
  9. locals
  10. jumps
  11. .model flat, stdcall
  12.  
  13. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  14. ; imports
  15. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  16.  
  17. Extrn   ExitProcess     : PROC
  18. Extrn   GetCommandLineA : PROC
  19.  
  20. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  21. ; data
  22. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  23.  
  24. string macro name, what
  25.    name  db what
  26.  l&name equ $-name
  27. endm
  28.  
  29. .data
  30.  
  31.  Logo      db "───────────────────────────────────────────────────────────────────────────────", 13, 10
  32.            db "Stone's PE-ExeEncrypter v1.13 Remover                               26. Jan '98", 13, 10
  33.            db "Copyright (c) 1998 by ANAKiN [DaVinci]                      All Rights Reserved", 13, 10
  34.            db "Copy registered to: PUBLIC!", 13, 10
  35. lLogo      equ $-Logo
  36.  
  37.  string    <Logo2>    <"───────────────────────────────────────────────────────────────────────────────", 13, 10, 13, 10>
  38.  string    <usage>    <13, 10, "Usage:  STNPEER filename.ext", 13, 10>
  39.  string    <msgok>    <"OK", 13, 10>
  40.  string    <msgfail>  <"FAILED!", 13, 10>
  41.  string    <msgv100>  <"OK, version 1.00", 13, 10>
  42.  string    <msgv113>  <"OK, version 1.13", 13, 10>
  43.  string    <msgopen>  <"  ■ Opening file.                    ">
  44.  string    <msgchkfm> <"  ■ Checking for PE format.          ">
  45.  string    <msgchkcr> <"  ■ Checking for STNPEE signature.   ">
  46.  string    <msganal>  <"  ■ Analysing STNPEE loader.         ">
  47.  string    <msgdecr>  <"  ■ Decrypting sections.             ">
  48.  string    <msgwrite> <"  ■ Writing deprotected file.        ">
  49.  string    <msgclose> <"  ■ Closing file.                    ">
  50.  
  51. STNPEE_signature  db  055h, 057h, 056h, 052h, 051h, 053h, 0E8h, 000h
  52.                   db  000h, 000h, 000h, 05Dh, 08Bh, 0D5h, 081h, 0EDh
  53. signaturelen      equ $-STNPEE_signature
  54.  
  55. .data?
  56.  
  57. ; Buffer for the MZ header
  58. MZ_sig         dw  ?            ; MZ / ZM
  59. MZ_notforus    db  58 dup (?)   ; not needed
  60. MZ_pehead      dd  ?            ; seekvalue to MZ header
  61. MZ_len         equ $-MZ_sig
  62.  
  63. ; Buffer for the PE header
  64. PE_sig         dd  ?            ; PE\0\0
  65. PE_cpu         dw  ?            ; machine
  66. PE_numsec      dw  ?            ; number of sections
  67. PE_notforus1   db  12 dup (?)   ; not needed
  68. PE_soh         dw  ?            ; size of optional header
  69. PE_notforus2   dw  ?            ; not needed
  70. PE_len         equ $-PE_sig
  71.  
  72. ; Buffer for beginning of Optional Header
  73. OP_sig         dw  ?            ; signature
  74. OP_notforus1   db  14 dup (?)   ; not needed
  75. OP_entrypoint  dd  ?            ; program entrypoint
  76. OP_len         equ $-OP_sig
  77.  
  78. ; Buffer for last section
  79. SE_name        db  8 dup (?)    ; section name '.Stone'
  80. SE_notforus1   dd  ?            ; not needed (virtsize)
  81. SE_rva         dd  ?            ; VirtAddress
  82. SE_size        dd  ?            ; PhysSize
  83. SE_seek        dd  ?            ; Seekvalue to sectiondata
  84. SE_notforus2   db  16 dup (?)   ; not needed
  85. SE_len         equ $-SE_name
  86.  
  87. ; Empty section
  88. ES_buffer      db  SE_len dup (?)
  89.  
  90. keepoffareas   dd  ?            ; Start of Keep off area
  91. keepoffareae   dd  ?            ; End of Keep off area
  92. version        db  ?            ; version 1.0=100 1.13=113
  93. filename       dd  ?            ; Address of filename
  94. section1       dd  ?            ; Seekvalue to first sectionheader
  95. sectionl       dd  ?            ; Seekvalue to last sectionheader
  96. varptr         dd  ?            ; Address of variables
  97. decreasekey    db  ?            ; SUB key for sections
  98. nsecs          db  ?            ; number of encrypted sections
  99. buffer         db  1000 dup (?) ; buffer for loader
  100. sectionbuffer  db  2048*1024 dup (?) ; buffer for decryption
  101.  
  102. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  103. ; functions
  104. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  105.  
  106. .code
  107.  
  108. include file.inc
  109. include console.inc
  110.  
  111. CommandLineHandling:
  112.         CALL    GetCommandLineA
  113.  
  114.         ;  Get length of CommandLine
  115.         MOV     EDI, EAX     ; EDI=address of commandline
  116.         MOV     ESI, EDI     ; ESI too
  117.         XOR     ECX, ECX
  118.         DEC     ECX
  119.         XOR     EAX, EAX
  120.         REPNE   SCASB        ; Search for end of commandline
  121.         DEC     EDI
  122.         SUB     EDI, ESI
  123.         MOV     ECX, EDI
  124.  
  125.         ;  Get first parameter
  126.         MOV     EDI, ESI
  127.         MOV     AL, 20h      ; Search spaces
  128.         REPNE   SCASB        ; get rid of program name
  129.         REP     SCASB        ; get rid of spaces
  130.         OR      ECX, ECX     ; ECX==0
  131.         JE      helpscreen
  132.         DEC     EDI
  133.  
  134.         CMP     byte ptr [EDI], '/'
  135.         JE      helpscreen
  136.         CMP     byte ptr [EDI], ','
  137.         JE      helpscreen
  138.         CMP     byte ptr [EDI], '-'
  139.         JNE     CommandLineHandlingend
  140.  
  141. helpscreen:
  142.         cwrites <usage>
  143.         cwrites <Logo2>
  144.         JMP     end_1
  145.  
  146. CommandLineHandlingend:
  147.         MOV     filename, EDI
  148.         RET
  149.  
  150. Chk_PE:
  151.         ;  Read MZ header
  152.         fileread <MZ_sig> <MZ_len>
  153.         CMP     EAX, -1                 ; Error?
  154.         JE      Chk_PEend               ; Then Exit
  155.  
  156.         ;  Checking for ZM / MZ signature
  157.         XOR     EAX, EAX
  158.         DEC     EAX
  159.         CMP     MZ_sig, 'MZ'
  160.         JE      Chk_PEisexe
  161.         CMP     MZ_sig, 'ZM'
  162.         JNE     Chk_PEend
  163.  
  164. Chk_PEisexe:
  165.         ;  Seek to PE header
  166.         filelseek <MZ_pehead>
  167.  
  168.         ;  Read PE header
  169.         fileread <PE_sig> <PE_len>
  170.         CMP     EAX, -1                   ; Error?
  171.         JE      Chk_PEend                 ; Then Exit
  172.  
  173.         ;  Checking for PE\0\0 signature
  174.         XOR     EAX, EAX
  175.         DEC     EAX
  176.         CMP     PE_sig, 00004550h
  177.         JNE     Chk_PEend
  178.  
  179.         ;  Read Optional header
  180.         fileread <OP_sig> <OP_len>
  181.         CMP     EAX, -1                   ; Error?
  182.         JE      Chk_PEend                 ; Then Exit
  183.  
  184.         ;  Calculate address of first section header
  185.         MOV     EAX, MZ_pehead   ; EAX=MZ_pehead
  186.         ADD     EAX, PE_len      ; EAX+=PE_len
  187.         MOVZX   EBX, PE_soh      ; EBX=PE_soh
  188.         ADD     EAX, EBX         ; EAX+=EBX
  189.         MOV     section1, EAX
  190.  
  191.         ;  Calculate address of last section header
  192.         MOV     EAX, SE_len      ; EAX=SE_len
  193.         MOVZX   EBX, PE_numsec   ; EBX=PE_numsec
  194.         DEC     EBX              ; EBX-=1
  195.         MUL     EBX              ; EAX*=EBX
  196.         ADD     EAX, section1    ; EAX+=section1
  197.         MOV     sectionl, EAX
  198.  
  199.         ;  Ensure EAX=0
  200.         XOR     EAX, EAX                ; OK!
  201. Chk_PEend:
  202.         RET
  203.  
  204. Chk_Sig:
  205.         ;  Seek to last sectionheader
  206.         filelseek <sectionl>
  207.  
  208.         ;  Read last sectionheader
  209.         fileread  <SE_name> <SE_len>
  210.         CMP     EAX, -1                  ; Error?
  211.         JE      Chk_Sigend               ; Then Exit
  212.  
  213.         ;  Entrypoint==start of this section?
  214.         XOR     EAX, EAX
  215.         DEC     EAX                      ; EAX=-1
  216.         MOV     EBX, SE_rva
  217.         CMP     EBX, OP_entrypoint
  218.         JNE     Chk_Sigend
  219.  
  220.         ;  Seek to section
  221.         filelseek  <SE_seek>
  222.  
  223.         ;  Read section
  224.         fileread   <buffer> <1000>
  225.         CMP     EAX, -1                  ; Error?
  226.         JE      Chk_Sigend               ; Then exit
  227.  
  228.         ;  Compare signatures
  229.         XOR     EAX, EAX
  230.         DEC     EAX
  231.         MOV     ESI, offset buffer
  232.         MOV     EDI, offset STNPEE_signature
  233.         MOV     ECX, signaturelen
  234.         REP     CMPSB
  235.         JNE     Chk_Sigend
  236.  
  237.         ;  Ensure EAX=0
  238.         XOR     EAX, EAX                 ; OK!
  239. Chk_Sigend:
  240.         RET
  241.  
  242. Ana_Loader:
  243.         ;  Search decryption loop
  244.         MOV     ECX, 900                 ; :)
  245.         MOV     EDI, offset buffer
  246. searchloop:
  247.         MOV     AL, 80h
  248.         REPNE   SCASB
  249.         JE      loopmaybefound
  250.         XOR     EAX, EAX
  251.         DEC     EAX                      ; EAX=-1
  252.         JMP     Ana_Loaderend
  253. loopmaybefound:
  254.         CMP     byte ptr [EDI], 2Bh
  255.         JNE     searchloop
  256.         CMP     word ptr [EDI+2], 0E243h      ; INC EBX ; LOOP
  257.         JNE     searchloop
  258.  
  259.         MOV     AL, [EDI+1]
  260.         MOV     decreasekey, AL
  261.  
  262.         ; 0FAh = v1.00
  263.         CMP     byte ptr [EDI+4], 0FAh
  264.         JZ      loopv100
  265.  
  266.         ; 0E8h = v1.13
  267.         CMP     byte ptr [EDI+4], 0E8h
  268.         JZ      loopv113
  269.  
  270.         ; unknown version
  271.         XOR     EAX, EAX
  272.         DEC     EAX                   ; EAX=-1
  273.         JMP     Ana_Loaderend
  274.  
  275. loopv100:
  276.         cwrites <msgv100>
  277.         MOV     keepoffareas, 0       ; NO IAT handling
  278.         MOV     keepoffareae, 0       ; in this version
  279.         MOV     version, 100
  280.         JMP     search_vars
  281.  
  282. loopv113:
  283.         cwrites <msgv113>
  284.         MOV     version, 113
  285.  
  286. search_vars:
  287.         ;  Search variables
  288.         MOV     ECX, 900                  ; :)
  289.         MOV     EDI, offset buffer
  290. searchvar:
  291.         MOV     AL, 0E0h
  292.         REPNE   SCASB
  293.         JE      varmaybefound
  294.         XOR     EAX, EAX
  295.         DEC     EAX
  296.         JMP     Ana_Loaderend
  297. varmaybefound:
  298.         CMP     word ptr [EDI-3], 0FF5Dh
  299.         JNE     searchvar
  300.         CMP     word ptr [EDI-5], 05F5Eh
  301.         JNE     searchvar
  302.  
  303. ;-----> for version 1.13 there are some special variables
  304.         CMP     version, 113
  305.         JNE     isversion100
  306.         MOV     EAX, [EDI]         ; Get start of IAT
  307.         MOV     keepoffareas, EAX
  308.         MOV     EAX, [EDI+4]       ; Get end of IAT
  309.         MOV     keepoffareae, EAX
  310.         ADD     EDI, 9             ; Adjust varptr
  311. isversion100:
  312.  
  313. ;-----> Get old entrypoint
  314.         MOV     EAX, [EDI+4]
  315.         MOV     OP_entrypoint, EAX
  316.  
  317. ;-----> Get number of encrypted sections
  318.         MOV     AL, [EDI+8]
  319.         MOV     nsecs, AL
  320.  
  321. ;-----> Store position of variables
  322.         ADD     EDI, 13
  323.         MOV     varptr, EDI
  324.  
  325. ;-----> Ensure EAX=0
  326.         XOR     EAX, EAX          ; OK!
  327. Ana_Loaderend:
  328.         RET
  329.  
  330. Decrypt:
  331.         MOVZX   ECX, PE_numsec    ; repeat for all stored sections
  332. forallsections:
  333.  
  334.         ;  Calculate address of section header
  335.         MOV     EAX, SE_len      ; EAX=SE_len
  336.         MOV     EBX, ECX         ; EBX=ECX
  337.         DEC     EBX              ; EBX-=1
  338.         MUL     EBX              ; EAX*=EBX
  339.         ADD     EAX, section1    ; EAX+=section1
  340.  
  341.         PUSHA
  342.         ;  Seek to sectionheader
  343.         filelseek <eax>
  344.  
  345.         ;  Read it
  346.         fileread  <SE_name> <SE_len>
  347.         CMP     EAX, -1
  348.         POPA
  349.         JE      Decrypt_end
  350.  
  351.         MOV     DL, nsecs       ; repeat for all encrypted sections
  352.         MOV     ESI, varptr
  353. getRVA:
  354.         LODSD
  355.         MOV     EDI, EAX
  356. getSize:
  357.         LODSD
  358.         CMP     EDI, SE_rva
  359.         JB      notthissection
  360.  
  361.         ;  Read section into buffer
  362.         PUSHA
  363.         filelseek <SE_seek>
  364.         fileread  <sectionbuffer> <SE_size>
  365.         CMP     EAX, -1
  366.         POPA
  367.         JE      Decrypt_end
  368.  
  369.         PUSH    ECX
  370.         PUSH    EBP
  371.         PUSH    EDX
  372.  
  373.         MOV     EBP, SE_rva
  374.         MOV     ECX, EAX
  375.         SUB     EDI, EBP
  376.  
  377.         ;  Decrypt the section
  378.         MOV     AL, decreasekey
  379. innerloop:
  380.         LEA     EDX, [EDI+SE_rva]
  381.         CMP     EDX, keepoffareas
  382.         JB      dodecrypt
  383.         CMP     EDX, keepoffareae
  384.         JBE     keepoff
  385. dodecrypt:
  386.         SUB     [EDI+sectionbuffer], AL
  387. keepoff:
  388.         INC     EDI
  389.         LOOP    innerloop
  390.  
  391.         POP     EDX
  392.         POP     EBP
  393.         POP     ECX
  394.  
  395.         ;  Write section back to disk
  396.         PUSHA
  397.         filelseek <SE_seek>
  398.         filewrite <sectionbuffer> <SE_size>
  399.         CMP     EAX, -1
  400.         POPA
  401.         JE      Decrypt_end
  402.  
  403. notthissection:
  404.         DEC     DL
  405.         JNZ     getRVA
  406. exitthissection:
  407.  
  408.         LOOP    forallsections
  409.  
  410.         ;  Ensure EAX=0
  411.         XOR     EAX, EAX                ; OK!
  412. Decrypt_end:
  413.         RET
  414.  
  415. WriteBack:
  416. ;-----> Remove last sectionheader
  417.         DEC     PE_numsec               ; Decrease number of sections
  418.         filelseek  <sectionl>           ; Seek to last sectionheader
  419.         filewrite  <ES_buffer> <SE_len> ; Clear in header
  420.         CMP     EAX, -1                 ; Error?
  421.         JE      WriteBackend            ; Then Exit
  422.  
  423. ;-----> Seek PE header
  424.         filelseek <MZ_pehead>
  425.  
  426. ;-----> WriteBack PE header
  427.         filewrite <PE_sig> <PE_len>
  428.         CMP     EAX, -1                 ; Error?
  429.         JE      WriteBackend            ; Then Exit
  430.  
  431. ;-----> WriteBack OP header
  432.         filewrite <OP_sig> <OP_len>
  433.         CMP     EAX, -1                 ; Error?
  434.         JE      WriteBackend            ; Then Exit
  435.  
  436. ;-----> Ensure EAX=0
  437.         XOR     EAX, EAX                ; OK!
  438. WriteBackend:
  439.         RET
  440.  
  441. Main:
  442.         cinit
  443.         cwrites <Logo>
  444.  
  445.         CALL    CommandLineHandling
  446.  
  447.         cwrites <Logo2>
  448.  
  449.         cwrites  <msgopen>        ; '■ Opening file.'
  450.         fileopen <filename>
  451.         CMP EAX, -1
  452.         JE  failend_1
  453.         cwrites <msgok>           ; 'OK'
  454.  
  455.         cwrites <msgchkfm>        ; '■ Checking for PE format.'
  456.         CALL    Chk_PE
  457.         CMP     EAX, -1
  458.         JE      failclose
  459.         cwrites <msgok>           ; 'OK'
  460.  
  461.         cwrites <msgchkcr>        ; '■ Checking for STNPEE signature.'
  462.         CALL    Chk_Sig
  463.         CMP     EAX, -1
  464.         JE      failclose
  465.         cwrites <msgok>           ; 'OK'
  466.  
  467.         cwrites <msganal>         ; '■ Analysing STNPEE loader.'
  468.         CALL    Ana_Loader
  469.         CMP     EAX, -1
  470.         JE      failclose
  471.  
  472.         cwrites <msgdecr>         ; '■ Decrypting sections.'
  473.         CALL    Decrypt
  474.         CMP     EAX, -1
  475.         JE      failclose
  476.         cwrites <msgok>           ; 'OK'
  477.  
  478.         cwrites <msgwrite>        ; '■ Writing deprotected file.'
  479.         CALL    WriteBack
  480.         CMP     EAX, -1
  481.         JE      failclose
  482.         cwrites <msgok>           ; 'OK'
  483.  
  484. closing:
  485.         cwrites <msgclose>        ; '■ Closing file.'
  486.         fileclose
  487.         CMP EAX, -1
  488.         JE  failend_1
  489.         cwrites <msgok>           ; 'OK'
  490.         JMP end_1
  491.  
  492. failclose:
  493.         cwrites <msgfail>         ; 'FAILED!'
  494.         JMP     closing
  495.  
  496. failend_1:
  497.         cwrites <msgfail>         ; 'FAILED!'
  498.  
  499. end_1:
  500.         PUSH    0
  501.         CALL    ExitProcess
  502.  
  503. end Main