AHK源代码加密器 v3.5

这是AHK源代码加密工具,作为第一层加密,之后可以用Ahk2Exe编译为程序。
由于AHK官方支持开源,结果Ahk2Exe编译的程序(不使用mpress压缩),
在程序末尾明文保存了源代码,不利于发布私有成果。即使压缩、加壳也有
对应的脱壳工具。这个工具可以使Ahk2Exe生成的程序末尾的源代码已加密。

/*
;-------------------------------
  AHK Source Code Encryptor v3.5  By FeiYue

  1. This tool can encrypt the AHK script into a self decode script.
     Then you can use Ahk2Exe to compile the script into a program,
     combined with mpress.exe or upx.exe packers.
     Note: To encrypt, or To compile, or To run the script,
     you must have a AutoHotkey.exe in the script directory.

  2. When you want to use the directory relative to the script, don't use
     A_ScriptFullPath, A_ScriptDir, but use A_ScriptFullPath2, A_ScriptDir2.

  3. When you want to Reload your own script, if the Reload command is fail,
     You can use Reload() function instead (it's added when encrypted).

;-------------------------------
*/

#NoEnv
SetBatchLines, -1
#SingleInstance force
ListLines, Off
Version := "3.5"

fs=
(` %

; You can compile and set icons by using Ahk2Exe.exe.
; If AutoHotkey.exe wants to change its name to abc.exe,
; please modify Ahk:=A_ScriptDir "\abc.exe"

Ahk:=A_ScriptDir "\AutoHotkey.exe"

#NoEnv
SetBatchLines, -1
#NoTrayIcon
#SingleInstance off
ScriptGuard1()
ScriptGuard1()  ; By TAC109
{
  For i,ahk in ["#1", ">AUTOHOTKEY SCRIPT<"]
  if (rc:=DllCall("FindResource", "Ptr",0, "Str",ahk, "Ptr",10, "Ptr"))
  && (sz:=DllCall("SizeofResource", "Ptr",0, "Ptr",rc, "Uint"))
  && (pt:=DllCall("LoadResource", "Ptr",0, "Ptr",rc, "Ptr"))
  && (pt:=DllCall("LockResource", "Ptr",pt, "Ptr"))
  && (DllCall("VirtualProtect", "Ptr",pt, "Ptr",sz, "UInt",0x40, "UInt*",rc))
    DllCall("RtlZeroMemory", "Ptr",pt, "UInt",sz)
}

if !(A_IsAdmin || DllCall("GetCommandLine","str")~=" /restart(?!\S)")
{
  Try
  {
    q:=Chr(34)
    if (A_IsCompiled)
      Run % "*RunAs " q A_ScriptFullPath q " /restart"
    else
      Run % "*RunAs " q A_AhkPath q " /restart " q A_ScriptFullPath q
  }
  ExitApp
}

s:=""
Exec(s, Ahk)
ExitApp

Exec(str, Ahk:="", args:="") {
  static init, MyFunc, base
  if !VarSetCapacity(init) && (init:="1")
  {
    x32:="5557565381ec1c0200008bbc24300200008b1f8b433c01d866813b4d5a0f85b6"
    . "0b00008138504500000f85aa0b00008b7704668178180b01b988000000ba7800"
    . "00008b6f0c897424348b77080f45d1897424508b7710897424308b3410c78424"
    . "8c0000000000000001de89f08b4e188b761c8b50208b4024897424388944243c"
    . "31c085c98d34137512e9120b0000669083c00139c10f84050b00008b148601da"
    . "813a4765745075e8817a04726f634175df8b74243c8d04430fb704308b742438"
    . "8d04838b343085f689b4248c0000000f84cb0a0000b86500000001dec78424b2"
    . "0000005772697466898424ba0000008d8424b2000000c78424b6000000654669"
    . "6c891c2489442404ffd683ec08894424448d8424d2000000c78424d200000047"
    . "6c6f62c78424d6000000616c416cc78424da0000006c6f630089442404891c24"
    . "ffd683ec0889442458b865650000c78424bc000000476c6f6266898424c40000"
    . "008d8424bc000000c78424c0000000616c4672c68424c600000000891c248944"
    . "2404ffd683ec0889442454b873410000c7842429010000437265616689842435"
    . "0100008d842429010000c784242d01000074655072c78424310100006f636573"
    . "c68424370100000089442404891c24ffd683ec088944245c8d84246a010000c7"
    . "84246a01000043726561c784246e01000074654e61c78424720100006d656450"
    . "c784247601000069706541c684247a0100000089442404891c24ffd683ec0889"
    . "4424608d84247b010000c784247b010000436f6e6ec784247f0100006563744e"
    . "c7842483010000616d6564c784248701000050697065c684248b010000008944"
    . "2404891c24ffd683ec08894424688d8424de000000c78424de000000436c6f73"
    . "c78424e20000006548616ec78424e6000000646c650089442404891c24ffd683"
    . "ec08894424408d8424b4010000c78424b401000051756572c78424b801000079"
    . "506572c78424bc010000666f726dc78424c0010000616e6365c78424c4010000"
    . "436f756ec78424c80100007465720089442404891c24ffd683ec08894424648d"
    . "8424a0000000c78424a00000006c737472c78424a400000063617441c68424a8"
    . "0000000089442404891c24ffd683ec08894424388d8424a9000000c78424a900"
    . "00006c737472c78424ad0000006c656e41c68424b10000000089442404891c24"
    . "ffd683ec088944243c8d8424ea000000c78424ea00000043726561c78424ee00"
    . "000074654669c78424f20000006c65410089442404891c24ffd683ec08894424"
    . "6cb867410000c784248c01000043726561668984249c0100008d84248c010000"
    . "c784249001000074654669c78424940100006c654d61c7842498010000707069"
    . "6ec684249e0100000089442404891c24ffd683ec0889442470b865000000c784"
    . "241b0100004d61705666898424270100008d84241b010000c784241f01000069"
    . "65774fc78424230100006646696c891c2489442404ffd683ec08894424788d84"
    . "245a010000c784245a010000556e6d61c784245e01000070566965c784246201"
    . "0000774f6646c7842466010000696c650089442404891c24ffd683ec08894424"
    . "7c8d8424f6000000c78424f600000047657446c78424fa000000696c6553c784"
    . "24fe000000697a650089442404891c24ffd683ec0889442474b870000000c784"
    . "2492000000536c656566898424960000008d842492000000891c2489442404ff"
    . "d683ec08894424488d842402010000c784240201000045786974c78424060100"
    . "0050726f63c784240a0100006573730089442404891c24ffd683ec088944244c"
    . "8d84240e010000c784240e01000043726561c784241201000074655468c78424"
    . "1601000072656164c684241a0100000089442404891c24ffd683ec088b542434"
    . "85d20f84a1060000e8000000005a8d8a78ecffffeb158d76008dbc2700000000"
    . "83ea0139ca0f8427060000803ab875f0817a016666666675e7c7470400000000"
    . "89542408c744241400000000c744241000000000897c240cc744240400000000"
    . "c7042400000000ffd083ec188d84248c000000c744241000000000c744240800"
    . "000000896c2404c70424000000008944240cff54244483ec148b84248c000000"
    . "85c0894424480f85f60500008b442434890424ff54243c83ec043de27f00000f"
    . "8f370600008b4424308d0485040000003dff7f00008944244c0f868505000089"
    . "84248c00000089442404c7042400000000ff54245883ec0885c089c30f840406"
    . "00008d842498000000c784249f0100005c5c2e5cc78424a301000070697065c7"
    . "8424a70100005c41484bc78424ab01000031323334c78424af01000035363738"
    . "c68424b301000000890424ff54246483ec048b8424980000008db4249f010000"
    . "8934248984248c000000ff54243c83ec048d14068d7c06f88b8c248c00000090"
    . "89c883ea01c1e90483e00f83c041880239fa75ec8b442434bf20220000898c24"
    . "8c000000c60322c64301006689bc24cf000000c78424c700000022202f66c784"
    . "24cb0000006f726365c68424d10000000089442404891c24ff54243883ec088d"
    . "bc24c7000000891c24897c2404ff54243883ec0889742404891c24ff54243883"
    . "ec08897c2404c68424c900000000891c24ff54243883ec08891c24ff54243c83"
    . "ec0489c78b4c2450890c24ff54243c01c783ec0481ffff7f00000f8e4b040000"
    . "8b7c2460c744241c00000000c744241800000000c744241400000000c7442410"
    . "00000000c744240cff000000c744240800000000c744240402000000893424ff"
    . "d783ec2089442438c744241c00000000c744241800000000c744241400000000"
    . "c744241000000000c744240cff000000c744240800000000c744240402000000"
    . "893424ffd783ec2089c7837c2438ff0f843b04000083f8ff0f84320400008d8c"
    . "24cc0100008d942410020000c784248c0000004400000089c88db42600000000"
    . "c6000083c00139d075f68d842438010000c78424cc01000044000000894c2420"
    . "c744241c00000000c74424180000000089442424c744241400000000c7442410"
    . "00000000c744240c00000000c744240800000000895c2404c7042400000000ff"
    . "54245c83ec2885c00f845e0300008b8424380100008b74244089042489f0ffd0"
    . "83ec048b84243c01000089042489f0ffd083ec048b4c243085c9741d31c06690"
    . "8b54850089148383c00139c175f28b44244c83e804894424488b442448c70403"
    . "000000008b442434c744241800000000c744241400000000c744241003000000"
    . "c744240c00000000c744240803000000c744240400000080890424ff54246c83"
    . "ec1c83f8ff89c5894424340f847a010000c744240400000000890424ff542474"
    . "83ec0889c6c744241400000000c744241000000000c744240c00000000c74424"
    . "0802000000c744240400000000892c24ff54247083ec1885c08944243c0f841a"
    . "010000c744241000000000c744240c00000000c744240800000000c744240404"
    . "000000890424ff54247883ec1485c089c10f84d800000089f0ba5917b7d1c784"
    . "24480100006f000000f7e2c784244c01000071000000c7842450010000750000"
    . "00c784245401000077000000c1ea0d69c210270000c1e80285c089c5743aba6f"
    . "00000031c0eb1589f68dbc270000000089c283e2038b94944801000069d28300"
    . "000003148189c683c00183e60339c58994b44801000075d88b74243031d285f6"
    . "74438b7424308d76008dbc270000000089d083e00369ac844801000083000000"
    . "01d589ac84480100008b0493d1c029e8d1c029e88984248c00000089049383c2"
    . "0139d675cb890c24ff54247c83ec048b44243c890424ff54244083ec048b4424"
    . "34890424ff54244083ec048b7424388b6c2468c74424040000000089342489e8"
    . "ffd083ec088934248b74244089f0ffd083ec0489e8c744240400000000893c24"
    . "ffd083ec088d84248c000000c744241000000000895c2404893c248944240c8b"
    . "44244c89442408ff54244483ec1489f0893c24ffd083ec0431c08b54243085d2"
    . "741c8b5424308d76008dbc2700000000c704830000000083c00139c275f2891c"
    . "24ff54245483ec0431c081c41c0200005b5e5f5dc2040089f68dbc2700000000"
    . "b8feffffff81c41c0200005b5e5f5dc2040081c41c020000b8fdffffff5b5e5f"
    . "5dc20400c784248c00000000800000b800800000e96dfaffff81c41c020000b8"
    . "ffffffff5b5e5f5dc204008b442450891c2489442404ff54243883ec08e99efb"
    . "ffffb8fcffffffeb9cc70424e8030000ff54244883ec04c7042400000000ff54"
    . "244c31c083ec04e979ffffff8b4424388b74244089042489f0ffd083ec0489f0"
    . "893c24ffd083ec04891c24ff542454b8f8ffffff83ec04e949ffffffb8fbffff"
    . "ffe93fffffffb8faffffffe935ffffff8b4424388b74244089042489f0ffd083"
    . "ec0489f0893c24ffd083ec04891c24ff542454b8f9ffffff83ec04e905ffffff"
    x64:="4157415641554154555756534881ec280300004c8b39b8ffffffff4989c9418b"
    . "573c4c01fa6641813f4d5a0f852f0a0000813a504500000f85230a000066817a"
    . "180b01b978000000b888000000498b7110498b79084d8b7118498b5920480f44"
    . "c148897424608b040231d2c78424dc000000000000004c01f8448b50208b4818"
    . "8b701c8b68244d01fa85c97511e9e20900004883c20139d10f86d6090000418b"
    . "04924c01f881384765745075e5817804726f634175dc498d04570fb70428498d"
    . "0487448b2c304585ed4489ac24dc0000000f849d09000041b86500000048b857"
    . "7269746546696c4d01fd6644898424280100004c894c2458488d942420010000"
    . "4c89f9488984242001000041ffd5488944245048b8476c6f62616c416c488d94"
    . "24500100004c89f94889842450010000c78424580100006c6f630041ffd541b9"
    . "65650000488944247048b8476c6f62616c46726644898c2438010000488d9424"
    . "300100004c89f94889842430010000c684243a0100000041ffd541ba73410000"
    . "488944246848b843726561746550726644899424cc010000488d9424c0010000"
    . "4c89f948898424c0010000c78424c80100006f636573c68424ce0100000041ff"
    . "d5488944247848b84372656174654e61488d9424f001000048898424f0010000"
    . "48b86d656450697065414c89f948898424f8010000c68424000200000041ffd5"
    . "488984248000000048b8436f6e6e6563744e488d942410020000488984241002"
    . "000048b8616d6564506970654c89f94889842418020000c68424200200000041"
    . "ffd5488984249000000048b8436c6f736548616e488d9424600100004c89f948"
    . "89842460010000c7842468010000646c650041ffd54889c648b8517565727950"
    . "6572488d942470020000488984247002000048b8666f726d616e63654c89f948"
    . "8984247802000048b8436f756e74657200488984248002000041ffd548898424"
    . "8800000048b86c73747263617441488d9424000100004c89f948898424000100"
    . "00c68424080100000041ffd54889c548b86c7374726c656e41488d9424100100"
    . "004c89f94889842410010000c68424180100000041ffd54989c448b843726561"
    . "74654669488d9424700100004c89f94889842470010000c78424780100006c65"
    . "410041ffd5488984249800000048b8437265617465466941bb67410000488984"
    . "243002000048b86c654d617070696e6644899c2440020000488d942430020000"
    . "4c89f94889842438020000c68424420200000041ffd548898424b000000048b8"
    . "4d6170566965774f488d9424b001000048898424b0010000b8650000004c89f9"
    . "c78424b80100006646696c66898424bc01000041ffd548898424c000000048b8"
    . "556e6d6170566965488d9424d001000048898424d001000048b8774f6646696c"
    . "65004c89f948898424d801000041ffd548898424c800000048b847657446696c"
    . "6553488d9424800100004c89f94889842480010000c7842488010000697a6500"
    . "41ffd548898424b8000000b870000000488d9424e00000004c89f9c78424e000"
    . "0000536c656566898424e400000041ffd548898424a000000048b84578697450"
    . "726f63488d9424900100004c89f94889842490010000c7842498010000657373"
    . "0041ffd548898424a800000048b84372656174655468c78424a8010000726561"
    . "6448898424a0010000c68424ac01000000488d9424a00100004c89f941ffd548"
    . "85ff4c8b4c24580f84b9050000e8000000004158498d9078ecffffeb100f1f00"
    . "4983e8014939d00f846e050000418038b875ed418178016666666675e349c741"
    . "080000000031d231c948c744242800000000c744242000000000ffd0488d8424"
    . "dc0000004531c04c89f231c948c74424200000000048898424a00000004989c1"
    . "488b442450ffd08b9424dc000000b8fcffffff85d20f85e50400004889f941ff"
    . "d43de27f00000f8f540500008d049d040000003dff7f0000898424a80000000f"
    . "86dd040000898424dc00000089c231c9488b442470ffd04885c04989c50f8445"
    . "05000048b85c5c2e5c70697065488d8c24f0000000c784246002000035363738"
    . "488984245002000048b85c41484b31323334c684246402000000488984245802"
    . "0000488b842488000000ffd08b8424f0000000898424dc000000488d84245002"
    . "00004889c1488944245841ffd48b8c24dc0000008d50ff448d48f70f1f440000"
    . "89c84189d083ea0183e00fc1e90483c0414439ca428884045002000075e24c8d"
    . "bc2440010000898c24dc00000048b822202f666f726365b92022000041c64500"
    . "2241c64501004889fa66898c244801000048898424400100004c89e9c684244a"
    . "01000000ffd54c89fa4c89e9ffd5488b5424584c89e9ffd54c89fa4c89e9c684"
    . "244201000000ffd54c89e941ffd44189c7488b4c246041ffd44101c74181ffff"
    . "7f00000f8eae0300004c8b6424584531c041b9ff000000ba020000004c8bbc24"
    . "8000000048c744243800000000c744243000000000c7442428000000004c89e1"
    . "c74424200000000041ffd74889c54531c04c89e148c744243800000000c74424"
    . "300000000041b9ff000000c744242800000000c744242000000000ba02000000"
    . "41ffd74883fdff4989c40f847a0300004883f8ff0f8470030000488d8c24b002"
    . "0000c78424dc00000068000000488d51684889c8c600004883c0014839d075f4"
    . "488d84249002000048894c24404531c94531c031c9c78424b002000068000000"
    . "488944244848c7442438000000004c89ea48c744243000000000c74424280000"
    . "0000c744242000000000488b442478ffd085c00f84cc020000488b8c24900200"
    . "00ffd6488b8c2498020000ffd631c04885db742431d2662e0f1f840000000000"
    . "418b0c8641894c85008d42014839c34889c277ec48c1e00241c7440500000000"
    . "004531c94889f948c744243000000000c74424280000000041b803000000c744"
    . "242003000000ba00000080488b842498000000ffd04883f8ff4889c70f846701"
    . "000031d24889c1488b8424b8000000ffd04531c931d24189c648c74424280000"
    . "0000c74424200000000041b8020000004889f9488b8424b0000000ffd04885c0"
    . "4989c70f841b0100004531c94531c04889c148c744242000000000ba04000000"
    . "488b8424c0000000ffd04885c04989c30f84e9000000ba5917b7d14489f0c784"
    . "24e00100006f000000f7e2c78424e401000071000000c78424e8010000750000"
    . "00c78424ec01000077000000c1ea0d4469c21027000041c1e8024585c074404c"
    . "89d9b86f00000031d2eb110f1f44000089d083e0038b8484e001000069c08300"
    . "000003014189d183c2014183e1034883c1044139d04289848ce001000075d131"
    . "c031d24885db744a0f1f8400000000004189d04183e00342698c84e001000083"
    . "00000001d142898c84e00100004d8d448500418b00d1c029c8d1c029c8898424"
    . "dc0000004189008d42014839c34889c277be4c89d9488b8424c8000000ffd04c"
    . "89f9ffd64889f9ffd6488bbc249000000031d24889e94889f8ffd04889e9ffd6"
    . "31d24c89e14889f8ffd04c89ea4c8b8c24a0000000448b8424a80000004c89e1"
    . "48c744242000000000488b442450ffd04c89e1ffd631d231c04885db74166690"
    . "41c7449500000000008d50014839d34889d077ec4c89e9488b442468ffd031c0"
    . "4881c4280300005b5e5f5d415c415d415e415fc3b8feffffffebe5b8fdffffff"
    . "ebdec78424dc00000000800000ba00800000e917fbffff488b5424604c89e9ff"
    . "d5e943fcffffb9e8030000488b8424a0000000ffd0488b8424a800000031c9ff"
    . "d031c0eb9b4889e9ffd64c89e1ffd64c89e9488b442468ffd0b8f8ffffffeb80"
    . "b8fbffffffe976ffffff4889e9ffd64c89e1ffd64c89e9488b442468ffd0b8f9"
    . "ffffffe958ffffffb8faffffffe94effffff9090909090909090909090909090"
    hex:="b866666666" (A_PtrSize=8 ? x64 : x32)
    VarSetCapacity(MyFunc, len:=StrLen(hex)//2)
    Loop % len
      NumPut("0x" SubStr(hex,2*A_Index-1,2), MyFunc, A_Index-1, "uchar")
    DllCall("VirtualProtect", "Ptr",&MyFunc, "Ptr",len, "uint",0x40, "Ptr*",0)
    base:=DllCall("GetModuleHandle", "Str","Kernel32", "Ptr")
    if FileExist(A_ScriptFullPath)
      EnvSet, My_ScriptFullPath, %A_ScriptFullPath%
  }
  if (A_IsCompiled)
    Try
      FileInstall, AutoHotkey.exe, %Ahk%
  Ahk:=!FileExist(Ahk) ? A_AhkPath : Ahk
  if !FileExist(Ahk)
  {
    MsgBox, 4096, Error, Can't Find: %Ahk%
    return
  }
  q:=Chr(34)
  For k,v in A_Args
    args.=" " q v q
  s:=RegExReplace(str,"\s"), RegExReplace(s,"u",,size)
  VarSetCapacity(str,(size+1)*4), s:=SubStr(s,InStr(s,"u")+1)
  Loop Parse, s, u
    NumPut(A_LoopField, str, (A_Index-1)*4, "uint")
  VarSetCapacity(Param, 40)
  , StrPut(v:=Ahk, &Ahk, "CP0")
  , StrPut(v:=args, &args, "CP0")
  For k,v in [base, &Ahk, &args, &str, size]
    NumPut(v, Param, A_PtrSize*(k-1), "Ptr")
  r:=DllCall(&MyFunc, "Ptr",&Param)
  return r
}

)

if A_Args.Length()
{
  Encrypt(A_Args[1])
  ExitApp
}
Gui, +AlwaysOnTop
Gui, Color, DDEEFF
Gui, Font, cRed s28
Gui, Add, Text,, Drag the AHK script here to Encrypt`n`n
Gui, Show,, AHK Source Code Encryptor v%Version%  -  By FeiYue
OnMessage(0x201, "LButton_Down")
return

LButton_Down(a*) {
  SendMessage, 0xA1, 2
}

GuiClose(a*) {
  ExitApp
}

GuiDropFiles(a*) {
  Gui, +OwnDialogs
  For i,file in StrSplit(A_GuiEvent,"`n")
  {
    MsgBox, 4100, Tip, Do you want to encrypt this file ?`n`n%file%
    IfMsgBox, Yes
    {
      Encrypt(file)
      MsgBox, 4096, Tip, Encryption is completed !
    }
  }
}

Encrypt(file) {
  global fs
  Ahk:=RegExReplace(file,"[^\\]+$") "AutoHotkey.exe"
  if !FileExist(Ahk)
  {
    MsgBox, 4096, Error, `nCan't Find:`n`n%Ahk%`n`t
    Exit
  }
  q:=Chr(34)
  FileRead, s, % file
  s:=RegExReplace(Encode(s, Ahk), ".{1,60}", "s.=" q "$0" q "`n")
  s:=RegExReplace(fs, "i)\n[^\n]*Exec\([^\n]+\s+ExitApp", "`n" s "$0")
  f:=RegExReplace(file,"\.[^.\\]+$") . "-encoded.ahk"
  Try FileDelete, % f
  FileAppend, % RegExReplace(s,"\R","`r`n"), % f, UTF-8
}

Encode(s, Ahk) {
  static init, MyFunc
  if !VarSetCapacity(init) && (init:="1")
  {
    x32:="5557565383ec108b7c24308b4c24248b5c24288b6c242cc704246f000000c744"
    . "24047100000085ffc744240875000000c744240c77000000742aba6f00000031"
    . "c0eb0889c283e2038b149469d2830000000354850089c683c00183e60339c789"
    . "14b475df31d285db742d8db60000000089d783e7036904bc830000008d34108b"
    . "04918934bc01f0d1c801f0d1c889049183c20139d375d983c41031c05b5e5f5d"
    . "c3909090909090909090909090909090"
    x64:="4883ec184585c9c704246f000000c744240471000000c744240875000000c744"
    . "240c770000007434b86f0000004531d2eb094489d083e0038b048469c0830000"
    . "004103004589d34183c2014183e3034983c0044539d14289049c75d64531c085"
    . "d274324d89c24183e2034269049483000000468d0c00428b048146890c944401"
    . "c8d1c84401c8d1c8428904814983c0014439c277ce31c04883c418c390909090"
    hex:=(A_PtrSize=8 ? x64:x32)
    VarSetCapacity(MyFunc, len:=StrLen(hex)//2)
    Loop % len
      NumPut("0x" SubStr(hex,2*A_Index-1,2), MyFunc, A_Index-1, "uchar")
    DllCall("VirtualProtect", "Ptr",&MyFunc, "Ptr",len, "uint",0x40, "Ptr*",0)
  }
  add=
  (` %
;-----------------------
ListLines, Off
global A_ScriptFullPath2, A_ScriptDir2
OnlyOne()
OnlyOne(flag:="") {
  global A_ScriptFullPath2, A_ScriptDir2
  EnvGet, file, My_ScriptFullPath
  A_ScriptFullPath2:=file, A_ScriptDir2:=RegExReplace(file, "\\[^\\]*$")
  if (file~="i)\.(exe|com|scr|bat|cmd)\s*$")
    Try Menu, Tray, Icon, % file
  SetWorkingDir % A_ScriptDir2
  flag:=(flag="" ? file : flag)
  DetectHiddenWindows % (dhw:=A_DetectHiddenWindows) ? "On":"On"
  hash:=0
  Loop Parse, flag
    hash:=(hash*31+Ord(A_LoopField))&0xFFFFFFFF
  Name:="Ahk_OnlyOne_" hash
  While Mutex:=DllCall("OpenMutex", "int",0x100000, "int",0, "str",Name)
  {
    DllCall("CloseHandle", "Ptr",Mutex)
    WinGet, list, List, <<%flag%>> ahk_class AutoHotkey
    Loop % list
    IfWinExist, % "ahk_id " . list%A_Index%
    {
      WinGet, pid, PID
      WinClose,,, 3
      IfWinExist
      {
        Process, Close, %pid%
        Process, WaitClose, %pid%, 3
      }
    }
  }
  WinSetTitle, ahk_id %A_ScriptHwnd%,, <<%flag%>>
  DllCall("CreateMutex", "Ptr",0, "int",0, "str",Name)
  if (A_LastError=0xB7)
    ExitApp
  DetectHiddenWindows % dhw
}
Reload(args:="") {
  q:=Chr(34)
  For k,v in A_Args
    args.=" " q v q
  EnvGet, file, My_ScriptFullPath
  if (file="")
    return
  Try
  if (file~="i)\.(exe|com|scr|bat|cmd)\s*$")
    Run % q file q " /force " args
  else
    Run % q A_AhkPath q " /force " q file q " " args
  ExitApp
}
ListLines, On
;-----------------------
  )
  FileGetSize, pSize, %Ahk%
  FileRead, pFile, *c %Ahk%
  s:="`n" add "`n" s "`n#SingleInstance off`n"
  s:=RegExReplace(s, "i)(\n\s*((Try\s|else\s|Finally\s|[^:\n]+::)\s*)?"
    . "Reload)(?=\s+;|\s*\n)", "$1()")
  s:=(A_IsUnicode ? chr(0xfeff) : chr(0xEF) chr(0xBB) chr(0xBF))
    . RegExReplace(s,"\R","`r`n") . "`t`t`t"
  size:=StrLen(s)*(!!A_IsUnicode+1)//4
  DllCall(&MyFunc, "Ptr",&s, "uint",size
    , "Ptr",&pFile, "uint",(pSize//10000)*10000//4, "Cdecl")
  VarSetCapacity(str, size*11*(!!A_IsUnicode+1)), p:=&s-4
  Loop % size
    str.="u" . NumGet(0|p+=4,"uint")
  return str
}


;======== The End ========

;

getfs() {
  fs=
(` %

#include <windows.h>

#define RD(addr) (*(LPDWORD)(addr))
#define RS(addr) (*(PUSHORT)(addr))

typedef HANDLE (WINAPI * _GetProcAddress)(
  HMODULE hModule,
  LPCSTR  lpProcName );

typedef BOOL (WINAPI * _WriteFile)(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped );

typedef HGLOBAL (WINAPI * _GlobalAlloc)(
  UINT   uFlags,
  SIZE_T dwBytes );

typedef HGLOBAL (WINAPI * _GlobalFree)(
  HGLOBAL hMem );

typedef BOOL (WINAPI * _CreateProcessA)(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation );

typedef HANDLE (WINAPI * _CreateNamedPipeA)(
  LPCSTR                lpName,
  DWORD                 dwOpenMode,
  DWORD                 dwPipeMode,
  DWORD                 nMaxInstances,
  DWORD                 nOutBufferSize,
  DWORD                 nInBufferSize,
  DWORD                 nDefaultTimeOut,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes );

typedef BOOL (WINAPI * _ConnectNamedPipe)(
  HANDLE       hNamedPipe,
  LPOVERLAPPED lpOverlapped );

typedef BOOL (WINAPI * _CloseHandle)(
  HANDLE hObject );

typedef BOOL (WINAPI * _QueryPerformanceCounter)(
  LARGE_INTEGER *lpPerformanceCount );

typedef LPSTR (WINAPI * _lstrcatA)(
  LPSTR  lpString1,
  LPCSTR lpString2 );

typedef int (WINAPI * _lstrlenA)(
  LPCSTR lpString );

typedef HANDLE (WINAPI * _CreateFileA)(
  LPCSTR                lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile );

typedef HANDLE (WINAPI * _CreateFileMappingA)(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCSTR                lpName );

typedef LPVOID (WINAPI * _MapViewOfFile)(
  HANDLE hFileMappingObject,
  DWORD  dwDesiredAccess,
  DWORD  dwFileOffsetHigh,
  DWORD  dwFileOffsetLow,
  SIZE_T dwNumberOfBytesToMap );

typedef BOOL (WINAPI * _UnmapViewOfFile)(
  LPCVOID lpBaseAddress );

typedef DWORD (WINAPI * _GetFileSize)(
  HANDLE  hFile,
  LPDWORD lpFileSizeHigh );

typedef void (WINAPI * _Sleep)(
  DWORD dwMilliseconds );

typedef void (WINAPI * _ExitProcess)(
  UINT uExitCode );

typedef HANDLE (WINAPI * _CreateThread)(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId );

//-----------------------------

int WINAPI DecodeAndRun(HANDLE * Param)
{
  HMODULE    hMod = (HMODULE)(Param[0]);
  LPCSTR ahk_path =  (LPCSTR)(Param[1]);
  LPCSTR     args =  (LPCSTR)(Param[2]);
  LPDWORD     str = (LPDWORD)(Param[3]);
  SIZE_T     size =  (SIZE_T)(Param[4]);
  //-----------------------------
  DWORD i, j, k;
  PUCHAR base = (PUCHAR)hMod;
  PUCHAR addr = base+RD(base+0x3C);
  if (RS(base)!=0x5A4D || RD(addr)!=0x4550) // MZ, PE00
    return -1;
  addr = base+RD(addr+(RS(addr+24)==0x10b ? 0x78:0x88));
  DWORD    name_num = RD(addr+0x18);
  LPDWORD Addr_func = (LPDWORD)(base+RD(addr+0x1C));
  LPDWORD Addr_name = (LPDWORD)(base+RD(addr+0x20));
  PUSHORT  Addr_ord = (PUSHORT)(base+RD(addr+0x24));
  char str1[] = "GetProcAddress"; k=0;
  for (i=0; i<name_num; i++)
  {
    addr = base+Addr_name[i];
    if (RD(addr)==RD(str1) && RD(addr+4)==RD(str1+4))
    {
      k=Addr_func[Addr_ord[i]]; break;
    }
  }
  if (k==0)
    return -2;
  //-----------------------------
  _GetProcAddress GetProcAddress = (_GetProcAddress)(base+k);

  char str2[] = "WriteFile";
  _WriteFile WriteFile = (_WriteFile)GetProcAddress(hMod,str2);

  char str3[] = "GlobalAlloc";
  _GlobalAlloc GlobalAlloc = (_GlobalAlloc)GetProcAddress(hMod,str3);

  char str4[] = "GlobalFree";
  _GlobalFree GlobalFree = (_GlobalFree)GetProcAddress(hMod,str4);

  char str5[] = "CreateProcessA";
  _CreateProcessA CreateProcessA = (_CreateProcessA)GetProcAddress(hMod,str5);

  char str6[] = "CreateNamedPipeA";
  _CreateNamedPipeA CreateNamedPipeA = (_CreateNamedPipeA)GetProcAddress(hMod,str6);

  char str7[] = "ConnectNamedPipe";
  _ConnectNamedPipe ConnectNamedPipe = (_ConnectNamedPipe)GetProcAddress(hMod,str7);

  char str8[] = "CloseHandle";
  _CloseHandle CloseHandle = (_CloseHandle)GetProcAddress(hMod,str8);

  char str9[] = "QueryPerformanceCounter";
  _QueryPerformanceCounter QueryPerformanceCounter = (_QueryPerformanceCounter)GetProcAddress(hMod,str9);

  char str10[] = "lstrcatA";
  _lstrcatA lstrcatA = (_lstrcatA)GetProcAddress(hMod,str10);

  char str11[] = "lstrlenA";
  _lstrlenA lstrlenA = (_lstrlenA)GetProcAddress(hMod,str11);

  char str12[] = "CreateFileA";
  _CreateFileA CreateFileA = (_CreateFileA)GetProcAddress(hMod,str12);

  char str13[] = "CreateFileMappingA";
  _CreateFileMappingA CreateFileMappingA = (_CreateFileMappingA)GetProcAddress(hMod,str13);

  char str14[] = "MapViewOfFile";
  _MapViewOfFile MapViewOfFile = (_MapViewOfFile)GetProcAddress(hMod,str14);

  char str15[] = "UnmapViewOfFile";
  _UnmapViewOfFile UnmapViewOfFile = (_UnmapViewOfFile)GetProcAddress(hMod,str15);

  char str16[] = "GetFileSize";
  _GetFileSize GetFileSize = (_GetFileSize)GetProcAddress(hMod,str16);

  char str17[] = "Sleep";
  _Sleep Sleep = (_Sleep)GetProcAddress(hMod,str17);

  char str18[] = "ExitProcess";
  _ExitProcess ExitProcess = (_ExitProcess)GetProcAddress(hMod,str18);

  char str19[] = "CreateThread";
  _CreateThread CreateThread = (_CreateThread)GetProcAddress(hMod,str19);

  //-----------------------------
  if (ahk_path==0)
  {
    Sleep(1000);
    ExitProcess(0);
    return 0;
  }
  asm volatile("call aaa; aaa: pop %0":"=r"(addr));
  for(i=0; i<5000; i++, addr--)
    if ((*addr)==0xb8 && RD(addr+1)==0x66666666) break;
  if (i==5000)
    return -3;
  Param[1]=0;
  CreateThread(0, 0, (LPTHREAD_START_ROUTINE)addr, Param, 0, 0);
  //-----------------------------
  WriteFile(0, str, 0, &k, 0);
  if (k!=0)
    return -4;
  if (lstrlenA(ahk_path)>32768-30)
    return -5;
  k=(size+1)*4; if (k<32768) k=32768;
  LPDWORD hMen=(LPDWORD)GlobalAlloc(0, k);
  if (hMen==0)
    return -6;
  //-----------------------------
  // "ahk_path" /force "pipe_name" args
  //-----------------------------
  char pipe_name[] = "\\\\.\\pipe\\AHK12345678";
  LARGE_INTEGER count;
  QueryPerformanceCounter(&count);
  k=count.LowPart; j=lstrlenA(pipe_name);
  for (i=1; i<=8; i++, k>>=4)
    pipe_name[j-i]=(k&0xF)+'A';
  //-----------------------------
  LPSTR cmdline=(LPSTR)hMen; cmdline[0]='\"'; cmdline[1]=0;
  char t1[]="\" /force \"";
  lstrcatA(cmdline, ahk_path);
  lstrcatA(cmdline, t1);
  lstrcatA(cmdline, pipe_name); t1[2]=0;
  lstrcatA(cmdline, t1);
  if (lstrlenA(cmdline)+lstrlenA(args)<32768)
    lstrcatA(cmdline, args);
  //-----------------------------
  HANDLE p1=CreateNamedPipeA(pipe_name, 2, 0, 255, 0, 0, 0, 0);
  HANDLE p2=CreateNamedPipeA(pipe_name, 2, 0, 255, 0, 0, 0, 0);
  if ((HANDLE)-1 == p1 || (HANDLE)-1 == p2)
  {
    CloseHandle(p1);
    CloseHandle(p2);
    GlobalFree(hMen);
    return -7;
  }
  STARTUPINFOA si;
  PROCESS_INFORMATION pi;
  k=sizeof(STARTUPINFOA); addr=(PUCHAR)&si;
  for (i=0; i<k; i++)
    addr[i]=0;
  si.cb=k;
  if (!CreateProcessA(0, cmdline, 0,0,0, 0,0,0, &si, &pi))
  {
    CloseHandle(p1);
    CloseHandle(p2);
    GlobalFree(hMen);
    return -8;
  }
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
  for (i=0; i<size; i++)
    hMen[i]=str[i];
  hMen[i]=0;
  //-----------------------------
  HANDLE hFile, hFile2;
  LPDWORD pFile;
  hFile=CreateFileA(ahk_path, 0x80000000, 3, 0, 3, 0, 0);
  if ((HANDLE)-1 != hFile)
  {
    DWORD pSize=(GetFileSize(hFile,0)/10000)*10000/4;
    if (hFile2=CreateFileMappingA(hFile, 0, 2, 0, 0, 0))
    {
      if (pFile=(LPDWORD)MapViewOfFile(hFile2, 4, 0, 0, 0))
      {
        //-----------------------------
        // Copy the contents of Decode()
        //-----------------------------
        // My private encryption algorithm is not published here.
        // You can write your own encryption algorithm. Such as:
        unsigned int hash=0;
        for (i=0; i<pSize; i++)
          hash = hash * 31 + pFile[i];
        for (i=0; i<size; i++)
          hMen[i] = (hMen[i] ^ (hash + i)) - 666;
        //-----------------------------
        UnmapViewOfFile(pFile);
      }
      CloseHandle(hFile2);
    }
    CloseHandle(hFile);
  }
  //-----------------------------
  ConnectNamedPipe(p1, 0);
  CloseHandle(p1);
  ConnectNamedPipe(p2, 0);
  WriteFile(p2, hMen, (size+1)*4, &k, 0);
  CloseHandle(p2);
  for (i=0; i<size; i++)
    hMen[i]=0;
  GlobalFree(hMen);
  return 0;
}

//******** Encode() ********

int Encode(unsigned int * hMen, unsigned int size
  , unsigned int * pFile, unsigned int pSize)
{
  // My private encryption algorithm is not published here.
  // You can write your own encryption algorithm. Such as:
  unsigned int i, hash=0;
  for (i=0; i<pSize; i++)
    hash = hash * 31 + pFile[i];
  for (i=0; i<size; i++)
    hMen[i] = (hMen[i] + 666) ^ (hash + i);
}

//******** Decode() ********

int Decode(unsigned int * hMen, unsigned int size
  , unsigned int * pFile, unsigned int pSize)
{
  // My private encryption algorithm is not published here.
  // You can write your own encryption algorithm. Such as:
  unsigned int i, hash=0;
  for (i=0; i<pSize; i++)
    hash = hash * 31 + pFile[i];
  for (i=0; i<size; i++)
    hMen[i] = (hMen[i] ^ (hash + i)) - 666;
}

)
  return fs
}

下面是V2版本的:

/*
;-------------------------------
  AHK Source Code Encryptor v3.5  By FeiYue

  1. This tool can encrypt the AHK script into a self decode script.
     Then you can use Ahk2Exe to compile the script into a program,
     combined with mpress.exe or upx.exe packers.
     Note: To encrypt, or To compile, or To run the script,
     you must have a AutoHotkey.exe in the script directory.

  2. When you want to use the directory relative to the script, don't use
     A_ScriptFullPath, A_ScriptDir, but use A_ScriptFullPath2, A_ScriptDir2.

  3. When you want to Reload your own script, if the Reload command is fail,
     You can use Reload() function instead (it's added when encrypted).

;-------------------------------
*/

#SingleInstance force
ListLines 0
Version := "3.5"

fs:="
(`

; You can compile and set icons by using Ahk2Exe.exe.
; If AutoHotkey.exe wants to change its name to abc.exe,
; please modify Ahk:=A_ScriptDir "\abc.exe"

Ahk:=A_ScriptDir "\AutoHotkey.exe"

#NoTrayIcon
#SingleInstance off
ScriptGuard1()
ScriptGuard1()  ; By TAC109
{
  For i,ahk in ["#1", ">AUTOHOTKEY SCRIPT<"]
  if (rc:=DllCall("FindResource", "Ptr",0, "Str",ahk, "Ptr",10, "Ptr"))
  && (sz:=DllCall("SizeofResource", "Ptr",0, "Ptr",rc, "Uint"))
  && (pt:=DllCall("LoadResource", "Ptr",0, "Ptr",rc, "Ptr"))
  && (pt:=DllCall("LockResource", "Ptr",pt, "Ptr"))
  && (DllCall("VirtualProtect", "Ptr",pt, "Ptr",sz, "UInt",0x40, "UInt*",&rc))
    DllCall("RtlZeroMemory", "Ptr",pt, "UInt",sz)
}

if !(A_IsAdmin || DllCall("GetCommandLine","str")~=" /restart(?!\S)")
{
  Try
  {
    q:=Chr(34)
    if (A_IsCompiled)
      Run "*RunAs " q A_ScriptFullPath q " /restart"
    else
      Run "*RunAs " q A_AhkPath q " /restart " q A_ScriptFullPath q
  }
  ExitApp
}

s:=""
Exec(s, Ahk)
ExitApp

Exec(str, Ahk:="", args:="") {
  static MyFunc:="", base
  if (!MyFunc)
  {
    x32:="5557565381ec1c0200008bbc24300200008b1f8b433c01d866813b4d5a0f85b6"
    . "0b00008138504500000f85aa0b00008b7704668178180b01b988000000ba7800"
    . "00008b6f0c897424348b77080f45d1897424508b7710897424308b3410c78424"
    . "8c0000000000000001de89f08b4e188b761c8b50208b4024897424388944243c"
    . "31c085c98d34137512e9120b0000669083c00139c10f84050b00008b148601da"
    . "813a4765745075e8817a04726f634175df8b74243c8d04430fb704308b742438"
    . "8d04838b343085f689b4248c0000000f84cb0a0000b86500000001dec78424b2"
    . "0000005772697466898424ba0000008d8424b2000000c78424b6000000654669"
    . "6c891c2489442404ffd683ec08894424448d8424d2000000c78424d200000047"
    . "6c6f62c78424d6000000616c416cc78424da0000006c6f630089442404891c24"
    . "ffd683ec0889442458b865650000c78424bc000000476c6f6266898424c40000"
    . "008d8424bc000000c78424c0000000616c4672c68424c600000000891c248944"
    . "2404ffd683ec0889442454b873410000c7842429010000437265616689842435"
    . "0100008d842429010000c784242d01000074655072c78424310100006f636573"
    . "c68424370100000089442404891c24ffd683ec088944245c8d84246a010000c7"
    . "84246a01000043726561c784246e01000074654e61c78424720100006d656450"
    . "c784247601000069706541c684247a0100000089442404891c24ffd683ec0889"
    . "4424608d84247b010000c784247b010000436f6e6ec784247f0100006563744e"
    . "c7842483010000616d6564c784248701000050697065c684248b010000008944"
    . "2404891c24ffd683ec08894424688d8424de000000c78424de000000436c6f73"
    . "c78424e20000006548616ec78424e6000000646c650089442404891c24ffd683"
    . "ec08894424408d8424b4010000c78424b401000051756572c78424b801000079"
    . "506572c78424bc010000666f726dc78424c0010000616e6365c78424c4010000"
    . "436f756ec78424c80100007465720089442404891c24ffd683ec08894424648d"
    . "8424a0000000c78424a00000006c737472c78424a400000063617441c68424a8"
    . "0000000089442404891c24ffd683ec08894424388d8424a9000000c78424a900"
    . "00006c737472c78424ad0000006c656e41c68424b10000000089442404891c24"
    . "ffd683ec088944243c8d8424ea000000c78424ea00000043726561c78424ee00"
    . "000074654669c78424f20000006c65410089442404891c24ffd683ec08894424"
    . "6cb867410000c784248c01000043726561668984249c0100008d84248c010000"
    . "c784249001000074654669c78424940100006c654d61c7842498010000707069"
    . "6ec684249e0100000089442404891c24ffd683ec0889442470b865000000c784"
    . "241b0100004d61705666898424270100008d84241b010000c784241f01000069"
    . "65774fc78424230100006646696c891c2489442404ffd683ec08894424788d84"
    . "245a010000c784245a010000556e6d61c784245e01000070566965c784246201"
    . "0000774f6646c7842466010000696c650089442404891c24ffd683ec08894424"
    . "7c8d8424f6000000c78424f600000047657446c78424fa000000696c6553c784"
    . "24fe000000697a650089442404891c24ffd683ec0889442474b870000000c784"
    . "2492000000536c656566898424960000008d842492000000891c2489442404ff"
    . "d683ec08894424488d842402010000c784240201000045786974c78424060100"
    . "0050726f63c784240a0100006573730089442404891c24ffd683ec088944244c"
    . "8d84240e010000c784240e01000043726561c784241201000074655468c78424"
    . "1601000072656164c684241a0100000089442404891c24ffd683ec088b542434"
    . "85d20f84a1060000e8000000005a8d8a78ecffffeb158d76008dbc2700000000"
    . "83ea0139ca0f8427060000803ab875f0817a016666666675e7c7470400000000"
    . "89542408c744241400000000c744241000000000897c240cc744240400000000"
    . "c7042400000000ffd083ec188d84248c000000c744241000000000c744240800"
    . "000000896c2404c70424000000008944240cff54244483ec148b84248c000000"
    . "85c0894424480f85f60500008b442434890424ff54243c83ec043de27f00000f"
    . "8f370600008b4424308d0485040000003dff7f00008944244c0f868505000089"
    . "84248c00000089442404c7042400000000ff54245883ec0885c089c30f840406"
    . "00008d842498000000c784249f0100005c5c2e5cc78424a301000070697065c7"
    . "8424a70100005c41484bc78424ab01000031323334c78424af01000035363738"
    . "c68424b301000000890424ff54246483ec048b8424980000008db4249f010000"
    . "8934248984248c000000ff54243c83ec048d14068d7c06f88b8c248c00000090"
    . "89c883ea01c1e90483e00f83c041880239fa75ec8b442434bf20220000898c24"
    . "8c000000c60322c64301006689bc24cf000000c78424c700000022202f66c784"
    . "24cb0000006f726365c68424d10000000089442404891c24ff54243883ec088d"
    . "bc24c7000000891c24897c2404ff54243883ec0889742404891c24ff54243883"
    . "ec08897c2404c68424c900000000891c24ff54243883ec08891c24ff54243c83"
    . "ec0489c78b4c2450890c24ff54243c01c783ec0481ffff7f00000f8e4b040000"
    . "8b7c2460c744241c00000000c744241800000000c744241400000000c7442410"
    . "00000000c744240cff000000c744240800000000c744240402000000893424ff"
    . "d783ec2089442438c744241c00000000c744241800000000c744241400000000"
    . "c744241000000000c744240cff000000c744240800000000c744240402000000"
    . "893424ffd783ec2089c7837c2438ff0f843b04000083f8ff0f84320400008d8c"
    . "24cc0100008d942410020000c784248c0000004400000089c88db42600000000"
    . "c6000083c00139d075f68d842438010000c78424cc01000044000000894c2420"
    . "c744241c00000000c74424180000000089442424c744241400000000c7442410"
    . "00000000c744240c00000000c744240800000000895c2404c7042400000000ff"
    . "54245c83ec2885c00f845e0300008b8424380100008b74244089042489f0ffd0"
    . "83ec048b84243c01000089042489f0ffd083ec048b4c243085c9741d31c06690"
    . "8b54850089148383c00139c175f28b44244c83e804894424488b442448c70403"
    . "000000008b442434c744241800000000c744241400000000c744241003000000"
    . "c744240c00000000c744240803000000c744240400000080890424ff54246c83"
    . "ec1c83f8ff89c5894424340f847a010000c744240400000000890424ff542474"
    . "83ec0889c6c744241400000000c744241000000000c744240c00000000c74424"
    . "0802000000c744240400000000892c24ff54247083ec1885c08944243c0f841a"
    . "010000c744241000000000c744240c00000000c744240800000000c744240404"
    . "000000890424ff54247883ec1485c089c10f84d800000089f0ba5917b7d1c784"
    . "24480100006f000000f7e2c784244c01000071000000c7842450010000750000"
    . "00c784245401000077000000c1ea0d69c210270000c1e80285c089c5743aba6f"
    . "00000031c0eb1589f68dbc270000000089c283e2038b94944801000069d28300"
    . "000003148189c683c00183e60339c58994b44801000075d88b74243031d285f6"
    . "74438b7424308d76008dbc270000000089d083e00369ac844801000083000000"
    . "01d589ac84480100008b0493d1c029e8d1c029e88984248c00000089049383c2"
    . "0139d675cb890c24ff54247c83ec048b44243c890424ff54244083ec048b4424"
    . "34890424ff54244083ec048b7424388b6c2468c74424040000000089342489e8"
    . "ffd083ec088934248b74244089f0ffd083ec0489e8c744240400000000893c24"
    . "ffd083ec088d84248c000000c744241000000000895c2404893c248944240c8b"
    . "44244c89442408ff54244483ec1489f0893c24ffd083ec0431c08b54243085d2"
    . "741c8b5424308d76008dbc2700000000c704830000000083c00139c275f2891c"
    . "24ff54245483ec0431c081c41c0200005b5e5f5dc2040089f68dbc2700000000"
    . "b8feffffff81c41c0200005b5e5f5dc2040081c41c020000b8fdffffff5b5e5f"
    . "5dc20400c784248c00000000800000b800800000e96dfaffff81c41c020000b8"
    . "ffffffff5b5e5f5dc204008b442450891c2489442404ff54243883ec08e99efb"
    . "ffffb8fcffffffeb9cc70424e8030000ff54244883ec04c7042400000000ff54"
    . "244c31c083ec04e979ffffff8b4424388b74244089042489f0ffd083ec0489f0"
    . "893c24ffd083ec04891c24ff542454b8f8ffffff83ec04e949ffffffb8fbffff"
    . "ffe93fffffffb8faffffffe935ffffff8b4424388b74244089042489f0ffd083"
    . "ec0489f0893c24ffd083ec04891c24ff542454b8f9ffffff83ec04e905ffffff"
    x64:="4157415641554154555756534881ec280300004c8b39b8ffffffff4989c9418b"
    . "573c4c01fa6641813f4d5a0f852f0a0000813a504500000f85230a000066817a"
    . "180b01b978000000b888000000498b7110498b79084d8b7118498b5920480f44"
    . "c148897424608b040231d2c78424dc000000000000004c01f8448b50208b4818"
    . "8b701c8b68244d01fa85c97511e9e20900004883c20139d10f86d6090000418b"
    . "04924c01f881384765745075e5817804726f634175dc498d04570fb70428498d"
    . "0487448b2c304585ed4489ac24dc0000000f849d09000041b86500000048b857"
    . "7269746546696c4d01fd6644898424280100004c894c2458488d942420010000"
    . "4c89f9488984242001000041ffd5488944245048b8476c6f62616c416c488d94"
    . "24500100004c89f94889842450010000c78424580100006c6f630041ffd541b9"
    . "65650000488944247048b8476c6f62616c46726644898c2438010000488d9424"
    . "300100004c89f94889842430010000c684243a0100000041ffd541ba73410000"
    . "488944246848b843726561746550726644899424cc010000488d9424c0010000"
    . "4c89f948898424c0010000c78424c80100006f636573c68424ce0100000041ff"
    . "d5488944247848b84372656174654e61488d9424f001000048898424f0010000"
    . "48b86d656450697065414c89f948898424f8010000c68424000200000041ffd5"
    . "488984248000000048b8436f6e6e6563744e488d942410020000488984241002"
    . "000048b8616d6564506970654c89f94889842418020000c68424200200000041"
    . "ffd5488984249000000048b8436c6f736548616e488d9424600100004c89f948"
    . "89842460010000c7842468010000646c650041ffd54889c648b8517565727950"
    . "6572488d942470020000488984247002000048b8666f726d616e63654c89f948"
    . "8984247802000048b8436f756e74657200488984248002000041ffd548898424"
    . "8800000048b86c73747263617441488d9424000100004c89f948898424000100"
    . "00c68424080100000041ffd54889c548b86c7374726c656e41488d9424100100"
    . "004c89f94889842410010000c68424180100000041ffd54989c448b843726561"
    . "74654669488d9424700100004c89f94889842470010000c78424780100006c65"
    . "410041ffd5488984249800000048b8437265617465466941bb67410000488984"
    . "243002000048b86c654d617070696e6644899c2440020000488d942430020000"
    . "4c89f94889842438020000c68424420200000041ffd548898424b000000048b8"
    . "4d6170566965774f488d9424b001000048898424b0010000b8650000004c89f9"
    . "c78424b80100006646696c66898424bc01000041ffd548898424c000000048b8"
    . "556e6d6170566965488d9424d001000048898424d001000048b8774f6646696c"
    . "65004c89f948898424d801000041ffd548898424c800000048b847657446696c"
    . "6553488d9424800100004c89f94889842480010000c7842488010000697a6500"
    . "41ffd548898424b8000000b870000000488d9424e00000004c89f9c78424e000"
    . "0000536c656566898424e400000041ffd548898424a000000048b84578697450"
    . "726f63488d9424900100004c89f94889842490010000c7842498010000657373"
    . "0041ffd548898424a800000048b84372656174655468c78424a8010000726561"
    . "6448898424a0010000c68424ac01000000488d9424a00100004c89f941ffd548"
    . "85ff4c8b4c24580f84b9050000e8000000004158498d9078ecffffeb100f1f00"
    . "4983e8014939d00f846e050000418038b875ed418178016666666675e349c741"
    . "080000000031d231c948c744242800000000c744242000000000ffd0488d8424"
    . "dc0000004531c04c89f231c948c74424200000000048898424a00000004989c1"
    . "488b442450ffd08b9424dc000000b8fcffffff85d20f85e50400004889f941ff"
    . "d43de27f00000f8f540500008d049d040000003dff7f0000898424a80000000f"
    . "86dd040000898424dc00000089c231c9488b442470ffd04885c04989c50f8445"
    . "05000048b85c5c2e5c70697065488d8c24f0000000c784246002000035363738"
    . "488984245002000048b85c41484b31323334c684246402000000488984245802"
    . "0000488b842488000000ffd08b8424f0000000898424dc000000488d84245002"
    . "00004889c1488944245841ffd48b8c24dc0000008d50ff448d48f70f1f440000"
    . "89c84189d083ea0183e00fc1e90483c0414439ca428884045002000075e24c8d"
    . "bc2440010000898c24dc00000048b822202f666f726365b92022000041c64500"
    . "2241c64501004889fa66898c244801000048898424400100004c89e9c684244a"
    . "01000000ffd54c89fa4c89e9ffd5488b5424584c89e9ffd54c89fa4c89e9c684"
    . "244201000000ffd54c89e941ffd44189c7488b4c246041ffd44101c74181ffff"
    . "7f00000f8eae0300004c8b6424584531c041b9ff000000ba020000004c8bbc24"
    . "8000000048c744243800000000c744243000000000c7442428000000004c89e1"
    . "c74424200000000041ffd74889c54531c04c89e148c744243800000000c74424"
    . "300000000041b9ff000000c744242800000000c744242000000000ba02000000"
    . "41ffd74883fdff4989c40f847a0300004883f8ff0f8470030000488d8c24b002"
    . "0000c78424dc00000068000000488d51684889c8c600004883c0014839d075f4"
    . "488d84249002000048894c24404531c94531c031c9c78424b002000068000000"
    . "488944244848c7442438000000004c89ea48c744243000000000c74424280000"
    . "0000c744242000000000488b442478ffd085c00f84cc020000488b8c24900200"
    . "00ffd6488b8c2498020000ffd631c04885db742431d2662e0f1f840000000000"
    . "418b0c8641894c85008d42014839c34889c277ec48c1e00241c7440500000000"
    . "004531c94889f948c744243000000000c74424280000000041b803000000c744"
    . "242003000000ba00000080488b842498000000ffd04883f8ff4889c70f846701"
    . "000031d24889c1488b8424b8000000ffd04531c931d24189c648c74424280000"
    . "0000c74424200000000041b8020000004889f9488b8424b0000000ffd04885c0"
    . "4989c70f841b0100004531c94531c04889c148c744242000000000ba04000000"
    . "488b8424c0000000ffd04885c04989c30f84e9000000ba5917b7d14489f0c784"
    . "24e00100006f000000f7e2c78424e401000071000000c78424e8010000750000"
    . "00c78424ec01000077000000c1ea0d4469c21027000041c1e8024585c074404c"
    . "89d9b86f00000031d2eb110f1f44000089d083e0038b8484e001000069c08300"
    . "000003014189d183c2014183e1034883c1044139d04289848ce001000075d131"
    . "c031d24885db744a0f1f8400000000004189d04183e00342698c84e001000083"
    . "00000001d142898c84e00100004d8d448500418b00d1c029c8d1c029c8898424"
    . "dc0000004189008d42014839c34889c277be4c89d9488b8424c8000000ffd04c"
    . "89f9ffd64889f9ffd6488bbc249000000031d24889e94889f8ffd04889e9ffd6"
    . "31d24c89e14889f8ffd04c89ea4c8b8c24a0000000448b8424a80000004c89e1"
    . "48c744242000000000488b442450ffd04c89e1ffd631d231c04885db74166690"
    . "41c7449500000000008d50014839d34889d077ec4c89e9488b442468ffd031c0"
    . "4881c4280300005b5e5f5d415c415d415e415fc3b8feffffffebe5b8fdffffff"
    . "ebdec78424dc00000000800000ba00800000e917fbffff488b5424604c89e9ff"
    . "d5e943fcffffb9e8030000488b8424a0000000ffd0488b8424a800000031c9ff"
    . "d031c0eb9b4889e9ffd64c89e1ffd64c89e9488b442468ffd0b8f8ffffffeb80"
    . "b8fbffffffe976ffffff4889e9ffd64c89e1ffd64c89e9488b442468ffd0b8f9"
    . "ffffffe958ffffffb8faffffffe94effffff9090909090909090909090909090"
    hex:="b866666666" (A_PtrSize=8 ? x64 : x32)
    MyFunc:=Buffer(len:=StrLen(hex)//2)
    Loop len
      NumPut("uchar", "0x" SubStr(hex,2*A_Index-1,2), MyFunc, A_Index-1)
    DllCall("VirtualProtect", "Ptr",MyFunc, "Ptr",len, "uint",0x40, "Ptr*",0)
    base:=DllCall("GetModuleHandle", "Str","Kernel32", "Ptr")
    if FileExist(A_ScriptFullPath)
      EnvSet "My_ScriptFullPath", A_ScriptFullPath
  }
  if (A_IsCompiled)
    Try
      FileInstall "AutoHotkey.exe", Ahk
  Ahk:=!FileExist(Ahk) ? A_AhkPath : Ahk
  if !FileExist(Ahk)
  {
    MsgBox "Can't Find: " Ahk, "Error", 4096
    return
  }
  q:=Chr(34)
  For k,v in A_Args
    args.=" " q v q
  s:=RegExReplace(str,"\s"), RegExReplace(s,"u",,&size)
  str:=Buffer((size+1)*4), s:=SubStr(s,InStr(s,"u")+1)
  Loop Parse, s, "u"
    NumPut("uint", A_LoopField, str, (A_Index-1)*4)
  Param:=Buffer(40)
  , StrPut(v:=Ahk, p1:=StrPtr(Ahk), "CP0")
  , StrPut(v:=args, p2:=StrPtr(args), "CP0")
  For k,v in [base, p1, p2, str.Ptr, size]
    NumPut("Ptr", v, Param, A_PtrSize*(k-1))
  r:=DllCall(MyFunc, "Ptr",Param)
  return r
}

)"

if A_Args.Length
{
  Encrypt(A_Args[1])
  ExitApp
}
_Gui:=Gui("+AlwaysOnTop")
_Gui.BackColor:="DDEEFF"
_Gui.SetFont "cRed s28"
_Gui.Add "Text",, "Drag the AHK script here to Encrypt`n`n"
_Gui.Title:="AHK Source Code Encryptor v" Version "  -  By FeiYue"
_Gui.Show
_Gui.OnEvent("Close", GuiClose)
_Gui.OnEvent("DropFiles", GuiDropFiles)
OnMessage(0x201, LButton_Down)
return

LButton_Down(*) {
  SendMessage 0xA1, 2
}

GuiClose(*) {
  ExitApp
}

GuiDropFiles(GuiObj, GuiCtrlObj, FileArray, *) {
  GuiObj.Opt("+OwnDialogs")
  For i,file in FileArray
  {
    r:=MsgBox("Do you want to encrypt this file ?`n`n" file, "Tip", 4100)
    if (r="Yes")
    {
      Encrypt(file)
      MsgBox "Encryption is completed !", "Tip", 4096
    }
  }
}

Encrypt(file) {
  global fs
  Ahk:=RegExReplace(file,"[^\\]+$") "AutoHotkey.exe"
  if !FileExist(Ahk)
  {
    MsgBox "`nCan't Find:`n`n" Ahk "`n`t", "Error", 4096
    Exit
  }
  q:=Chr(34)
  s:=FileRead(file)
  s:=RegExReplace(Encode(s, Ahk), ".{1,60}", "s.=" q "$0" q "`n")
  s:=RegExReplace(fs, "i)\n[^\n]*Exec\([^\n]+\s+ExitApp", "`n" s "$0")
  f:=RegExReplace(file,"\.[^.\\]+$") . "-encoded.ahk"
  Try FileDelete f
  FileAppend RegExReplace(s,"\R","`r`n"), f, "UTF-8"
}

Encode(s, Ahk) {
  static MyFunc:=""
  if (!MyFunc)
  {
    x32:="5557565383ec108b7c24308b4c24248b5c24288b6c242cc704246f000000c744"
    . "24047100000085ffc744240875000000c744240c77000000742aba6f00000031"
    . "c0eb0889c283e2038b149469d2830000000354850089c683c00183e60339c789"
    . "14b475df31d285db742d8db60000000089d783e7036904bc830000008d34108b"
    . "04918934bc01f0d1c801f0d1c889049183c20139d375d983c41031c05b5e5f5d"
    . "c3909090909090909090909090909090"
    x64:="4883ec184585c9c704246f000000c744240471000000c744240875000000c744"
    . "240c770000007434b86f0000004531d2eb094489d083e0038b048469c0830000"
    . "004103004589d34183c2014183e3034983c0044539d14289049c75d64531c085"
    . "d274324d89c24183e2034269049483000000468d0c00428b048146890c944401"
    . "c8d1c84401c8d1c8428904814983c0014439c277ce31c04883c418c390909090"
    hex:=(A_PtrSize=8 ? x64:x32)
    MyFunc:=Buffer(len:=StrLen(hex)//2)
    Loop len
      NumPut("uchar", "0x" SubStr(hex,2*A_Index-1,2), MyFunc, A_Index-1)
    DllCall("VirtualProtect", "Ptr",MyFunc, "Ptr",len, "uint",0x40, "Ptr*",0)
  }
  add:="
  (`
;-----------------------
ListLines 0
global A_ScriptFullPath2, A_ScriptDir2
OnlyOne()
OnlyOne(flag:="") {
  global A_ScriptFullPath2, A_ScriptDir2
  file:=EnvGet("My_ScriptFullPath")
  A_ScriptFullPath2:=file, A_ScriptDir2:=RegExReplace(file, "\\[^\\]*$")
  if (file~="i)\.(exe|com|scr|bat|cmd)\s*$")
    Try TraySetIcon(file)
  Try SetWorkingDir A_ScriptDir2
  flag:=(flag="" ? file : flag)
  DetectHiddenWindows (dhw:=A_DetectHiddenWindows)?1:1
  hash:=0
  Loop Parse, flag
    hash:=(hash*31+Ord(A_LoopField))&0xFFFFFFFF
  Name:="Ahk_OnlyOne_" hash
  While Mutex:=DllCall("OpenMutex", "int",0x100000, "int",0, "str",Name)
  {
    DllCall("CloseHandle", "Ptr",Mutex)
    For k,v in WinGetList("<<" flag ">> ahk_class AutoHotkey")
    if WinExist(v)
    {
      pid:=WinGetPID()
      WinClose(,, 3)
      if WinExist()
      {
        ProcessClose pid
        ProcessWaitClose pid, 3
      }
    }
  }
  WinSetTitle "<<" flag ">>", A_ScriptHwnd
  DllCall("CreateMutex", "Ptr",0, "int",0, "str",Name)
  if (A_LastError=0xB7)
    ExitApp
  DetectHiddenWindows dhw
}
Reload(args:="") {
  q:=Chr(34)
  For k,v in A_Args
    args.=" " q v q
  file:=EnvGet("My_ScriptFullPath")
  if (file="")
    return
  Try
  if (file~="i)\.(exe|com|scr|bat|cmd)\s*$")
    Run q file q " /force " args
  else
    Run q A_AhkPath q " /force " q file q " " args
  ExitApp
}
ListLines 1
;-----------------------
  )"
  pSize:=FileGetSize(Ahk)
  pFile:=FileRead(Ahk, "RAW")
  s:="`n" add "`n" s "`n#SingleInstance off`n"
  s:=RegExReplace(s, "i)(\n\s*((Try\s|else\s|Finally\s|[^:\n]+::)\s*)?"
    . "Reload)(?=\s+;|\s*\n)", "$1()")
  s:=chr(0xfeff) . RegExReplace(s,"\R","`r`n") . "`t`t`t"
  size:=StrLen(s)*2//4
  DllCall(MyFunc, "Ptr",StrPtr(s), "uint",size
    ,"Ptr",pFile, "uint",(pSize//10000)*10000//4, "Cdecl")
  VarSetStrCapacity(&str, size*11*2), p:=StrPtr(s)-4
  Loop size
    str.="u" . NumGet(p+=4,"uint")
  return str
}


;======== The End ========

;

getfs() {
  fs:="
(`

#include <windows.h>

#define RD(addr) (*(LPDWORD)(addr))
#define RS(addr) (*(PUSHORT)(addr))

typedef HANDLE (WINAPI * _GetProcAddress)(
  HMODULE hModule,
  LPCSTR  lpProcName );

typedef BOOL (WINAPI * _WriteFile)(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped );

typedef HGLOBAL (WINAPI * _GlobalAlloc)(
  UINT   uFlags,
  SIZE_T dwBytes );

typedef HGLOBAL (WINAPI * _GlobalFree)(
  HGLOBAL hMem );

typedef BOOL (WINAPI * _CreateProcessA)(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation );

typedef HANDLE (WINAPI * _CreateNamedPipeA)(
  LPCSTR                lpName,
  DWORD                 dwOpenMode,
  DWORD                 dwPipeMode,
  DWORD                 nMaxInstances,
  DWORD                 nOutBufferSize,
  DWORD                 nInBufferSize,
  DWORD                 nDefaultTimeOut,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes );

typedef BOOL (WINAPI * _ConnectNamedPipe)(
  HANDLE       hNamedPipe,
  LPOVERLAPPED lpOverlapped );

typedef BOOL (WINAPI * _CloseHandle)(
  HANDLE hObject );

typedef BOOL (WINAPI * _QueryPerformanceCounter)(
  LARGE_INTEGER *lpPerformanceCount );

typedef LPSTR (WINAPI * _lstrcatA)(
  LPSTR  lpString1,
  LPCSTR lpString2 );

typedef int (WINAPI * _lstrlenA)(
  LPCSTR lpString );

typedef HANDLE (WINAPI * _CreateFileA)(
  LPCSTR                lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile );

typedef HANDLE (WINAPI * _CreateFileMappingA)(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCSTR                lpName );

typedef LPVOID (WINAPI * _MapViewOfFile)(
  HANDLE hFileMappingObject,
  DWORD  dwDesiredAccess,
  DWORD  dwFileOffsetHigh,
  DWORD  dwFileOffsetLow,
  SIZE_T dwNumberOfBytesToMap );

typedef BOOL (WINAPI * _UnmapViewOfFile)(
  LPCVOID lpBaseAddress );

typedef DWORD (WINAPI * _GetFileSize)(
  HANDLE  hFile,
  LPDWORD lpFileSizeHigh );

typedef void (WINAPI * _Sleep)(
  DWORD dwMilliseconds );

typedef void (WINAPI * _ExitProcess)(
  UINT uExitCode );

typedef HANDLE (WINAPI * _CreateThread)(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId );

//-----------------------------

int WINAPI DecodeAndRun(HANDLE * Param)
{
  HMODULE    hMod = (HMODULE)(Param[0]);
  LPCSTR ahk_path =  (LPCSTR)(Param[1]);
  LPCSTR     args =  (LPCSTR)(Param[2]);
  LPDWORD     str = (LPDWORD)(Param[3]);
  SIZE_T     size =  (SIZE_T)(Param[4]);
  //-----------------------------
  DWORD i, j, k;
  PUCHAR base = (PUCHAR)hMod;
  PUCHAR addr = base+RD(base+0x3C);
  if (RS(base)!=0x5A4D || RD(addr)!=0x4550) // MZ, PE00
    return -1;
  addr = base+RD(addr+(RS(addr+24)==0x10b ? 0x78:0x88));
  DWORD    name_num = RD(addr+0x18);
  LPDWORD Addr_func = (LPDWORD)(base+RD(addr+0x1C));
  LPDWORD Addr_name = (LPDWORD)(base+RD(addr+0x20));
  PUSHORT  Addr_ord = (PUSHORT)(base+RD(addr+0x24));
  char str1[] = "GetProcAddress"; k=0;
  for (i=0; i<name_num; i++)
  {
    addr = base+Addr_name[i];
    if (RD(addr)==RD(str1) && RD(addr+4)==RD(str1+4))
    {
      k=Addr_func[Addr_ord[i]]; break;
    }
  }
  if (k==0)
    return -2;
  //-----------------------------
  _GetProcAddress GetProcAddress = (_GetProcAddress)(base+k);

  char str2[] = "WriteFile";
  _WriteFile WriteFile = (_WriteFile)GetProcAddress(hMod,str2);

  char str3[] = "GlobalAlloc";
  _GlobalAlloc GlobalAlloc = (_GlobalAlloc)GetProcAddress(hMod,str3);

  char str4[] = "GlobalFree";
  _GlobalFree GlobalFree = (_GlobalFree)GetProcAddress(hMod,str4);

  char str5[] = "CreateProcessA";
  _CreateProcessA CreateProcessA = (_CreateProcessA)GetProcAddress(hMod,str5);

  char str6[] = "CreateNamedPipeA";
  _CreateNamedPipeA CreateNamedPipeA = (_CreateNamedPipeA)GetProcAddress(hMod,str6);

  char str7[] = "ConnectNamedPipe";
  _ConnectNamedPipe ConnectNamedPipe = (_ConnectNamedPipe)GetProcAddress(hMod,str7);

  char str8[] = "CloseHandle";
  _CloseHandle CloseHandle = (_CloseHandle)GetProcAddress(hMod,str8);

  char str9[] = "QueryPerformanceCounter";
  _QueryPerformanceCounter QueryPerformanceCounter = (_QueryPerformanceCounter)GetProcAddress(hMod,str9);

  char str10[] = "lstrcatA";
  _lstrcatA lstrcatA = (_lstrcatA)GetProcAddress(hMod,str10);

  char str11[] = "lstrlenA";
  _lstrlenA lstrlenA = (_lstrlenA)GetProcAddress(hMod,str11);

  char str12[] = "CreateFileA";
  _CreateFileA CreateFileA = (_CreateFileA)GetProcAddress(hMod,str12);

  char str13[] = "CreateFileMappingA";
  _CreateFileMappingA CreateFileMappingA = (_CreateFileMappingA)GetProcAddress(hMod,str13);

  char str14[] = "MapViewOfFile";
  _MapViewOfFile MapViewOfFile = (_MapViewOfFile)GetProcAddress(hMod,str14);

  char str15[] = "UnmapViewOfFile";
  _UnmapViewOfFile UnmapViewOfFile = (_UnmapViewOfFile)GetProcAddress(hMod,str15);

  char str16[] = "GetFileSize";
  _GetFileSize GetFileSize = (_GetFileSize)GetProcAddress(hMod,str16);

  char str17[] = "Sleep";
  _Sleep Sleep = (_Sleep)GetProcAddress(hMod,str17);

  char str18[] = "ExitProcess";
  _ExitProcess ExitProcess = (_ExitProcess)GetProcAddress(hMod,str18);

  char str19[] = "CreateThread";
  _CreateThread CreateThread = (_CreateThread)GetProcAddress(hMod,str19);

  //-----------------------------
  if (ahk_path==0)
  {
    Sleep(1000);
    ExitProcess(0);
    return 0;
  }
  asm volatile("call aaa; aaa: pop %0":"=r"(addr));
  for(i=0; i<5000; i++, addr--)
    if ((*addr)==0xb8 && RD(addr+1)==0x66666666) break;
  if (i==5000)
    return -3;
  Param[1]=0;
  CreateThread(0, 0, (LPTHREAD_START_ROUTINE)addr, Param, 0, 0);
  //-----------------------------
  WriteFile(0, str, 0, &k, 0);
  if (k!=0)
    return -4;
  if (lstrlenA(ahk_path)>32768-30)
    return -5;
  k=(size+1)*4; if (k<32768) k=32768;
  LPDWORD hMen=(LPDWORD)GlobalAlloc(0, k);
  if (hMen==0)
    return -6;
  //-----------------------------
  // "ahk_path" /force "pipe_name" args
  //-----------------------------
  char pipe_name[] = "\\\\.\\pipe\\AHK12345678";
  LARGE_INTEGER count;
  QueryPerformanceCounter(&count);
  k=count.LowPart; j=lstrlenA(pipe_name);
  for (i=1; i<=8; i++, k>>=4)
    pipe_name[j-i]=(k&0xF)+'A';
  //-----------------------------
  LPSTR cmdline=(LPSTR)hMen; cmdline[0]='\"'; cmdline[1]=0;
  char t1[]="\" /force \"";
  lstrcatA(cmdline, ahk_path);
  lstrcatA(cmdline, t1);
  lstrcatA(cmdline, pipe_name); t1[2]=0;
  lstrcatA(cmdline, t1);
  if (lstrlenA(cmdline)+lstrlenA(args)<32768)
    lstrcatA(cmdline, args);
  //-----------------------------
  HANDLE p1=CreateNamedPipeA(pipe_name, 2, 0, 255, 0, 0, 0, 0);
  HANDLE p2=CreateNamedPipeA(pipe_name, 2, 0, 255, 0, 0, 0, 0);
  if ((HANDLE)-1 == p1 || (HANDLE)-1 == p2)
  {
    CloseHandle(p1);
    CloseHandle(p2);
    GlobalFree(hMen);
    return -7;
  }
  STARTUPINFOA si;
  PROCESS_INFORMATION pi;
  k=sizeof(STARTUPINFOA); addr=(PUCHAR)&si;
  for (i=0; i<k; i++)
    addr[i]=0;
  si.cb=k;
  if (!CreateProcessA(0, cmdline, 0,0,0, 0,0,0, &si, &pi))
  {
    CloseHandle(p1);
    CloseHandle(p2);
    GlobalFree(hMen);
    return -8;
  }
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
  for (i=0; i<size; i++)
    hMen[i]=str[i];
  hMen[i]=0;
  //-----------------------------
  HANDLE hFile, hFile2;
  LPDWORD pFile;
  hFile=CreateFileA(ahk_path, 0x80000000, 3, 0, 3, 0, 0);
  if ((HANDLE)-1 != hFile)
  {
    DWORD pSize=(GetFileSize(hFile,0)/10000)*10000/4;
    if (hFile2=CreateFileMappingA(hFile, 0, 2, 0, 0, 0))
    {
      if (pFile=(LPDWORD)MapViewOfFile(hFile2, 4, 0, 0, 0))
      {
        //-----------------------------
        // Copy the contents of Decode()
        //-----------------------------
        // My private encryption algorithm is not published here.
        // You can write your own encryption algorithm. Such as:
        unsigned int hash=0;
        for (i=0; i<pSize; i++)
          hash = hash * 31 + pFile[i];
        for (i=0; i<size; i++)
          hMen[i] = (hMen[i] ^ (hash + i)) - 666;
        //-----------------------------
        UnmapViewOfFile(pFile);
      }
      CloseHandle(hFile2);
    }
    CloseHandle(hFile);
  }
  //-----------------------------
  ConnectNamedPipe(p1, 0);
  CloseHandle(p1);
  ConnectNamedPipe(p2, 0);
  WriteFile(p2, hMen, (size+1)*4, &k, 0);
  CloseHandle(p2);
  for (i=0; i<size; i++)
    hMen[i]=0;
  GlobalFree(hMen);
  return 0;
}

//******** Encode() ********

int Encode(unsigned int * hMen, unsigned int size
  , unsigned int * pFile, unsigned int pSize)
{
  // My private encryption algorithm is not published here.
  // You can write your own encryption algorithm. Such as:
  unsigned int i, hash=0;
  for (i=0; i<pSize; i++)
    hash = hash * 31 + pFile[i];
  for (i=0; i<size; i++)
    hMen[i] = (hMen[i] + 666) ^ (hash + i);
}

//******** Decode() ********

int Decode(unsigned int * hMen, unsigned int size
  , unsigned int * pFile, unsigned int pSize)
{
  // My private encryption algorithm is not published here.
  // You can write your own encryption algorithm. Such as:
  unsigned int i, hash=0;
  for (i=0; i<pSize; i++)
    hash = hash * 31 + pFile[i];
  for (i=0; i<size; i++)
    hMen[i] = (hMen[i] ^ (hash + i)) - 666;
}

)"
  return fs
}

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值