发表回复 
【AHK机器码生成器】 v1.5
2016-05-31, 01 : 49 (这个帖子最后修改于: 2016-05-31 22 : 12 by feiyue.)
Heart 【AHK机器码生成器】 v1.5
最早在官网发现了AHK机器码的使用,感到机器码真是个神器,大神们太强了,
惊为天人,极为仰慕。后来认识到许多脚本语言都是借助机器码来提速,解决
脚本语言循环比较、内存操作、动态执行效率不高的弱点(尤其在图像处理中)。

可惜看了官网对MCode的介绍,需要先下载安装VC或者GCC,还有各种参数配置,
总感觉很难,因此很长时间都没有使用过。

俗话说“天下无难事,只怕有心人”,我慢慢去尝试怎么转化机器码,通过上网
查询及自己实践,成功实现了自己写C语言代码并快速转化为机器码(MCode),
真令人高兴。现在我把最简单的转化方式分享给大家,让大家也来使用机器码。

代码: (全选)
;===========================================
;   【AHK机器码生成器】 v1.5  By FeiYue
;
;   使用方法:
;
;   1、下载安装 TDM-GCC 64位版 到默认的目录,下载网址为:
;      https://sourceforge.net/projects/tdm-gcc/files/latest/download
;
;   2、鼠标选择C代码,再按【 Alt+C 】热键生成代码,或者在AHK程序目录
;      把C代码保存到5.c文件,然后按【 Ctrl+Alt+C 】热键生成代码
;
;===========================================


!c::    ; 选择C代码后按热键

^!c::   ; 将C代码保存为5.c后按热键

SetWorkingDir, % RegExReplace(A_AhkPath,"\\[^\\]+$")
if A_ThisLabel=!c
{
  ClipSaved:=ClipboardAll
  Clipboard=
  Send {Ctrl Down}c{CtrlUp}
  ClipWait, 3
  s:=Clipboard, Clipboard:=ClipSaved
  if s=
  {
    MsgBox, 4096, 错误, 选择并复制的内容为空!
    Exit
  }
  FileDelete, 5.c
  FileAppend, %s%, 5.c
}
IfNotExist, 5.c
{
  MsgBox, 4096, 错误, 5.c 没有找到!
  Exit
}
exe1=C:\TDM-GCC-64\bin\gcc.exe
exe2=C:\TDM-GCC-64\bin\objcopy.exe
IfNotExist, %exe1%
{
  MsgBox, 4096, 错误, GCC没有安装好,%exe1% 找不到!
  Exit
}
Loop, 2 {
  i:=A_Index, m:=i=1 ? "-m32" : "-m64"
  RunWait, %ComSpec% /c "%exe1%" %m% -c -o 5.obj 5.c 2>5.log,, Hide
  IfNotExist, 5.obj
  {
    FileRead, s, 5.log
    FileDelete, 5.log
    MsgBox, 4096, GCC编译发现错误, %s%  ; 提示编译错误信息
    Exit
  }
  RunWait, %exe2% -j .text -O binary 5.obj 5.bin,, Hide
  s%i%:=RegExReplace("   " . bin2hex("5.bin")
    , ".{1,50}", "`r`n    . ""$0""")
  FileDelete, 5.obj
  FileDelete, 5.bin
  FileDelete, 5.log
}
MsgBox, 4096, 机器码制作成功(32位 + 64位 二合一)
  , % Clipboard:=StrReplace(s1,". ""   ","x32:=""","",1)
  . StrReplace(s2,". ""   ","x64:=""","",1)
  . "`r`n    MCode(MyFunc, A_PtrSize=8 ? x64:x32)"
s:=s1:=s2:=""
Return

bin2hex(file) {
  IfNotExist, %file%, Return
  VarSetCapacity(bin,0), hex:=""
  FileRead, bin, *c %file%
  bch:=A_BatchLines
  SetBatchLines, -1
  fmt:=A_FormatInteger
  SetFormat, IntegerFast, H
  Loop, % VarSetCapacity(bin)
    hex.=SubStr(0x100+NumGet(bin,A_Index-1,"uchar"),-1)
  SetFormat, IntegerFast, %fmt%
  SetBatchLines, %bch%
  Return, hex
}

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

;
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢feiyue
2016-05-31, 08 : 30 (这个帖子最后修改于: 2016-05-31 22 : 13 by feiyue.)
RE: 【AHK机器码生成器】 v1.5
下面是一个AHK 应用 MCode 的简单例子,使用C语言返回 Hello World 字符串:

代码: (全选)
Msgbox, % helloWorld()

helloWorld() {
  static MyFunc  ; 利用静态变量使机器码在Ahk运行期间长期保留
  if !MyFunc
  {
    x32:="5589E58B45088D5001895508C600488B45088D500189550"
    . "8C600658B45088D5001895508C6006C8B45088D5001895508C"
    . "6006C8B45088D5001895508C6006F8B45088D5001895508C60"
    . "0208B45088D5001895508C600578B45088D5001895508C6006"
    . "F8B45088D5001895508C600728B45088D5001895508C6006C8"
    . "B45088D5001895508C600648B45088D5001895508C600218B4"
    . "5088D5001895508C60000905DC39090"
    x64:="554889E548894D10488B4510488D500148895510C600484"
    . "88B4510488D500148895510C60065488B4510488D500148895"
    . "510C6006C488B4510488D500148895510C6006C488B4510488"
    . "D500148895510C6006F488B4510488D500148895510C600204"
    . "88B4510488D500148895510C60057488B4510488D500148895"
    . "510C6006F488B4510488D500148895510C60072488B4510488"
    . "D500148895510C6006C488B4510488D500148895510C600644"
    . "88B4510488D500148895510C60021488B4510488D500148895"
    . "510C60000905DC39090"
    MCode(MyFunc, A_PtrSize=8 ? x64:x32)
  }
  VarSetCapacity(s, 100, 0)  ; C代码中用到的内存由AHK申请并传入内存地址
  DllCall(&MyFunc, "ptr",&s, "Cdecl")  ; 明确使用C调用约定
  Return, StrGet(&s,"CP0")  ; C函数生成的AscII字符串要用StrGet读取
}

MCode(ByRef code, hex)
{
  ListLines, Off
  bch:=A_BatchLines
  SetBatchLines, -1
  VarSetCapacity(code, StrLen(hex)//2)
  Loop, % StrLen(hex)//2
    NumPut("0x" . SubStr(hex,2*A_Index-1,2), code, A_Index-1, "char")
  Ptr:=A_PtrSize ? "Ptr" : "UInt"
  DllCall("VirtualProtect", Ptr,&code, Ptr
    ,VarSetCapacity(code), "uint",0x40, Ptr . "*",0)
  SetBatchLines, %bch%
  ListLines, On
}


/****** C语言源代码 ******

void helloworld(char * s) {
  *s++='H'; *s++='e'; *s++='l';
  *s++='l'; *s++='o'; *s++=' ';
  *s++='W'; *s++='o'; *s++='r';
  *s++='l'; *s++='d'; *s++='!';
  *s++='\0';  //字符串以'\0'结束
}

*/
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 2用户表示感谢feiyue
2016-06-29, 20 : 44
RE: 【AHK机器码生成器】 v1.5
支持下,虽然不知道怎么用……
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-07-26, 23 : 56
【AHK机器码生成器】 v1.5
感谢分享,学习下


从我的 iPhone 发送,使用 Tapatalk
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合