Imports System.IO
Imports System.Text
Module Main
Private Const AppVer As String = "0.5b"
Private ReadOnly OPS() As String = {
"NOP", _
"ASSIGN", _
"ADD", _
"SUB", _
"MUL", _
"DIV", _
"MOD", _
"TO_NUMBER", _
"CSIGN", _
"NOT", _
"INC", _
"DEC", _
"POST_INC", _
"POST_DEC", _
"CMPEQ", _
"CMPNEQ", _
"CMPSEQ", _
"CMPSNEQ", _
"CMPLT", _
"CMPLE", _
"CMPGE", _
"CMPGT", _
"INSTANCEOF", _
"IN", _
"TYPEOF", _
"BIT_AND", _
"BIT_XOR", _
"BIT_OR", _
"BIT_NOT", _
"LSHIFT", _
"S_RSHIFT", _
"U_RSHIFT", _
"COPY", _
"SWAP", _
"REMOVE", _
"PUSH_UNDEFINED", _
"PUSH_NULL", _
"PUSH_BOOL", _
"PUSH_INT", _
"PUSH_FLOAT", _
"PUSH_STRING", _
"PUSH_OBJECT", _
"PUSH_FUNC", _
"PUSH_ARRAY", _
"PUSH_THIS", _
"PUSH_LOCAL", _
"PUSH_GLOBAL", _
"GETATTR", _
"GETATTR_KEEPOBJ", _
"SETATTR", _
"DELATTR", _
"APPEND_ATTR", _
"GETITEM", _
"GETITEM_KEEPOBJ", _
"SETITEM", _
"DELITEM", _
"APPEND_ITEM", _
"JUMP", _
"JUMPT", _
"JUMPF", _
"CALL_FUNC", _
"CALL_METHOD", _
"CALL_CONSTRUCTOR", _
"RET", _
"Throw", _
"TRYBLK_IN", _
"TRYBLK_OUT", _
"CATCH_FINALLYBLK_IN", _
"CATCH_FINALLYBLK_OUT", _
"HALT", _
"DEBUG_FILE", _
"DEBUG_LINE", _
"GETITEM_KEEPOBJNAME", _
"PUSH_VECTOR", _
"GET_VECTOR_ELEMENT", _
"GET_VECTOR_ELEMENT_KEEPVECTOR", _
"ASSGN_VECTOR_ELEMENT", _
"SETATTR_VECTOR_ELEMENT", _
"SETITEM_VECTOR_ELEMENT"}
Private ReadOnly _MAGIC() As Byte = New Byte() {86, 83, 77, 88}
Private VarLevel As Integer = 0
Private Variables As New List(Of Var)
Private CrntFileStream As FileStream
Private TYPE As String
Private VERSION As String
Private HEADER As String
Private Decomped As Boolean
Private ARG_SCRPJS As Boolean
Private ARG_HDRTXT As Boolean
Private ARG_OPSTXT As Boolean
Private ARG_STRTXT As Boolean
Private ARG_ATTTXT As Boolean
Private ARG_GLBTXT As Boolean
Private ARG_HDRBIN As Boolean
Private ARG_OPSBIN As Boolean
Private ARG_STRBIN As Boolean
Private ARG_ATTBIN As Boolean
Private ARG_GLBBIN As Boolean
Private ARG_SOURCE As String
Private ARG_DESTIN As String
Private ARG_OUTHDR As Boolean
Private ARG_HLTOUT As Boolean
Private OPCODESInfo(1) As Integer
Private STRINGSInfo(1) As Integer
Private ATTRIBSInfo(1) As Integer
Private GLOBALSInfo(1) As Integer
Private HEADERByte(51) As Byte
Private OPCODESByte() As Byte
Private STRINGSByte() As Byte
Private ATTRIBSByte() As Byte
Private GLOBALSByte() As Byte
Private OPCODES() As OPcode
Private STRINGS() As String
Private ATTRIBS() As String
Private GLOBALS() As String
Private Structure Var
Dim _Value As String
Dim _Lvl As Integer
Public ReadOnly Property Value() As String
Get
Return _Value
End Get
End Property
Public ReadOnly Property Level() As String
Get
Return _Lvl
End Get
End Property
Public Sub New(ByVal Name As String, ByVal Lvl As Integer)
_Value = Name
_Lvl = Lvl
End Sub
End Structure
Private Structure OPcode
Dim ACTIVE As Boolean
Dim OPNBR As Integer
Dim OPNAME As String
Dim ARG As Byte
Dim UNK As Byte
Dim VAR As Byte
Dim VAL() As Byte
Dim CODE As String
Dim PRECODE As String
Dim PROCODE As String
Dim DONE As Boolean
Public Sub New(ByVal Bytes() As Byte)
ACTIVE = True
DONE = False
OPNBR = Bytes2Int({0, 0, 0, Bytes(0)})
OPNAME = OPS(OPNBR)
ARG = Bytes(1)
UNK = Bytes(2)
VAR = Bytes(3)
VAL = {Bytes(4), Bytes(5), Bytes(6), Bytes(7)}
PRECODE = ""
CODE = ""
PROCODE = ""
End Sub
Public Sub Resolve(ByVal Line As Integer)
Select Case OPNBR
Case 0 \'NOP
Case 1 \'ASSIGN
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
If AddVariable(text(1)) Then
CODE = text(1) & " = " & text(0)
Else
CODE = "var " & text(1) & " = " & text(0)
End If
\'DONE = True
Case 2 \'ADD
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " + " & text(0)
\'DONE = True
Case 3 \'SUB
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " - " & text(0)
\'DONE = True
Case 4 \'MUL
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " * " & text(0)
\'DONE = True
Case 5 \'DIV
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " / " & text(0)
\'DONE = True
Case 6 \'MOD
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " % " & text(0)
\'DONE = True
Case 7 \'TO_NUMBER
Case 8 \'CSIGN
For num7 As Integer = Line - 1 To 0 Step -1
If OPCODES(num7).ACTIVE Then
CODE = "-" + OPCODES(num7).CODE
OPCODES(num7).ACTIVE = False
Exit For
End If
Next
\'DONE = True
Case 9 \'NOT
Case 10 \'INC
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
OPCODES(i).ACTIVE = False
CODE = "++" & OPCODES(i).CODE
Exit For
End If
Next
Case 11 \'DEC
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
OPCODES(i).ACTIVE = False
CODE = "--" & OPCODES(i).CODE
Exit For
End If
Next
Case 12 \'POST_INC
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
OPCODES(i).ACTIVE = False
CODE = OPCODES(i).CODE & "++"
Exit For
End If
Next
Case 13 \'POST_DEC
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
OPCODES(i).ACTIVE = False
CODE = OPCODES(i).CODE & "--"
Exit For
End If
Next
Case 14 \'CMPEQ
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " == " & text(0)
\'DONE = True
Case 15 \'CMPNEQ
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " != " & text(0)
\'DONE = True
Case 16 \'CMPSEQ
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " === " & text(0)
\'DONE = True
Case 17 \'CMPSNEQ
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " !== " & text(0)
\'DONE = True
Case 18 \'CMPLT
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " < " & text(0)
\'DONE = True
Case 19 \'CMPLE
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " <= " & text(0)
\'DONE = True
Case 20 \'CMPGE
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " >= " & text(0)
\'DONE = True
Case 21 \'CMPGT
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & " > " & text(0)
\'DONE = True
Case 22 \'INSTANCEOF
Case 23 \'IN
Case 24 \'TYPEOF
Case 25 \'BIT_AND
Case 26 \'BIT_XOR
Case 27 \'BIT_OR
Case 28 \'BIT_NOT
Case 29 \'LSHIFT
Case 30 \'S_RSHIFT
Case 31 \'U_RSHIFT
Case 32 \'COPY
Case 33 \'SWAP
Case 34 \'REMOVE
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
OPCODES(i).ACTIVE = False
CODE = OPCODES(i).CODE & ";"
Exit For
End If
Next
DONE = True
ACTIVE = False
Case 35 \'PUSH_UNDEFINED
Dim num30 As Integer = Line - 1
While num30 >= 0 AndAlso OPCODES(num30).OPNBR <> 42
If OPCODES(num30).OPNBR = 34 Then
\'OPCODES(num30).ACTIVE = False
CODE = OPCODES(num30).CODE + vbCrLf + CODE
End If
num30 -= 1
End While
CODE = CODE.Trim
\'DONE = True
Case 36 \'PUSH_NULL
CODE = "null"
\'DONE = True
Case 37 \'PUSH_BOOL
If VAL(3) = 0 Then CODE = "false" Else CODE = "true"
\'DONE = True
Case 38 \'PUSH_INT
CODE = Bytes2Int(VAL)
\'DONE = True
Case 39 \'PUSH_FLOAT
CODE = Bytes2Sng(VAL).ToString("0.0###########").Replace(",", ".")
\'DONE = True
Case 40 \'PUSH_STRING
CODE = """" & STRINGS(Bytes2Int(VAL)) & """"
\'DONE = True
Case 41 \'PUSH_OBJECT
Case 42 \'PUSH_FUNC
CODE = "function(){}"
ACTIVE = False
Case 43 \'PUSH_ARRAY
CODE = "[]"
Case 44 \'PUSH_THIS
Case 45 \'PUSH_LOCAL
CODE = "localVar_" & Bytes2Int(VAL)
\'DONE = True
Case 46 \'PUSH_GLOBAL
CODE = GLOBALS(Bytes2Int(VAL))
\'DONE = True
Case 47 \'GETATTR
For num32 As Integer = Line - 1 To 0 Step -1
If OPCODES(num32).ACTIVE Then
CODE = OPCODES(num32).CODE + "." + ATTRIBS(Bytes2Int(VAL))
OPCODES(num32).ACTIVE = False
Exit For
End If
Next
ACTIVE = True
\'DONE = True
Case 48 \'GETATTR_KEEPOBJ
For num33 As Integer = Line - 1 To 0 Step -1
If OPCODES(num33).ACTIVE Then
CODE = OPCODES(num33).CODE + "." + ATTRIBS(Bytes2Int(VAL))
Exit For
End If
Next
\'DONE = True
Case 49 \'SETATTR
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) & "." & ATTRIBS(Bytes2Int(VAL)) & " = " & text(0)
\'DONE = True
Case 50 \'DELATTR
Case 51 \'APPEND_ATTR
Case 52 \'GETITEM
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
OPCODES(i).ACTIVE = False
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) + "[" + text(0) + "]"
\'DONE = True
Case 53 \'GETITEM_KEEPOBJ
Dim num As Integer = 0
Dim text(1) As String
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE Then
text(num) = OPCODES(i).CODE
num += 1
If num = 2 Then Exit For
End If
Next
CODE = text(1) + "[" + text(0) + "]"
\'DONE = True
Case 54 \'SETITEM \'Cnp
Dim num38 As Integer = 0
Dim text31 As String = ""
Dim text32 As String = ""
Dim text33 As String = ""
For num39 As Integer = Line - 1 To 0 Step -1
If OPCODES(num39).ACTIVE Then
num38 += 1
If num38 = 1 Then
text31 = OPCODES(num39).CODE
OPCODES(num39).ACTIVE = False
Else
If num38 = 2 Then
text32 = OPCODES(num39).CODE
OPCODES(num39).ACTIVE = False
Else
If num38 = 3 Then
text33 = OPCODES(num39).CODE
OPCODES(num39).ACTIVE = False
Exit For
End If
End If
End If
End If
Next
Me.CODE = text33 & "[" & text32 & "] = " & text31
\'Me.DONE = True
Case 55 \'DELITEM
Case 56 \'APPEND_ITEM
Dim elementIndex As Integer = Line - 1
Dim element As String = OPCODES(elementIndex).CODE
OPCODES(elementIndex).ACTIVE = False
For i = Line - 1 To 0 Step -1
If OPCODES(i).ACTIVE AndAlso OPCODES(i).OPNBR = 43 Then
Dim openArray As String = OPCODES(i).CODE.Substring(0, OPCODES(i).CODE.Length - 1)
If openArray.EndsWith("[") Then
openArray &= element & "]"
Else
openArray &= ", " & element & "]"
End If
CODE = openArray
OPCODES(i).CODE = openArray
Exit For
End If
Next
ACTIVE = False
Case 57 \'JUMP \'Cnp
Me.CODE = "GoTo 0x" + Bytes2Int(VAL).ToString("X4")
Me.ACTIVE = False
Me.DONE = True
Case 58 \'JUMPT \'Cnp
For num42 As Integer = Line - 1 To 0 Step -1
If OPCODES(num42).ACTIVE Then
If OPCODES(num42).CODE.StartsWith("(") _
AndAlso OPCODES(num42).CODE.EndsWith(")") Then
Me.CODE = "if (!" + OPCODES(num42).CODE + ")" & vbCrLf & "{"
Else
Me.CODE = "if (!(" + OPCODES(num42).CODE + "))" & vbCrLf & "{"
End If
OPCODES(num42).ACTIVE = False
Exit For
End If
Next
Me.DONE = True
Case 59 \'JUMPF \'Cnp
For num41 As Integer = Line - 1 To 0 Step -1
If OPCODES(num41).ACTIVE Then
Dim closing As Integer = Bytes2Int(VAL)
If OPCODES(num41).CODE.StartsWith("(") AndAlso OPCODES(num41).CODE.EndsWith(")") Then
CODE = "if " + OPCODES(num41).CODE & vbCrLf & "{"
OPCODES(num41).ACTIVE = False
For i = closing To Line Step -1
If OPCODES(i).ACTIVE AndAlso OPCODES(i).OPNBR = 34 Then
Dim closing2 As Integer = Bytes2Int(OPCODES(closing - 1).VAL)
If OPCODES(closing - 1).OPNBR = 57 Then
OPCODES(i).PROCODE = OPCODES(i).PROCODE & vbCrLf & "} else {"
For y = closing2 To Line Step -1
If OPCODES(y).ACTIVE AndAlso OPCODES(y).OPNBR = 34 Then
OPCODES(y).PROCODE = OPCODES(y).PROCODE & vbCrLf & "}"
Exit For
End If
Next
Exit For
Else
OPCODES(i).PROCODE = OPCODES(i).PROCODE & vbCrLf & "}"
Exit For
End If
End If
Next
Exit For
Else
CODE = "if (" + OPCODES(num41).CODE + ")" & vbCrLf & "{"
OPCODES(num41).ACTIVE = False
For i = closing To Line Step -1
If OPCODES(i).ACTIVE AndAlso OPCODES(i).OPNBR = 34 Then
Dim closing2 As Integer = Bytes2Int(OPCODES(closing - 1).VAL)
If OPCODES(closing - 1).OPNBR = 57 Then
OPCODES(i).PROCODE = OPCODES(i).PROCODE & vbCrLf & "} else {"
For y = closing2 To Line Step -1
If OPCODES(y).ACTIVE AndAlso OPCODES(y).OPNBR = 34 Then
OPCODES(y).PROCODE = OPCODES(y).PROCODE & vbCrLf & "}"
Exit For
End If
Next
Exit For
Else
OPCODES(i).PROCODE = OPCODES(i).PROCODE & vbCrLf & "}"
Exit For
End If
End If
Next
Exit For
End If
End If
Next
VarLevel += 1
Me.DONE = True
Case 60 \'CALL_FUNC \'Cnp
For num43 As Integer = Line - 1 To 0 Step -1
If OPCODES(num43).ACTIVE Then
Me.CODE = OPCODES(num43).CODE + "()"
OPCODES(num43).ACTIVE = False
Exit For
End If
Next
Me.DONE = True
Case 61 \'CALL_METHOD \'Cnp
Dim array As String() = New String(Bytes2Int(VAL)) {}
Dim num44 As Integer = array.Length - 1
For num45 As Integer = Line - 1 To 0 Step -1
If OPCODES(num45).ACTIVE Then
array(num44) = OPCODES(num45).CODE
OPCODES(num45).ACTIVE = False
num44 -= 1
If num44 = -1 Then
Exit For
End If
End If
Next
Select Case array.Length
Case 1
Me.CODE = array(0) + "()"
Case 2
Me.CODE = array(0) + "(" + array(1) + ")"
Me.DONE = True
Case Else
Me.CODE = array(0) + "(" + array(1)
Dim array2 As String() = array
Dim arg_19FA_0 As String() = array2
Dim num46 As Integer = array.Length - 1
arg_19FA_0(num46) = array2(num46) + ")"
Dim arg_1A04_0 As Integer = 2
Dim num47 As Integer = array.Length - 1
For num48 As Integer = arg_1A04_0 To num47
Me.CODE = Me.CODE + ", " + array(num48)
Next
End Select
\'DONE = True
Case 62 \'CALL_CONSTRUCTOR \'Cnp
Dim array3 As String() = New String(Bytes2Int(VAL)) {}
Dim num49 As Integer = array3.Length - 1
For num50 As Integer = Line - 1 To 0 Step -1
If OPCODES(num50).ACTIVE Then
array3(num49) = OPCODES(num50).CODE
OPCODES(num50).ACTIVE = False
num49 -= 1
If num49 = -1 Then
Exit For
End If
End If
Next
Select Case array3.Length
Case 1
Me.CODE = "new " + array3(0) + "()"
Case 2
Me.CODE = "new " & array3(0) & "(" & array3(1) & ")"
\'Me.DONE = True
Case Else
Me.CODE = "new " + array3(0) + "(" + array3(1)
Dim array2 As String() = array3
Dim arg_1B70_0 As String() = array2
Dim num46 As Integer = array3.Length - 1
arg_1B70_0(num46) = array2(num46) + ")"
Dim arg_1B7A_0 As Integer = 2
Dim num51 As Integer = array3.Length - 1
For num52 As Integer = arg_1B7A_0 To num51
Me.CODE = Me.CODE + ", " + array3(num52)
Next
End Select
\'CODE = CODE.Replace(";", ";" & vbCrLf)
\'Me.DONE = True
Case 63 \'RET
For num54 As Integer = Line - 1 To 0 Step -1
If OPCODES(num54).OPNBR = 42 Then
Exit For
Else
OPCODES(num54).ACTIVE = False
OPCODES(num54).DONE = False
End If
Next
CODE = "function()" & vbCrLf & "{" & vbCrLf & OPCODES(Line - 1).CODE & vbCrLf & "}"
\'Me.DONE = True
Case 64 \'THROW
Case 65 \'TRYBLK_IN \'Cnp
Me.CODE = "try {"
Me.DONE = True
Case 66 \'TRYBLK_OUT \'Cnp
Me.CODE = "}"
Me.DONE = True
Case 67 \'CATCH_FINALLYBLK_IN \'Cnp
Me.CODE = "catch(exception) {"
Me.DONE = True
Case 68 \'CATCH_FINALLYBLK_OUT \'Cnp
Me.CODE = "}"
Me.DONE = True
Case 69 \'HALT
CODE = "/* Decompiled by JSXviewer " & AppVer & " */"
DONE = True
Case 70 \'DEBUG_FILE
Case 71 \'DEBUG_LINE
Case 72 \'GETITEM_KEEPOBJNAME
Case 73 \'PUSH_VECTOR \'Cnp
Dim num55 As Integer = 0
Dim text34 As String = ""
Dim Value = Bytes2Int(VAL)
Me.CODE = "<"
For num56 As Integer = Line - 1 To 0 Step -1
If OPCODES(num56).ACTIVE Then
num55 += 1
If num55 = 1 Then
text34 = OPCODES(num56).CODE
Else
text34 = OPCODES(num56).CODE + ", " + text34
End If
OPCODES(num56).ACTIVE = False
If CSng(num55) >= Value Then
Exit For
End If
End If
Next
Me.CODE = Me.CODE + text34.Trim(",") + ">"
\'Me.DONE = True
Case 74 \'GET_VECTOR_ELEMENT
For num57 As Integer = Line - 1 To 0 Step -1
If OPCODES(num57).ACTIVE Then
Me.CODE = OPCODES(num57).CODE & "->" & Bytes2Int(VAL).ToString
OPCODES(num57).ACTIVE = False
Exit For
End If
Next
\'Me.DONE = True
Case 75 \'GET_VECTOR_ELEMENT_KEEPVECTOR
For num57 As Integer = Line - 1 To 0 Step -1
If OPCODES(num57).ACTIVE Then
Me.CODE = OPCODES(num57).CODE & "->" & Bytes2Int(VAL).ToString
\'OPCODES(num57).ACTIVE = False
Exit For
End If
Next
\'Me.DONE = True
Case 76 \'ASSGN_VECTOR_ELEMENT
Case 77 \'SETATTR_VECTOR_ELEMENT
Dim top As String = OPCODES(Line - 2).CODE
OPCODES(Line - 2).ACTIVE = False
Dim bottom As String = OPCODES(Line - 1).CODE
OPCODES(Line - 1).ACTIVE = False
Dim index As Integer = Bytes2Int(VAL)
CODE = top & "." & ATTRIBS(index) & "->" & VAR & " = " & bottom
Case 78 \'SETITEM_VECTOR_ELEMENT \'Cnp
Dim num58 As Integer = 0
Dim text35 As String = ""
Dim text36 As String = ""
For num59 As Integer = Line - 1 To 0 Step -1
num58 += 1
If num58 = 1 Then
text35 = OPCODES(num59).CODE
OPCODES(num59).ACTIVE = False
Else
If num58 = 2 Then
text36 = OPCODES(num59).CODE
OPCODES(num59).ACTIVE = False
Exit For
End If
End If
Next
Me.CODE = text36 & "." & ATTRIBS(Bytes2Int(VAL)) & "->" & VAR & " = " & text35
\'Me.DONE = True
End Select
Dim cnt As Integer = 0
For Each ch As Char In PROCODE
If ch = "}" Then cnt += 1
Next
If cnt > 0 Then
For i = 1 To cnt
RemoveLevel()
Next
End If
End Sub
End Structure
Public Function AddVariable(ByVal Name) As Boolean
If Variables.Count > 0 Then
For i = 0 To Variables.Count - 1
If Variables(i).Value = Name Then Return True
Next
End If
Variables.Add(New Var(Name, VarLevel))
Return False
End Function
Public Sub RemoveLevel()
If Variables.Count > 0 Then
For i = Variables.Count - 1 To 0 Step -1
If Variables(i).Level = VarLevel Then Variables.RemoveAt(i)
Next
End If
If VarLevel > 0 Then VarLevel -= 1
End Sub
Sub Main()
Console.Clear()
Console.WriteLine(vbCrLf & " JSXviewer " & AppVer & " by TizzyT with help from Sandungas")
\'Dim Args() As String = {"2bc", "C:\\Users\\Thien\\Desktop\\local_vars\\local_vars.jsx"}
Dim Args() As String = My.Application.CommandLineArgs.ToArray
If Args.Length > 1 Then
For Each arg As Char In Args(0)
Select Case arg.ToString.ToLower
Case "0" : ARG_SCRPJS = True
Case "1" : ARG_HDRTXT = True
Case "2" : ARG_OPSTXT = True
Case "3" : ARG_STRTXT = True
Case "4" : ARG_ATTTXT = True
Case "5" : ARG_GLBTXT = True
Case "6" : ARG_HDRBIN = True
Case "7" : ARG_OPSBIN = True
Case "8" : ARG_STRBIN = True
Case "9" : ARG_ATTBIN = True
Case "a" : ARG_GLBBIN = True
Case "b" : ARG_OUTHDR = True
Case "c" : ARG_HLTOUT = True
End Select
Next
If Args(1).Contains(":") Then ARG_SOURCE = Args(1) _
Else ARG_SOURCE = Environment.CurrentDirectory & "\\" & Args(1)
If Args.Length = 3 Then
If Args(2).Contains(":") Then ARG_DESTIN = Args(2).Trim("\\") & "\\" _
Else ARG_DESTIN = Environment.CurrentDirectory & "\\" & Args(2).Trim("\\") & "\\"
ElseIf Args.Length = 2 Then
ARG_DESTIN = Path.GetDirectoryName(ARG_SOURCE) & "\\"
End If
Select Case ProcessJSX(Args(1))
Case -1 : Console.WriteLine(vbCrLf & " Unknown Error")
Case 0
If ARG_OUTHDR OrElse ARG_HDRTXT Then
HEADER = vbCrLf & " TYPE: " & TYPE & vbCrLf & _
" VRSN: " & VERSION & vbCrLf & _
" HEX DEC" & vbCrLf & _
" OPCODE Offset: " & HexDecOut(OPCODESInfo(0)) & vbCrLf & _
" Length: " & HexDecOut(OPCODESInfo(1)) & vbCrLf & _
" Items: " & HexDecOut(OPCODES.Length) & vbCrLf & vbCrLf & _
" STRING Offset: " & HexDecOut(STRINGSInfo(0)) & vbCrLf & _
" Length: " & HexDecOut(STRINGSInfo(1)) & vbCrLf & _
" Items: " & HexDecOut(STRINGS.Length) & vbCrLf & vbCrLf & _
" ATTRIB Offset: " & HexDecOut(ATTRIBSInfo(0)) & vbCrLf & _
" Length: " & HexDecOut(ATTRIBSInfo(1)) & vbCrLf & _
" Items: " & HexDecOut(ATTRIBS.Length) & vbCrLf & vbCrLf & _
" GLOBAL Offset: " & HexDecOut(GLOBALSInfo(0)) & vbCrLf & _
" Length: " & HexDecOut(GLOBALSInfo(1)) & vbCrLf & _
" Items: " & HexDecOut(GLOBALS.Length)
End If
If ARG_HDRTXT Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllText(ARG_DESTIN & "Header.txt", HEADER)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_OPSTXT OrElse ARG_SCRPJS Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
For i = 0 To OPCODES.Length - 1
OPCODES(i).Resolve(i)
Next
Decomped = True
Dim OPStable As New StringBuilder
OPStable.AppendLine(" Line || OP Name | " & _
"OP# | ARG | UNK | VAR | VAL | Resolve ")
OPStable.AppendLine("".PadRight(92, "="))
For i = 0 To OPCODES.Length - 1
OPStable.AppendLine(" 0x" & i.ToString("X4") & " || " & _
OPCODES(i).OPNAME.PadRight(29, " ") & " | 0x" & _
OPCODES(i).OPNBR.ToString("X2") & " | 0x" & _
OPCODES(i).ARG.ToString("X2") & " | 0x" & _
OPCODES(i).UNK.ToString("X2") & " | 0x" & _
OPCODES(i).VAR.ToString("X2") & " | 0x" & _
BitConverter.ToString(OPCODES(i).VAL).Replace("-", "") & _
" | " & ResolveFormater(OPCODES(i).PRECODE & OPCODES(i).CODE & OPCODES(i).PROCODE))
OPStable.AppendLine("".PadRight(92, "-"))
Next
If ARG_OPSTXT Then IO.File.WriteAllText(ARG_DESTIN & "OPcode.txt", OPStable.ToString)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_STRTXT Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllLines(ARG_DESTIN & "String.txt", STRINGS)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_ATTTXT Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllLines(ARG_DESTIN & "Attrib.txt", ATTRIBS)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_GLBTXT Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllLines(ARG_DESTIN & "Global.txt", GLOBALS)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_SCRPJS Then
If Not Decomped Then
For i = 0 To OPCODES.Length - 1
OPCODES(i).Resolve(i)
Next
End If
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
Dim CODES As New List(Of String)
For i = 0 To OPCODES.Length - 1
If OPCODES(i).DONE Then
Select Case OPCODES(i).OPNBR
Case 57 \'Omit jump opcode
Case Else
Dim parts() As String = _
(OPCODES(i).PRECODE & OPCODES(i).CODE & OPCODES(i).PROCODE). _
Split(New String() {vbCrLf}, StringSplitOptions.RemoveEmptyEntries)
For Each part As String In parts
CODES.Add(part)
Next
End Select
End If
Next
IO.File.WriteAllText(ARG_DESTIN & "Script.js", Indentor(CODES))
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_HDRBIN Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllBytes(ARG_DESTIN & "Header.bin", HEADERByte)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_OPSBIN Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllBytes(ARG_DESTIN & "OPcode.bin", OPCODESByte)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_STRBIN Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllBytes(ARG_DESTIN & "String.bin", STRINGSByte)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_ATTBIN Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllBytes(ARG_DESTIN & "Attrib.bin", ATTRIBSByte)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_GLBBIN Then
Try
If Not IO.Directory.Exists(ARG_DESTIN) Then _
IO.Directory.CreateDirectory(ARG_DESTIN)
IO.File.WriteAllBytes(ARG_DESTIN & "Global.bin", GLOBALSByte)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
If ARG_OUTHDR Then
Console.WriteLine(HEADER.ToString)
If ARG_HLTOUT Then Console.ReadKey()
End If
Case 1 : Console.WriteLine(vbCrLf & " Wrong Extension")
Case 2 : Console.WriteLine(vbCrLf & " Failed to open file for reading")
Case 3 : Console.WriteLine(vbCrLf & " File magic mismatch")
Case 4 : Console.WriteLine(vbCrLf & " File might be currupt")
End Select
Else
Console.WriteLine(vbCrLf & _
" Usage: JSXviewer.exe [Options] <Input File> <Output Path>" & vbCrLf & _
vbCrLf & _
" Options: 0 Saves script.js" & vbCrLf & _
" 1 Saves Header.txt" & vbCrLf & _
" 2 Saves OPcode.txt" & vbCrLf & _
" 3 Saves String.txt" & vbCrLf & _
" 4 Saves Attrib.txt" & vbCrLf & _
" 5 Saves Global.txt" & vbCrLf & _
" 6 Saves Header.bin" & vbCrLf & _
" 7 Saves OPcode.bin" & vbCrLf & _
" 8 Saves String.bin" & vbCrLf & _
" 9 Saves Attrib.bin" & vbCrLf & _
" a Saves Global.bin" & vbCrLf & _
" b Show header info" & vbCrLf & _
" c Wait at complete" & vbCrLf & _
vbCrLf & _
" Examples: JSXviewer.exe 02bc C:\\example\\test.jsx" & vbCrLf & _
" JSXviewer.exe 02bc C:\\example\\test.jsx C:\\example\\")
Console.ReadKey()
End If
End Sub
Public Function Indentor(ByVal input As List(Of String)) As String
Dim lvl As Integer = 0
Dim StrArray(input.Count - 1) As String
Indentor = ""
For i = 0 To StrArray.Length - 1
Dim crntEval As String = input(i).Trim
If crntEval.StartsWith("}") Then lvl -= 1
crntEval = "".PadLeft(lvl, vbTab) & crntEval
If crntEval.EndsWith("{") Then lvl += 1
Indentor &= crntEval & vbCrLf
Next
End Function
Public Function ResolveFormater(ByVal input As String) As String
Dim meh As New StringBuilder
Dim lines() As String = input.Split(vbCrLf)
meh.AppendLine(vbTab & lines(0))
If lines.Length > 1 Then
For i = 1 To lines.Length - 1
meh.AppendLine(" ||" & _
" " & _
"| " & _
"| " & _
"| " & _
"| " & _
"| " & _
"| " & lines(i).Trim)
Next
End If
Return meh.ToString.Trim
End Function
Public Function ProcessJSX(ByVal InputPath As String) As Integer
If InputPath.ToLower.EndsWith(".jsx") Then
Try
CrntFileStream = New FileStream(InputPath, FileMode.Open, FileAccess.Read, FileShare.Read)
Catch ex As Exception
Return 2 \'Cannot read
End Try
Dim Temp(3) As Byte, offset As Integer, length As Integer
CrntFileStream.Read(Temp, 0, 4)
If Temp.SequenceEqual(_MAGIC) Then TYPE = "VSMX" Else Return 3
CrntFileStream.Read(Temp, 0, 4)
If Temp.SequenceEqual({0, 0, 1, 0}) Then : VERSION = "PSP (1.0)"
ElseIf Temp.SequenceEqual({0, 0, 2, 0}) Then : VERSION = "PS3 (2.0)"
Else : VERSION = "UNKN [" & BitConverter.ToString(Temp).Replace("-", " ") & "]"
End If
CrntFileStream.Position = 0
CrntFileStream.Read(HEADERByte, 0, 52)
CrntFileStream.Position = 8
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
offset = Bytes2Int(Temp)
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
length = Bytes2Int(Temp)
OPCODESInfo = {offset, length}
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
offset = Bytes2Int(Temp)
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
length = Bytes2Int(Temp)
CrntFileStream.Position += 4
STRINGSInfo = {offset, length}
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
offset = Bytes2Int(Temp)
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
length = Bytes2Int(Temp)
CrntFileStream.Position += 4
ATTRIBSInfo = {offset, length}
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
offset = Bytes2Int(Temp)
CrntFileStream.Read(Temp, 0, Temp.Length)
Array.Reverse(Temp)
length = Bytes2Int(Temp)
CrntFileStream.Position += 4
GLOBALSInfo = {offset, length}
CrntFileStream.Position = OPCODESInfo(0)
OPCODESByte = New Byte(OPCODESInfo(1) - 1) {}
CrntFileStream.Read(OPCODESByte, 0, OPCODESInfo(1))
If OPCODESByte.Length Mod 8 > 0 Then Return 4 \'Opcodes offset mismatch
CrntFileStream.Position = STRINGSInfo(0)
STRINGSByte = New Byte(STRINGSInfo(1) - 1) {}
CrntFileStream.Read(STRINGSByte, 0, STRINGSInfo(1))
CrntFileStream.Position = ATTRIBSInfo(0)
ATTRIBSByte = New Byte(ATTRIBSInfo(1) - 1) {}
CrntFileStream.Read(ATTRIBSByte, 0, ATTRIBSInfo(1))
CrntFileStream.Position = GLOBALSInfo(0)
GLOBALSByte = New Byte(GLOBALSInfo(1) - 1) {}
CrntFileStream.Read(GLOBALSByte, 0, GLOBALSInfo(1))
CrntFileStream.Close()
CrntFileStream.Dispose()
offset = 0
OPCODES = New OPcode(OPCODESByte.Length / 8 - 1) {}
For i = 0 To OPCODESByte.Length - 1 Step 8
OPCODES(offset) = New OPcode({OPCODESByte(i), _
OPCODESByte(i + 1), _
OPCODESByte(i + 2), _
OPCODESByte(i + 3), _
OPCODESByte(i + 7), _
OPCODESByte(i + 6), _
OPCODESByte(i + 5), _
OPCODESByte(i + 4)})
offset += 1
Next
InputPath = Text.Encoding.UTF8.GetString(STRINGSByte)
STRINGS = InputPath.Split(New String() {vbNullChar & vbNullChar & vbNullChar}, _
StringSplitOptions.RemoveEmptyEntries)
For i = 0 To STRINGS.Length - 1
STRINGS(i) = STRINGS(i).Replace(vbNullChar, "")
Next
InputPath = Text.Encoding.UTF8.GetString(ATTRIBSByte)
ATTRIBS = InputPath.Split(New String() {vbNullChar & vbNullChar & vbNullChar}, _
StringSplitOptions.RemoveEmptyEntries)
For i = 0 To ATTRIBS.Length - 1
ATTRIBS(i) = ATTRIBS(i).Replace(vbNullChar, "")
Next
InputPath = Text.Encoding.UTF8.GetString(GLOBALSByte)
GLOBALS = InputPath.Split(New String() {vbNullChar}, _
StringSplitOptions.RemoveEmptyEntries)
Return 0 \'Success
Else
Return 1 \'Wrong Extension
End If
Return -1 \'Unknown Error
End Function
Public Function Bytes2Int(bytes As Byte()) As Integer
Return BitConverter.ToInt32({bytes(3), bytes(2), bytes(1), bytes(0)}, 0)
End Function
Public Function Bytes2Sng(bytes As Byte()) As Single
Return BitConverter.ToSingle({bytes(3), bytes(2), bytes(1), bytes(0)}, 0)
End Function
Private Function HexDecOut(ByVal Value As Integer) As String
Dim bytes() As Byte = BitConverter.GetBytes(Value)
Array.Reverse(bytes)
HexDecOut = BitConverter.ToString(bytes).Replace("-", " ") & " "
HexDecOut &= Value.ToString.PadLeft(10, " ")
End Function
End Module