|
|
|
|
|
Command |
Comments |
|
|
.JGE SHORT 0A729D36 |
; stage1 |
|
|
./MOV EDX,DWORD PTR SS:[LOCAL.2] |
; set EDX to our 1st stage half decoded buffer |
|
|
.|MOV ECX,DWORD PTR SS:[LOCAL.4] |
; set ECX to our current count/offset |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.3] |
; set EAX to our base64 encoded payload |
|
|
.|MOVSX EAX,BYTE PTR DS:[EAX] |
; set EAX to the current value in our base64 payload |
|
|
.|MOV AL,BYTE PTR DS:[EAX+0A841934] |
; set EAX/AL to a hardcoded offset of its value table is at 0a841934 |
|
|
.|MOV BYTE PTR DS:[ECX+EDX],AL |
; ECX = Offset, EDX = start of our half-decoded buffer, write our current byte there |
|
|
.|INC DWORD PTR SS:[LOCAL.4] |
; increment our offset/count |
|
|
.|INC DWORD PTR SS:[LOCAL.3] |
; increment our base64 buffer to next value |
|
|
.|MOV EDX,DWORD PTR SS:[LOCAL.4] |
; set EDX to our counter |
|
|
.|CMP EDX,DWORD PTR SS:[ARG.2] |
; compare EDX (counter) to our total size |
|
|
.\JL SHORT 0A729D13 |
; jump back if we have not finished half decoding our input value |
|
|
.MOV ECX,DWORD PTR SS:[ARG.3] |
; Looks like this will point at our decoded buffer |
|
|
.MOV DWORD PTR SS:[LOCAL.5],ECX |
; set Arg5 to our decoded destination |
|
|
.MOV EAX,DWORD PTR SS:[LOCAL.2] |
; set EAX to our half-decoded buffer |
|
|
.MOV DWORD PTR SS:[LOCAL.3],EAX |
; set arg3 to point at our half-decoded buffer |
|
|
.MOV EDX,DWORD PTR SS:[ARG.4] |
; ???? 1500 decimal |
|
|
.XOR ECX,ECX |
; clear ECX |
|
|
.MOV DWORD PTR DS:[EDX],ECX |
; clear out arg4 value |
|
|
.XOR EAX,EAX |
; clear out EAX |
|
|
.MOV DWORD PTR SS:[LOCAL.6],EAX |
; clear out local.6 |
|
|
.JMP SHORT 0A729DAE |
; JUMP |
|
|
|
|
|
|
./MOV EDX,DWORD PTR SS:[LOCAL.3] |
; move our current half-decoded dword position into EDX |
|
|
.|MOV CL,BYTE PTR DS:[EDX] |
; move our current byte into ECX (CL) (dword[0]) |
|
|
.|SHL ECX,2 |
; shift left 2 dword[0] |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.3] |
; move our current dword position into EAX |
|
|
.|MOVSX EDX,BYTE PTR DS:[EAX+1] |
; move our current dword position + 1 (dword[1]) into EDX |
|
|
.|SAR EDX,4 |
; shift right 4 dword[1] |
|
|
.|ADD CL,DL |
; add (shift left 2 dword[0]) + (shift right 4 dword[1]) |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.5] |
; set EAX to our current decoded buffer position |
|
|
.|MOV BYTE PTR DS:[EAX],CL |
; write our decoded (dword[0]) value to or decoded buffer |
|
|
.|INC DWORD PTR SS:[LOCAL.5] |
; increment our position in the decoded buffer |
|
|
.|MOV EDX,DWORD PTR SS:[LOCAL.3] |
; set EDX to our current dword position |
|
|
.|MOV CL,BYTE PTR DS:[EDX+1] |
; set ECX to dword[1] |
|
|
.|SHL ECX,4 |
; left shift 4 dword[1] |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.3] |
; set EAX to our current dword position |
|
|
.|MOVSX EDX,BYTE PTR DS:[EAX+2] |
; set EDX to dword[2] |
|
|
.|SAR EDX,2 |
; shift right 2 dword[2] |
|
|
.|ADD CL,DL |
; add (left shift 4 dword[1]) + (right shift 2 dword[2]) |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.5] |
; set EAX to our next spot in the decoded buffer |
|
|
.|MOV BYTE PTR DS:[EAX],CL |
; write our decoded value into our decoded buffer |
|
|
.|INC DWORD PTR SS:[LOCAL.5] |
; move to the next spot in our decoded buffer |
|
|
.|MOV EDX,DWORD PTR SS:[LOCAL.3] |
; set EDX to our current half-decoded dword |
|
|
.|MOV CL,BYTE PTR DS:[EDX+2] |
; set ECX dword[2] |
|
|
.|SHL ECX,6 |
; shift left 6 dword[2] |
|
|
.|MOV EAX,DWORD PTR SS:[LOCAL.3] |
; set EAX to our current half-decoded dword |
|
|
.|ADD CL,BYTE PTR DS:[EAX+3] |
; add dword[2] + dword[3] |
|
|
.|MOV EDX,DWORD PTR SS:[LOCAL.5] |
; set EDX to point at our next spot in our decoded buffer |
|
|
.|MOV BYTE PTR DS:[EDX],CL |
; write our decoded byte to our decoded buffer |
|
|
.|INC DWORD PTR SS:[LOCAL.5] |
; move to the next spot in our decoded buffer |
|
|
.|ADD DWORD PTR SS:[LOCAL.3],4 |
; increment our encoded buffer to point at our next dword |
|
|
.|MOV ECX,DWORD PTR SS:[ARG.4] |
; set ECX to our current offset? |
|
|
.|ADD DWORD PTR DS:[ECX],3 |
; add 3 to our current offset? |
|
|
.|ADD DWORD PTR SS:[LOCAL.6],4 |
; add 4 to our byte counter?? |
|
|
.|MOV EAX,DWORD PTR SS:[ARG.2] |
; move total size into EAX |
|
|
.|ADD EAX,-4 |
; subtract 4 from total size |
|
|
.|CMP EAX,DWORD PTR SS:[LOCAL.6] |
; compare our total bytes to read bytes |
|
|
.\JG SHORT 0A729D50 |
; jump back if we are not done |
|
|
|
|
|
|
.MOV EDX,DWORD PTR SS:[LOCAL.3] |
; set EDX to our last DWORD of encoded buffer |
|
|
.MOVSX ECX,BYTE PTR DS:[EDX+3] |
; set ECX to dword[3] last byte of our half-decoded dword (dword + 3) |
|
|
.INC ECX |
; increment the value of dword[3] |
|
|
.JE SHORT 0A729E1E |
|
|
|
.MOV EAX,DWORD PTR SS:[LOCAL.3] |
; set EAX to our current half-decoded dword |
|
|
.MOV DL,BYTE PTR DS:[EAX] |
; set EDX (DL) to dword[0] |
|
|
.SHL EDX,2 |
; shift left 2 dword[0] |
|
|
.MOV ECX,DWORD PTR SS:[LOCAL.3] |
; set ECX to our current encoded dword position |
|
|
.MOVSX EAX,BYTE PTR DS:[ECX+1] |
; set EAX to dword[1] |
|
|
.SAR EAX,4 |
; shift right 4 dword[1] |
|
|
.ADD DL,AL |
; add (shifted left 2 dword[0]) + (shifted right 4 dword[1]) |
|
|
.MOV ECX,DWORD PTR SS:[LOCAL.5] |
; set ECX to point at our next spot in our decoded buffer |
|
|
.MOV BYTE PTR DS:[ECX],DL |
; write our decoded value (EDX/DL) to our decoded buffer |
|
|
.INC DWORD PTR SS:[LOCAL.5] |
; move to the next spot in our decoded buffer |
|
|
.MOV EDX,DWORD PTR SS:[LOCAL.3] |
; set EDX to point at our dword |
|
|
.MOV AL,BYTE PTR DS:[EDX+1] |
; set EAX/AL to dword[1] |
|
|
.SHL EAX,4 |
; shift left 4 dword[1] |
|
|
.MOV EDX,DWORD PTR SS:[LOCAL.3] |
; set EDX to our current dword |
|
|
.MOVSX ECX,BYTE PTR DS:[EDX+2] |
; set ECX to dword[2] |
|
|
.SAR ECX,2 |
; shift right 2 dword[2] |
|
|
.ADD AL,CL |
; add (shifted left 4 dword[1]) + (shifted right 2 dword[2]) |
|
|
.MOV EDX,DWORD PTR SS:[LOCAL.5] |
; set EDX to point at our current spot in our decoded buffer |
|
|
.MOV BYTE PTR DS:[EDX],AL |
; write our decoded value to the decoded buffer |
|
|
.INC DWORD PTR SS:[LOCAL.5] |
; move to the next spot in our decoded buffer |
|
|
.MOV EAX,DWORD PTR SS:[LOCAL.3] |
; set EAX to point at our current dword |
|
|
.MOV CL,BYTE PTR DS:[EAX+2] |
; set ECX/CL to dword[2] |
|
|
.SHL ECX,6 |
; shift left 6 dword[2] |
|
|
.MOV EAX,DWORD PTR SS:[LOCAL.3] |
; point EAX at our current dword |
|
|
.ADD CL,BYTE PTR DS:[EAX+3] |
; add dword[3] + (shifted left 6 dword[2]) |
|
|
.MOV EDX,DWORD PTR SS:[LOCAL.5] |
; point EDX at our current decoded buffer |
|
|
.MOV BYTE PTR DS:[EDX],CL |
; write our decoded value to the decoded buffer |
|
|
.INC DWORD PTR SS:[LOCAL.5] |
; increment our deocded buffer |
|
|
.MOV ECX,DWORD PTR SS:[ARG.4] |
; set ECX to our current offset? |
|
|
.ADD DWORD PTR DS:[ECX],3 |
; add 4 for our current byte counter? |
|
|
.JMP 0A729EA6 |
; jump |