31.07.2015 Views

recon2015-14-christopher-domas-The-movfuscator

recon2015-14-christopher-domas-The-movfuscator

recon2015-14-christopher-domas-The-movfuscator

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>The</strong> M/o/VfuscatorTurning 'mov' into a soul-crushing RE nightmare{<strong>domas</strong> / REcon 2015


REMath(github.com/REMath)


Stephen Dolan http://www.cl.cam.ac.uk/~sd601/papers/mov.pdf


It is well-known that the x86 instruction set isbaroque, overcomplicated, and redundantlyredundant. We show just how much fluff it has bydemonstrating that it remains Turing-completewhen reduced to just one instruction.- Stephen Dolan


movmov destination, source


Any code we write …… can be written as a set of movs instead… and nothing elseReally?That’d be tough to reverse engineer,wouldn’t it?Turing Complete?


4004e9: mov DWORD PTR [rbp-0x8],0x0 4004f2: push 600004 4004f8: call printf 4004fa: pop eax 4004fc: add DWORD PTR [rbp-0x8],0x1 400500: cmp DWORD PTR [rbp-0x8],0x100 400507: jle 4004f2


80515bc: mov 80515c1: mov 80515c7: mov 80515cd: mov 80515d2: mov 80515d5: mov 80515db: mov 80515de: mov 80515e3: mov 80515e9: mov 80515ef: mov 80515f4: moveax,ds:0x835d81aebx,DWORD PTR [eax+0x835d6fc]edx,DWORD PTR ds:0x835d7daeax,0x0al,BYTE PTR [ebx+edx*1]al,BYTE PTR [eax+0x835dc7e]BYTE PTR [ebx+edx*1],aleax,ds:0x835d81aebx,DWORD PTR [eax+0x835d6fc]edx,DWORD PTR ds:0x835d7daeax,0x0al,BYTE PTR [ebx+edx*1]


M = A finite set of states Q A distinguished start state q 0 ∈ Q A finite set of symbols Σ A distinguished blank symbol σ 0 ∈ Σ A transition table δ, which is a partial functionQ × Σ → Σ × {L, R} × QTuring Machines


FascinatingBut academicSo?



Removing all but the mov instruction fromfuture iterations of the x86 architecturewould have many advantages: theinstruction format would be greatlysimplified, the expensive decode unit wouldbecome much cheaper, and silicon currentlyused for complex functional units could berepurposed as even more cache. As long assomeone else implements the compiler.- Stephen Dolan


Where to begin…?Key Ideas


mov can check equalityKey Ideas


mov [x], 0mov [y], 1mov R, [x]x==y


x=3, y=3mov [x], 0mov [y], 1mov R, [x]x==y


x=2, y=3mov [x], 0mov [y], 1mov R, [x]x==y


<strong>The</strong>re is only one code pathDesigned correctly, a code block can Have an effect Have no effect Depending on the initial stateKey Ideas


Requires a single jmp instruction toloop back to the beginningIncidentalIdeas on fixing this laterKey Ideas


start: mov … mov … mov … mov … mov … mov … mov … mov … mov … mov … mov … mov … jmp start


Dolan’s Turing Machine designrequires an invalid memoryaddress, for haltingKey Ideas


Step 2: ?


Idea… Build on Dolan’s ideas Adapt primitive TM operations for higher level logic Work on actual data, not abstract symbols Add new operations If/else Arithmetic Logic Jumps Loops Etc… Bring it closer to something we can use


Implementing if


IF X == Y THEN X = 100Implementing if


<strong>The</strong> catch: We have no branches All paths execute, no matter what Solution: Force a path to operate on ‚dummy‛data, if we don’t want its resultsImplementing if


DataScratchSelector IF X == Y THEN X = 100Implementing if


DataScratchSelector IF X == Y THEN X = 100Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100Implementing if


DataScratchSelector IF X == Y THEN X = 100Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100⇐Implementing if


DataScratchSelector IF X == Y THEN X = 100Implementing if


IF X == Y THENX = 100int* SELECT_X[] = { &DUMMY_X, &X }*SELECT_X[ X == Y ] = 100Implementing if


section .dataX: dd 0DUMMY_X: dd 0Y: dd 0DUMMY_Y: dd 0SELECT_X: dd DUMMY_X, XSELECT_Y: dd DUMMY_Y, YImplementing if


; X == Ymov eax, [X]mov [eax], 0mov eax, [Y]mov [eax], 4mov eax, [X]; X = 100mov eax, [SELECT_X + eax]mov [eax], 100Implementing if


Solution:Add a ‚selector‛ ‚function‛(pointer array) to all variablesImplementing if


About that equality check…mov eax, [X]mov [eax], 0We can’t just write to arbitraryspots in memory (although wecould with the original TM design)Implementing if


Several solutionsEasiest: Limit ourselves to 1 byte data Create a 256 byte scratch array forequality testingImplementing if


section .bssEQ: resb 256section .text; valid on for X, Y < 256mov al, [X]mov byte [EQ+eax], 0mov al, [Y]mov byte [EQ+eax], 4mov al, [X]mov al, [EQ+eax]Implementing if


Simple extensions give usif/elseif/elseif/elseInequality checksImplementing if


%macro eq 3mov eax, 0mov al, [%2]mov byte [e+eax], 0mov byte [e+%3], 4mov al, [e+eax]mov [%1], al%endmacro


%macro neq 3mov eax, 0mov al, [%2]mov byte [e+eax], 4mov byte [e+%3], 0mov al, [e+eax]mov [%1], al%endmacro


; create selector%macro c_s 1%1: dd 0d_%1: dd 0s_%1: dd d_%1, %1%endmacro


Extend the if/else ideaOn each branch If the branch is taken Store the target address Turn execution ‚off‛ If the branch is not taken Leave execution ‚on‛Loops and branches


On each operation If execution is on Run the operation on real data If execution is off Is current address the stored branch target? Yes? No?Turn execution ‚on‛Run operation on real dataLeave execution ‚off‛Run on dummy dataLoops and branches


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov …mov …mov …mov …mov …mov …mov …mov …mov …jmp start


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov …mov …mov …mov …mov …mov … ← Implement a branch from here…mov …mov …mov …jmp start


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov … ← … to heremov …mov …mov …mov …mov … ← Implement a branch from here…mov …mov …mov …jmp start


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov … ← … to heremov …mov …mov …mov …mov … ←mov …mov …mov …jmp startStore targetSwitch to dummy data0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov … ← … to heremov …mov …mov …mov …mov …mov … ← Check if branch targetmov …mov …jmp start0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov … ← … to heremov …mov …mov …mov …mov …mov …mov … ← Check if branch targetmov …jmp start0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov …mov … ← … to heremov …mov …mov …mov …mov …mov …mov …mov … ← Check if branch targetjmp start0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov … ← Check if targetmov …mov …mov … ← … to heremov …mov …mov …mov …mov …mov …mov …mov …jmp start0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov … ← Check if targetmov …mov … ← … to heremov …mov …mov …mov …mov …mov …mov …mov …jmp start0x100cOFF


start: 0x1000 0x1004 0x1008 0x100c 0x1010 0x10<strong>14</strong> 0x1018 0x101c 0x1020 0x1024 0x1028 0x102c 0x1030mov …mov …mov … ← Check if targetmov … ← … to heremov …mov …mov …mov …mov …mov …mov …mov …jmp start0x100cOFF


start: 0x1000mov …0x100c 0x1004mov … 0x1008 0x100c 0x1010mov …mov … ←mov …Target matchSwitch to real dataOFF 0x10<strong>14</strong>mov … 0x1018mov … 0x101cmov … 0x1020mov … 0x1024mov … 0x1028mov … 0x102cmov … 0x1030jmp start


start: 0x1000mov …0x100c 0x1004mov … 0x1008 0x100c 0x1010mov …mov … ←mov …Target matchSwitch to real dataON 0x10<strong>14</strong>mov … 0x1018mov … 0x101cmov … 0x1020mov … 0x1024mov … 0x1028mov … 0x102cmov … 0x1030jmp start


Look up tables!We’re already stuck with byte datafrom before, so this is pretty easyArithmetic


unsigned char inc[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, <strong>14</strong>, 15, 16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,1<strong>14</strong>,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,<strong>14</strong>0,<strong>14</strong>1,<strong>14</strong>2,<strong>14</strong>3,<strong>14</strong>4,<strong>14</strong>5,<strong>14</strong>6,<strong>14</strong>7,<strong>14</strong>8,<strong>14</strong>9,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,2<strong>14</strong>,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0};


incb:%assign y 1%rep 256db y&0xff%assign y y+1%endrep


; increment eax with movmov eax, [inc + eax]Arithmetic


unsigned char dec[]={255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, <strong>14</strong>,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,1<strong>14</strong>,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,<strong>14</strong>0,<strong>14</strong>1,<strong>14</strong>2,<strong>14</strong>3,<strong>14</strong>4,<strong>14</strong>5,<strong>14</strong>6,<strong>14</strong>7,<strong>14</strong>8,<strong>14</strong>9,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,2<strong>14</strong>,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254};


decb:%assign y 256-1%rep 256db y&0xff%assign y y+1%endrep


; decrement eax with movmov eax, [dec + eax]Arithmetic


LogicLogic gates can similarly beimplemented as lookup tables


unsigned char and[2][2]={ { 0, 0 }, {0, 1} };unsigned char or[2][2]={ { 0, 1 }, {1, 1} };unsigned char not[2]={ 1, 0 };and[1][0]or[0][1]not[1]Logic


o: dd o_0, o_1o_0: dd 0, 4o_1: dd 4, 4%macro or 3mov eax, [%2]mov edx, [o+eax]mov eax, [%3]mov eax, [eax+edx]mov [%1], eax%endmacro


a: dd a_0, a_1a_0: dd 0, 0a_1: dd 0, 4%macro and 3mov eax, [%2]mov edx, [a+eax]mov eax, [%3]mov eax, [eax+edx]mov [%1], eax%endmacro


n: dd 4, 0 ; not%macro not 2mov eax, [%2]mov eax, [n+eax]mov [%1], eax%endmacro


Our program loops foreverWe need a way to stop itDolan: a special invalid addressWait, that sounds familiar…NULLmov eax, [0]Halt


nh: dd 0h: dd nh, 0; haltmov eax, [b]mov eax, [h+eax]mov eax, [eax]Halt


eq b, i, '+'neq b, i, '+'not b, offand b, b1, b2or b, b1, b2get eax, real, scratch, binc eaxdec eaxon boff bBuilding Blocks


With enough macros, this becomesalmost doable … … in assemblyApplication


A C compiler is a lofty goalLet’s start with something simpler


BrainF#$!


A minimalistic esolang8 instructions2 registers Instruction pointer Data pointer We’re going to call it BrainYuckyBrainF#$!


Increment the data pointer< Decrement the data pointer+ Increment the byte at the data pointer- Decrement the byte at the data pointer. Output the byte at the data pointer, Read one byte of input, store it at the data pointer[ If the byte at the data pointer is 0,jump forward to the matching ]] If the byte at the data pointer is non-0,jump backward to the matching [


# Halt


Print ‘1234’:++++++++ ++++++++++++++++ ++++++++++++++++ +++++++++ . + . + . + . +Set the current data cell to 0:[ - ]BrainYucky


++++++++[>++++[>++>+++>+++>+>+[.>---.+++++++..+++.>>.+.>++.Hello, world!


++++++++++>+>+[[+++++[>++++++++.--------[-]+++++++++[-]>+>+]


+++++++++[-][-]>[-]+[-]>>>>[-]+-]+>[-]>[-]+-[-]+[-]>>[>+>+[-]]>+>+>[-]>---->-]++++++[-]++++++>>>++[-]+++++++++[-]++++++++>>>[-]++++++++[-]>>-.---.>+++++++[-]++++++++[-]>>>++[-]+++++++++[-]>>>-----.---.>>>[>+>+[-]+[-]++++[-]+++++[-]>>>>>[>>+>+[-]++++++++++++.>>>>-]>+++++++>-]+++++++[-]++++++[>>>>+++++++++>-]++++++++++[-]>>>>-.---.>+++++++[-]>>>>------.>+++++++[-]++++++++[-]>>>>-.---------.>+++++++[-]+++++++[->>>>>]++++++++[-]>>>>>+++++[-]++++>>>>>+++[-]++++++++[-]+++[>>>>>-]+++[-]+++++++++[-]+++++++[>>>>++++++++++>-]++++++++[-]>>>>.>+++++[-]+++[-]>>>>---.----------.>++++++++[-]>>>-]+[-]>>>[-]>>>[-]>[>+[>>>>>>-]>[-]+->>>>[-]>+[-]>[>+>+>>>>>>[-]>>-]++++[-]+++++[-]>>>>>-----.-------.>>[>>+>+[-]>.>>>>-]>>-.---------.>+++++++[-]++++++[-]>>>>>>++++++++[-]+++++++++[>>>>>>-]++++++++[-]++++++++[>>>>>++++++++>-]+++++++[-]>>>>>>++++++++[-]++[-]>>>>>>..>+++++++++[-]


This is even worse than the movs!Why would you do this?!With our building blocks,BF ops are easy to implement with movIf I can get the code into BF,I can get it into movsA BASIC to BF compiler already existsWHY!?


mov eax, [ip]mov al, [p+eax]mov [i], alRead the instruction


eq br, i, ','eq bw, i, '.'eq bb, i, ''eq bi, i, '+'eq bd, i, '-'eq bo, i, '['eq bc, i, ']'eq bt, i, '#'Check the instruction


not b, bsand b, b, bimov eax, [b]mov ebx, [s_ms+eax]mov edx, [dp]mov eax, 0mov al, [ebx+edx]mov al, [incb+eax]mov [ebx+edx], al+


not b, bsand b, b, bdmov eax, [b]mov ebx, [s_ms+eax]mov edx, [dp]mov eax, 0mov al, [ebx+edx]mov al, [decb+eax]mov [ebx+edx], al-


not b, bsand b, b, bbmov eax, [b]mov ebx, [s_dp+eax]mov eax, [ebx]mov edx, 0mov dx, [decw+2*eax]mov [ebx], edx


not b, bsand b, b, bfmov eax, [b]mov ebx, [s_dp+eax]mov eax, [ebx]mov edx, 0mov dx, [incw+2*eax]mov [ebx], edx>


mov eax, [bt]mov eax, [h+eax]mov eax, [eax]#


not b, bsand b, b, bwmov eax, [b]mov eax, [s_mz+eax]mov edx, [dp]mov al, [eax+edx]mov [c], al.mov eax, 4mov ebx, 1mov ecx, cmov edx, 1int 0x80


not b, bsand b, b, brmov edx, [b]mov edx, [trim+edx]mov eax, 3mov ebx, 0mov ecx, cint 0x80,mov eax, [b]mov eax, [s_ms+eax]mov dl, [c]mov [eax], dl


and b, bo, bsfmov eax, [b]mov eax, [s_ns+eax]mov edx, [eax]mov dl, [incb+edx]mov [eax], edx[and b, bo, bsbmov eax, [b]mov eax, [s_ns+eax]mov edx, [eax]mov dl, [decb+edx]mov [eax], edxmov [t], edxeq b, t, 0and b, b, boand b, b, bsbmov eax, [b]mov eax, [s_bsb+eax]mov [eax], dword 0mov eax, [dp]mov edx, 0mov dl, [m+eax]mov [t], edxeq t, t, 0not b, bsand b, b, tand b, b, bomov eax, [b]mov eax, [s_ns+eax]mov [eax], dword 1mov eax, [b]mov eax, [s_bsf+eax]mov [eax], dword 4


and b, bc, bsbmov eax, [b]mov eax, [s_ns+eax]mov edx, [eax]mov dl, [incb+edx]mov [eax], edx]and b, bc, bsfmov eax, [b]mov eax, [s_ns+eax]mov edx, [eax]mov dl, [decb+edx]mov [eax], edxmov [t], edxeq b, t, 0and b, b, bcand b, b, bsfmov eax, [b]mov eax, [s_bsf+eax]mov [eax], dword 0mov eax, [dp]mov edx, 0mov dl, [m+eax]mov [t], edxneq t, t, 0not b, bsand b, b, tand b, b, bcmov eax, [b]mov eax, [s_ns+eax]mov [eax], dword 1mov eax, [b]mov eax, [s_bsb+eax]mov [eax], dword 4


CompilerM/o/Vfuscate rot13objdump./rot13M/o/Vfuscator


We have two non-movs in our loopWe can fix this by setting up theexecution environment correctlymovs


int 0x80Solve with MMIOmmap stdin/stdout into theprocess memoryUse mov for I/Omovs


jmpSet the loop to be its ownSIGILL exception handlerSet the sa_nodefer flagReplace the jump with an illegal movReload the stack at each loopmovs


mov cs, axmov esp, [dsp]jmpSet the loop to be its ownSIGILL exception handlerSet the sa_nodefer flagReplace the jump with an illegal movReload the stack at each loopsa: dd looptimes 0x20 dd 0dd 0x40000000dd 0extern sigactionmov dword [esp], 4mov dword [esp+4], samov dword [esp+8], 0call sigaction


Please, no more BF…HL → BF → MOV demoSpeed?Anything! factor 20460 prime decss Lost M/o/VfuscatorM/o/Vfuscator


How would an experiencedreverse engineer approach this?


mov [dword 0x80a0451],edxmov eax,0x0mov ax,[0x80a0451]mov byte [eax+0x80e17bc],0x0mov al,[eax+0x80e17bc]mov [0x80a0451],almov eax,[0x80a0556]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]mov eax,[eax+edx]mov [0x80a044d],eaxmov eax,[0x80a044d]mov eax,[eax+0x80a054e]mov dword [eax],0x139mov eax,[0x80a044d]mov eax,[eax+0x80a055e]mov dword [eax],0x0mov eax,[0x80a044d]mov eax,[eax+0x80a056e]mov dword [eax],0x4mov eax,[0x80a0556]mov eax,[eax+0x80a05a6]mov [0x80a0451],eaxmov eax,0x0mov ax,[0x80a0546]mov byte [eax+0x80e17bc],0x0mov al,[eax+0x80e17bc]mov [0x80a044d],almov eax,[0x80a044d]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]mov eax,[eax+edx]mov [0x80a044d],eaxmov eax,[0x80a0566]mov eax,[eax+0x80a05a6]mov [0x80a0451],eaxmov eax,[0x80a044d]mov edx,[eax+0x80a058e]mov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a0438]mov edx,[dword 0x80a0516]mov eax,0x0mov al,[ebx+edx]mov al,[eax+0x80a09ba]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]


mov [dword 0x80a0451],edxmov eax,0x0mov ax,[0x80a0451]mov byte [eax+0x80e17bc],0x0mov al,[eax+0x80e17bc]mov [0x80a0451],almov eax,[0x80a0556]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]mov eax,[eax+edx]mov [0x80a044d],eaxmov eax,[0x80a044d]mov eax,[eax+0x80a054e]mov dword [eax],0x139mov eax,[0x80a044d]mov eax,[eax+0x80a055e]mov dword [eax],0x0mov eax,[0x80a044d]mov eax,[eax+0x80a056e]mov dword [eax],0x4mov eax,[0x80a0556]mov eax,[eax+0x80a05a6]mov [0x80a0451],eaxmov eax,0x0mov ax,[0x80a0546]mov byte [eax+0x80e17bc],0x0mov al,[eax+0x80e17bc]mov [0x80a044d],almov eax,[0x80a044d]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]mov eax,[eax+edx]mov [0x80a044d],eaxmov eax,[0x80a0566]mov eax,[eax+0x80a05a6]mov [0x80a0451],eaxmov eax,[0x80a044d]mov edx,[eax+0x80a058e]mov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a051e]mov eax,[ebx]mov edx,0x0mov dx,[eax+eax+0x80c0bba]mov [ebx],edxmov eax,[0x80a0556]mov ebx,[eax+0x80a0438]mov edx,[dword 0x80a0516]mov eax,0x0mov al,[ebx+edx]mov al,[eax+0x80a09ba]mov edx,[eax+0x80a058e]mov eax,[0x80a0451]


Opposite of other obfuscatorsEvery program becomes a line<strong>The</strong>re is no dead code Only code that sometimes works onfake data And sometimes real dataAnti RE


Anti RE


Anti RE: Permutations


Anti RE: Junk Instructions


Anti RE: Interleaving


Anti RE: Rearranging


(Not done yet)Repermute the entire programevery compileEspecially effective in the mov worldAnti RE


movmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmoveax,DWORD PTR [eax+0x805f111] moveax,DWORD PTR [eax+edx*1] movedx,DWORD PTR ds:0x809f77d movDWORD PTR [eax],0x4movBYTE PTR [eax+edx*1],clmoveax,DWORD PTR [eax+0x805f0f1] moveax,ds:0x805f109movDWORD PTR [eax],0x0movdl,BYTE PTR [eax+0x80ff850] movax,WORD PTR [edx+edx*1+0x805f75d] movDWORD PTR [eax],0x1moveax,ds:0x805f109moveax,ds:0x809f75dmovBYTE PTR [eax+0x80ff850],0x0 movdl,BYTE PTR [eax+0x809f850] movcl,BYTE PTR [eax+edx*1]moveax,ds:0x805f0d4moveax,ds:0x805f0d4movDWORD PTR ds:0x805f0d4,edx movecx,0x0movedx,0x0moveax,0x0moveax,ds:0x805f109movdl,BYTE PTR [eax+0x80ff850] moveax,DWORD PTR [eax+0x805f101] movBYTE PTR ds:0x80ff851,0x4 moveax,ds:0x805f0d0movax,ds:0x805f0d4edx,DWORD PTR [eax+0x805f131]BYTE PTR [eax+0x80ff850],0x0DWORD PTR [edx],eaxedx,DWORD PTR ds:0x809f77deax,DWORD PTR [eax+0x805f0c0]ds:0x805f0d4,eaxds:0x805f0d0,eaxedx,DWORD PTR ds:0x805f109edx,DWORD PTR ds:0x805f0d9eax,DWORD PTR [eax+0x805f<strong>14</strong>9]eax,ds:0x805f0d9eax,ds:0x805f0d0edx,0x0eax,ds:0x805f0d0ax,ds:0x805f0e9edx,DWORD PTR [eax+0x805f131]edx,0x0eax,ds:0x805f0d0edx,DWORD PTR [edx+0x809f785]DWORD PTR ds:0x805f0f9,0x0DWORD PTR ds:0x805f0d0,edxeax,0x0eax,0x0BYTE PTR ds:0x80ff850,0x4DWORD PTR ds:0x805f0d4,edxesp,DWORD PTR ds:0x809f84c


movmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovecx,0x0eax,DWORD PTR [eax+0x805f101]DWORD PTR [eax],0x0DWORD PTR [eax],0x1eax,ds:0x805f109DWORD PTR ds:0x805f0d4,edxeax,0x0eax,ds:0x805f109dl,BYTE PTR [eax+0x809f850]eax,0x0DWORD PTR [eax],0x4eax,DWORD PTR [eax+0x805f111]edx,DWORD PTR ds:0x805f0d9eax,ds:0x805f109BYTE PTR [eax+0x80ff850],0x0BYTE PTR ds:0x80ff850,0x4edx,DWORD PTR [eax+0x805f131]eax,DWORD PTR [eax+0x805f0c0]eax,ds:0x805f0d4DWORD PTR ds:0x805f0d0,edxeax,ds:0x805f0d9ax,ds:0x805f0d4ax,ds:0x805f0e9eax,DWORD PTR [eax+edx*1]edx,0x0eax,ds:0x805f0d0DWORD PTR [edx],eaxmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovdl,BYTE PTR [eax+0x80ff850]ax,WORD PTR [edx+edx*1+0x805f75d]dl,BYTE PTR [eax+0x80ff850]BYTE PTR [eax+0x80ff850],0x0ds:0x805f0d0,eaxBYTE PTR ds:0x80ff851,0x4edx,DWORD PTR ds:0x805f109DWORD PTR ds:0x805f0d4,edxedx,DWORD PTR ds:0x809f77deax,0x0DWORD PTR ds:0x805f0f9,0x0BYTE PTR [eax+edx*1],cleax,DWORD PTR [eax+0x805f0f1]eax,ds:0x805f0d4edx,0x0edx,DWORD PTR [eax+0x805f131]edx,DWORD PTR ds:0x809f77deax,DWORD PTR [eax+0x805f<strong>14</strong>9]ds:0x805f0d4,eaxedx,0x0cl,BYTE PTR [eax+edx*1]edx,DWORD PTR [edx+0x809f785]esp,DWORD PTR ds:0x809f84ceax,ds:0x805f0d0eax,ds:0x805f0d0eax,ds:0x805f0d0eax,ds:0x809f75d


movmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovmovDWORD PTR [eax],0x4moveax,ds:0x805f0d4movDWORD PTR ds:0x805f0d4,edx moveax,0x0moveax,DWORD PTR [eax+0x805f0f1] moveax,ds:0x805f109movDWORD PTR ds:0x805f0d0,edx moveax,ds:0x805f0d0movedx,DWORD PTR ds:0x805f0d9 moveax,ds:0x805f0d9moveax,0x0movesp,DWORD PTR ds:0x809f84c movecx,0x0moveax,DWORD PTR [eax+0x805f0c0] movedx,0x0movDWORD PTR [edx],eaxmovedx,0x0movedx,0x0movdl,BYTE PTR [eax+0x80ff850] movBYTE PTR [eax+0x80ff850],0x0 moveax,ds:0x809f75dmoveax,DWORD PTR [eax+edx*1] movedx,DWORD PTR ds:0x809f77d movax,WORD PTR [edx+edx*1+0x805f75d] moveax,0x0movax,ds:0x805f0d4moveax,ds:0x805f0d0moveax,DWORD PTR [eax+0x805f111]ds:0x805f0d0,eaxBYTE PTR ds:0x80ff850,0x4eax,ds:0x805f109eax,ds:0x805f0d0edx,DWORD PTR [eax+0x805f131]ax,ds:0x805f0e9BYTE PTR [eax+0x80ff850],0x0edx,DWORD PTR ds:0x809f77dBYTE PTR [eax+edx*1],clcl,BYTE PTR [eax+edx*1]eax,ds:0x805f0d4BYTE PTR ds:0x80ff851,0x4eax,DWORD PTR [eax+0x805f101]edx,DWORD PTR [eax+0x805f131]dl,BYTE PTR [eax+0x80ff850]edx,DWORD PTR [edx+0x809f785]ds:0x805f0d4,eaxDWORD PTR [eax],0x1eax,ds:0x805f109eax,DWORD PTR [eax+0x805f<strong>14</strong>9]dl,BYTE PTR [eax+0x809f850]edx,DWORD PTR ds:0x805f109DWORD PTR [eax],0x0DWORD PTR ds:0x805f0f9,0x0eax,ds:0x805f0d0DWORD PTR ds:0x805f0d4,edx


Anti REBut even without this…


Trivial mov substitutions: xor/xor add/sub and/or push/popAnti RE


ALU


%macro add32 4mov eax, 0mov ebx, 0mov ecx, 0mov edx, 0mov dword [%4], 0add8 %1+0, %2+0, %3+0, %4add8 %1+1, %2+1, %3+1, %4add8 %1+2, %2+2, %3+2, %4add8 %1+3, %2+3, %3+3, %4%endmacro


mov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov dword [dword 0x8049576],0x0mov al,[0x804956a]mov bl,[dword 0x804956e]mov cl,[dword 0x8049576]mov dl,[eax+ecx+0x8049168]mov al,[ebx+edx+0x8049168]mov [0x8049572],almov al,[ebx+edx+0x8049369]mov [0x8049576],almov al,[0x804956b]mov bl,[dword 0x804956f]mov cl,[dword 0x8049576]mov dl,[eax+ecx+0x8049168]mov al,[ebx+edx+0x8049168]mov [0x8049573],almov al,[ebx+edx+0x8049369]mov [0x8049576],almov al,[0x804956c]mov bl,[dword 0x8049570]mov cl,[dword 0x8049576]mov dl,[eax+ecx+0x8049168]mov al,[ebx+edx+0x8049168]mov [0x8049574],almov al,[ebx+edx+0x8049369]mov [0x8049576],almov al,[0x804956d]mov bl,[dword 0x8049571]mov cl,[dword 0x8049576]mov dl,[eax+ecx+0x8049168]mov al,[ebx+edx+0x8049168]mov [0x8049575],almov al,[ebx+edx+0x8049369]mov [0x8049576],almov eax,[0x8049572]


%macro sub32 4mov dword [%4], 1inv8 %3+0inv8 %3+1inv8 %3+2inv8 %3+3add8 %1+0, %2+0, %3+0, %4add8 %1+1, %2+1, %3+1, %4add8 %1+2, %2+2, %3+2, %4add8 %1+3, %2+3, %3+3, %4%endmacro


mov eax,0x0mov al,[0x80496fe]mov al,[eax+0x80491f8]mov [0x80496fe],almov eax,0x0mov al,[0x80496ff]mov al,[eax+0x80491f8]mov [0x80496ff],almov eax,0x0mov al,[0x8049700]mov al,[eax+0x80491f8]mov [0x8049700],almov eax,0x0mov al,[0x8049701]mov al,[eax+0x80491f8]mov [0x8049701],almov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x80496fa]mov bl,[dword 0x80496fe]mov cl,[dword 0x8049706]mov dl,[eax+ecx+0x80492f8]mov al,[ebx+edx+0x80492f8]mov [0x8049702],almov al,[ebx+edx+0x80494f9]mov [0x8049706],almov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x80496fb]mov bl,[dword 0x80496ff]mov cl,[dword 0x8049706]mov dl,[eax+ecx+0x80492f8]mov al,[ebx+edx+0x80492f8]mov [0x8049703],almov al,[ebx+edx+0x80494f9]mov [0x8049706],almov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x80496fc]mov bl,[dword 0x8049700]mov cl,[dword 0x8049706]mov dl,[eax+ecx+0x80492f8]mov al,[ebx+edx+0x80492f8]mov [0x8049704],almov al,[ebx+edx+0x80494f9]mov [0x8049706],almov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x80496fd]mov bl,[dword 0x8049701]mov cl,[dword 0x8049706]mov dl,[eax+ecx+0x80492f8]mov al,[ebx+edx+0x80492f8]mov [0x8049705],almov al,[ebx+edx+0x80494f9]mov [0x8049706],almov eax,[0x8049702]


%macro shl1_8_c 2mov eax, 0mov edx, 0mov al, [%1]mov dl, [%2]mov eax, [shl3_8_d+eax*4]mov eax, [shl1_8_c_d+edx*4+eax]mov [%1], almov [%2], ah%endmacro%macro shl32 3%rep %2shl1_8_c %1+0, %3shl1_8_c %1+1, %3shl1_8_c %1+2, %3shl1_8_c %1+3, %3%endrep%endmacro


mov eax,0x0mov edx,0x0mov al,[0x8049e04]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e04],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e05]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e05],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e06]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e06],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e07]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e07],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e04]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e04],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e05]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e05],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e06]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e06],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e07]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e07],almov [dword 0x8049e08],ahmov eax,[0x8049e04]


%macro shr1_8_c 2mov eax, 0mov edx, 0mov al, [%1]mov dl, [%2]mov eax, [shl3_8_d+eax*4]mov eax, [shr1_8_c_d+edx*4+eax]mov [%1], almov [%2], ah%endmacro%macro shr32 3%rep %2shr1_8_c %1+3, %3shr1_8_c %1+2, %3shr1_8_c %1+1, %3shr1_8_c %1+0, %3%endrep%endmacro


mov eax,0x0mov edx,0x0mov al,[0x8049e07]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e07],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e06]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e06],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e05]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e05],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e04]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e04],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e07]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e07],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e06]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e06],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e05]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e05],almov [dword 0x8049e08],ahmov eax,0x0mov edx,0x0mov al,[0x8049e04]mov dl,[dword 0x8049e08]mov eax,[eax*4+0x8049a04]mov eax,[eax+edx*4+0x8049204]mov [0x8049e04],almov [dword 0x8049e08],ahmov eax,[0x8049e04]


%macro mul8 4mov eax, 0mov ebx, 0mov ecx, 0mov edx, 0mov al, [%2]mov dl, [%3]mov ebx, [mm+4*eax]mov cl, [ebx+edx]mov ebx, [mc+4*eax]mov al, [ebx+edx]mov dl, [%4]mov ebx, 0mov bl, [su+ecx+edx]mov [%1], blmov bl, [sc+ecx+edx]mov bl, [su+ebx+eax]mov [%4], bl%endmacro%macro mul32 4mov dword [%4], 0mul8 z0+0, %2+0, %3+0, %4mul8 z0+1, %2+1, %3+0, %4mul8 z0+2, %2+2, %3+0, %4mul8 z0+3, %2+3, %3+0, %4mov dword [%4], 0mul8 z1+1, %2+0, %3+1, %4mul8 z1+2, %2+1, %3+1, %4mul8 z1+3, %2+2, %3+1, %4mov dword [%4], 0mul8 z2+2, %2+0, %3+2, %4mul8 z2+3, %2+1, %3+2, %4mov dword [%4], 0mul8 z3+3, %2+0, %3+3, %4mov dword [%4], 0add8n %1+0, %4, z0+0, %4add8n %1+1, %4, z0+1, z1+1, %4add8n %1+2, %4, z0+2, z1+2, z2+2, %4add8n %1+3, %4, z0+3, z1+3, z2+3, z3+3, %4%endmacro


mov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea10]mov dl,[dword 0x806ea<strong>14</strong>]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea00],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea11]mov dl,[dword 0x806ea<strong>14</strong>]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea01],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea12]mov dl,[dword 0x806ea<strong>14</strong>]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea02],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea13]mov dl,[dword 0x806ea<strong>14</strong>]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea03],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov dword [dword 0x806ea1c],0x0mov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea10]mov dl,[dword 0x806ea15]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea05],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea11]mov dl,[dword 0x806ea15]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea06],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea12]mov dl,[dword 0x806ea15]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea07],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov dword [dword 0x806ea1c],0x0mov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea10]mov dl,[dword 0x806ea16]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea0a],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea11]mov dl,[dword 0x806ea16]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea0b],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov dword [dword 0x806ea1c],0x0mov eax,0x0mov ebx,0x0mov ecx,0x0mov edx,0x0mov al,[0x806ea10]mov dl,[dword 0x806ea17]mov ebx,[eax*4+0x804e200]mov cl,[ebx+edx]mov ebx,[eax*4+0x805e600]mov al,[ebx+edx]mov dl,[dword 0x806ea1c]mov ebx,0x0mov bl,[ecx+edx+0x8049000]mov [dword 0x806ea0f],blmov bl,[ecx+edx+0x8049300]mov bl,[ebx+eax+0x8049000]mov [dword 0x806ea1c],blmov dword [dword 0x806ea1c],0x0mov eax,0x0mov ebx,0x0mov edx,0x0mov al,[0x806ea00]mov dl,[dword 0x806ea1c]mov eax,[eax*4+0x8049600]mov edx,[edx*4+0x8049600]mov edx,[eax+edx+0x804a200]mov [dword 0x806ea18],dlmov [dword 0x806ea1c],dhmov eax,0x0mov ebx,0x0mov edx,0x0mov al,[0x806ea01]mov dl,[dword 0x806ea05]mov eax,[eax*4+0x8049600]mov edx,[edx*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea1c]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov [dword 0x806ea19],dlmov [dword 0x806ea1c],dhmov eax,0x0mov ebx,0x0mov edx,0x0mov al,[0x806ea02]mov dl,[dword 0x806ea06]mov eax,[eax*4+0x8049600]mov edx,[edx*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea0a]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea1c]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov [dword 0x806ea1a],dlmov [dword 0x806ea1c],dhmov eax,0x0mov ebx,0x0mov edx,0x0mov al,[0x806ea03]mov dl,[dword 0x806ea07]mov eax,[eax*4+0x8049600]mov edx,[edx*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea0b]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea0f]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov eax,0x0mov al,[0x806ea1c]mov edx,[edx*4+0x8049600]mov eax,[eax*4+0x8049600]mov edx,[eax+edx+0x804a200]mov [dword 0x806ea1b],dlmov [dword 0x806ea1c],dhmov eax,[0x806ea18]


mov dword [q], 0mov dword [r], 0%assign bb 31%rep 32mov eax, [psr]mov eax, [eax]mov [dummy_r], eaxsub32 dummy_r, dummy_r, d, cmov eax, [psr]mov edx, [dummy_r]mov [eax], edxbit c, n, bbshl32 r, cmov dword [c], 0gte32 t, r, d, cmov eax, [t]mov edx, [sel_r+4*eax]mov [psr], edxmov edx, [sel_q+4*eax]mov [psq], edxmov eax, [psq]mov eax, [eax]mov [dummy_q], eaxset32 dummy_q, bbmov eax, [psq]mov edx, [dummy_q]mov [eax], edx%assign bb bb-1%endrepmov eax, [q]


Speed Jumping switches between dummy andreal data Jumping forwards … Jumping backwards … [-] REALLY slow Any beer left…?Limitations


I’ve gone this far…


lcc esi/edi Calling convention Emulated stack 32 bit ALU Simplified dummy selectors 102 IL instructions Not bad! gcc assistance movb 0x100(%%eax,%%edx,4), %%alM/o/Vfuscator 2.0


Nibbles! Source / Compile / Disas / PlayM/o/Vfuscator 2.0


First?M/o/Vfuscator 2.0


x86 MMU is Turing-complete (HT @julianbangert @sergeybratus)REcon 2016: A no instruction C compiler?M/o/Vfuscator 3.0?


Maybe not a legitimate anti-RE solutionBut incredibly funWrap up


M/o/Vfuscator 1.0 on github github.com/xoreaxeaxeax/<strong>movfuscator</strong>M/o/Vfuscator 2.0 as soon as cleaned upCrackmeFeedback?<strong>domas</strong> @xoreaxeaxeax xoreaxeaxeax@gmail.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!