рдПрдХреНрд╕реЗрд▓ + рд╡реАрдмреАрдП рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХрднреА-рдХрднреА рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП,
XXEncode рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЕрдм, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ VBA рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╣рдореЗрд╢рд╛ .xx рд╡рд░реНрдХрдмреБрдХ рдХреЗ рдЕрдВрджрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡реАрдмреАрдП рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
XXE рдореЗрдВ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдбреЗрдЯрд╛ рдХреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рд╡реНрдпреБрддреНрдХреНрд░рдо рдкрд░рд┐рд╡рд░реНрддрди - рдбреАрдХреЛрдбрд┐рдВрдЧ - рдореИрдВрдиреЗ рдХреНрд░рдорд╢рдГ рджреЛ рдХрд╛рд░реНрдпреЛрдВ,
рдмрд┐рди 2 рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ рдФрд░
рдПрдХреНрд╕рдПрдХреНрд╕ 2 рдПрдирдмреА рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ред рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдкреЛрд░реНрдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ XXE рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
'' xxe Function bin2xxe(src() As Byte, fname As String) As String Dim i As Long, n As Long, t As Byte, xxe() As String, s As String, sz As Long, pt As Long xxe = Split("+ - 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTU VWXYZ abcdefghijklmnopqrstu vwxyz") i = 0 n = UBound(src) s = Space(((n + 1) \ 45) * 63 + ((n + 1) Mod 45) * 4 \ 3 + 280) pt = 1 sz = 12 + Len(fname) Mid$(s, 1, sz) = "begin 644 " & fname & vbCrLf pt = pt + sz + 1 sz = pt - 1 Do While i <= n If i Mod 3 = 0 Then Mid$(s, pt, 1) = xxe(src(i) \ 4): pt = pt + 1 t = (src(i) And 3) * 16 ElseIf i Mod 3 = 1 Then Mid$(s, pt, 1) = xxe(t + (src(i) \ 16)): pt = pt + 1 t = (src(i) And 15) * 4 ElseIf i Mod 3 = 2 Then Mid$(s, pt, 2) = xxe(t + src(i) \ 64) & xxe(src(i) And 63): pt = pt + 2 t = 0 End If If i Mod 45 = 44 Then Mid$(s, sz, 1) = "h" Mid$(s, pt, 2) = vbCrLf: pt = pt + 3: sz = pt - 1 End If i = i + 1 Loop If (n + 1) Mod 3 <> 0 Then Mid$(s, pt, 1) = xxe(t): pt = pt + 1 End If t = (n Mod 45) + 1 If t <> 45 Then Mid$(s, sz, 1) = xxe(t) Mid$(s, pt, 3) = "+" & vbCrLf: pt = pt + 3 End If Mid$(s, pt, 3) = "end": sz = pt + 2 bin2xxe = Left(s, sz) End Function ' xxe Function xxe2bin(src As String, fname As String) As Byte() Dim t() As String, t0() As String, i As Long, j As Long, k As Long Dim xxe As String, bStrLen As Byte, lStart As Long, h As Byte, x As Byte Dim dst() As Byte, xxeIdx(43 To 122) As Byte xxeIdx(43) = 0: xxeIdx(45) = 1 For i = 48 To 57: xxeIdx(i) = i - 46: Next For i = 65 To 90: xxeIdx(i) = i - 53: Next For i = 97 To 122: xxeIdx(i) = i - 59: Next t = Split(src, vbCrLf) t0 = Split(t(0)) If t0(0) <> "begin" Then Exit Function If UBound(t0) = 2 Then fname = t0(2) Else Exit Function j = 1 Do While t(j) <> "end" And j <= UBound(t) lStart = lStart + xxeIdx(Asc(t(j))) j = j + 1 Loop ReDim dst(0 To lStart - 1) j = 1: lStart = 0: x = 0 Do While t(j) <> "end" And j <= UBound(t) bStrLen = xxeIdx(Asc(t(j))) i = 2 k = 0 Do While i <= Len(t(j)) And k <= bStrLen - 1 h = xxeIdx(Asc(Mid$(t(j), i, 1))) Select Case i And 3 Case 0: dst(lStart + k) = x + h \ 4 x = (h And 3) * 64 k = k + 1 Case 1: dst(lStart + k) = x + h x = 0 k = k + 1 Case 2: x = h * 4 Case 3: dst(lStart + k) = x + h \ 16 x = (h And 15) * 16 k = k + 1 End Select i = i + 1 Loop lStart = lStart + bStrLen j = j + 1 Loop xxe2bin = dst End Function
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛: рдлрд╝рд╛рдЗрд▓
2stdm рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ VBA рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ (xxe рдХреЛрдб рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдЗрдирд╡реЙрдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг - рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ рдЬреЛ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдирд╛
stdm2file ред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ VBProject рдореЗрдВ рдореБрдлреНрдд рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП, VBA рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд▓рдХреНрд╖реНрдп рдорд╢реАрди рдкрд░ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реИрдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рд╣реИрдВ:
' VBA Sub file2stdm(fpath As String, fname As String, wbk As Workbook) Dim src() As Byte, s As String, i As Long, t() As String Dim stdm As VBComponent, f As Long f = FreeFile Open fpath & "\" & fname For Binary Access Read As #f ReDim src(0 To LOF(f) - 1) As Byte Get #f, 1, src Close #f s = bin2xxe(src, fname) t = Split(s, vbCrLf) For i = 0 To UBound(t) t(i) = "'" & t(i) Next s = Join(t, vbCrLf) Set stdm = wbk.VBProject.VBComponents.Add(vbext_ct_StdModule) stdm.Name = "m" & Replace(fname, ".", "") stdm.CodeModule.AddFromString s Set stdm = Nothing End Sub ' VBA Sub stdm2file(fpath As String, fname As String, wbk As Workbook) Dim stdm As VBComponent, i As Long, m As Long, n As Long Dim s As String, t() As String, dst() As Byte, f As Long Set stdm = wbk.VBProject.VBComponents("m" & Replace(fname, ".", "")) For i = 1 To stdm.CodeModule.CountOfLines If stdm.CodeModule.Lines(i, 1) Like "'begin *" Then m = i If stdm.CodeModule.Lines(i, 1) Like "'end*" Then n = i - m + 1 Next s = stdm.CodeModule.Lines(m, n) Set stdm = Nothing t = Split(s, vbCrLf) For i = 0 To UBound(t) t(i) = Mid(t(i), 2) Next s = Join(t, vbCrLf) dst = xxe2bin(s, fname) f = FreeFile Open ThisWorkbook.Path & "\" & fname For Binary Access Write As #f Put #f, 1, dst Close #f End Sub
рдмреЗрд╢рдХ, рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рдореЗрдВ рдЬреБрдЯ рдЬрд╛рдирд╛ рд╣реИред рджреЛ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ, рдПрдХ рдлрд╛рдЗрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░рддреА рд╣реИ, рджреВрд╕рд░реА рдлрд╛рдЗрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рдЕрдирдкреИрдХ рдХрд░рддреА рд╣реИред
Sub test1() ' ( xxe) stdm2file ThisWorkbook.Path, "dzp.exe", ThisWorkbook ' , 'Shell ThisWorkbook.Path & "\" & "dzp.exe", vbNormalNoFocus End Sub Sub test2() ' mdzpexe On Error Resume Next With ThisWorkbook.VBProject.VBComponents .Remove .Item("mdzpexe") End With ' ( xxe) file2stdm ThisWorkbook.Path, "dzp.exe", ThisWorkbook End Sub
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, XXE рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдИ-рдореЗрд▓ (рдмреЗрд╕ 64 рдХреЗ рд╕рд╛рде) рдореЗрдВ рд╕рдВрд▓рдЧреНрдирдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд░реНрдг рд╕реЗрдЯ (+ -рдП-рдЬрд╝рд╛-рдЬрд╝) рдЖрдкрдХреЛ рдмрд╛рдЗрдирд░реА рдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕рд╛рдЗрдЯ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣реЗрдВред рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реИред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ:
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ Xencoding рд▓реЗрдЦ