首页
社区
课程
招聘
[原创]windows环境下64位汇编语言程序设计
发表于: 2017-6-8 15:35 43978

[原创]windows环境下64位汇编语言程序设计

2017-6-8 15:35
43978

     进入x64时代用汇编写程序的越来越少了, 经常去的几个汇编论坛也越来越没人气. 也是,现在很少事情非得找到一个用汇编来写的理由了. 所以慢慢也就没落了.实际上32位汇编和x64汇编个人感觉差别也不大.为什么就没人用了呢..
 
     作为一个看<<Windows环境下32位汇编语言程序设计>>步入编程领域的人, 闲来无事, 就把该书的随书例子都重新翻译成x64的. 总共18章加3个附录. 为了表示向罗云斌致敬, 本文题目就叫<<Windows环境下64位汇编语言程序设计>>.
     
     x32上罗牛用的是MASM32的开发包, MASM32是一个好东西, 里面已经收集起来了开发windows程序所需要的编译器和头文件, 也都经过了较为严格的测试,总之之前我用MASM32基本没有遇到什么问题. 

     x64上,目前还没有MASM32那样的牛人来给我们收集头文件, 编译器和其他东西, 一方面可能有一些版权方面的问题, 一方面可能现在x64也不火了.没人搞这方面的工作,所以导致x64上用汇编很麻烦..难倒了很多新人. 就我在将<<Windows环境下32位汇编语言程序设计>>中的例子从32位修改到64位的过程中, 体会最深的一点就是并不是因为32位和64位寄存器大小的区别, 也不是堆栈传递参数的区别, 更不是其他的什么. 而是对齐问题. 对齐问题大部分又是因为头文件没有定义清楚. 所以我在修改的过程中. 一边写代码, 一边还要去修改头文件定义.. 很酸爽. 注意, 如果你在用x64汇编写程序的过程中遇到问题, 首先就想一想是不是对齐问题.. 现在堆栈都要按照16BYTE对齐, 不能乱搞了. 还有很多结构体也要按照16BYTE对齐. 

     为了修改<<Windows环境下32位汇编语言程序设计>>到x64上面, 我从vs2010里面copy出来了cl link rc等程序. 然后汇编器没有用vs2010的. ml64支持不了什么高级语法, 汇编想要写较大型程序必须要要有良好的结构体, 堆栈框架支持. 所以汇编器用的是开源的UASM 

     
      UASM是从之前的 JWasm 修改过来的, 这个汇编器还是开源的, 兼容MASM的语法. 另外头文件也是从JWasm那边搞过来的, 不过我加入了一些自己的私货. 比如C语言的头文件, 比如UNICODE支持. MASM32的时代我就已经找到了UNICODE支持中文办法, 不过一直没有推广出去. 如果你有幸看到这篇文章. 并且以后也会准备用汇编来写程序.. 一定不要再用老掉牙的ANSI编码, 而是要采用UNICODE来写.. 如果你用了附件我上传的开发包, 那么可以这样定义和使用UNICODE. 一种是在.const节里面定义字符串. 还有一种就向C语言一样定义字符串..  

      MASM支持中文UNICODE字符串定义
     
  ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; uasm -c -win64 Test.asm
; rc Test.rc
; Link /subsystem:windows Test.obj Test.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    option casemap:none
    option win64:2
UNICODE        equ    True   
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include     unicode.inc

includelib    user32.lib
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .const

szCaption    db    '恭喜', 0
szText        db    '当您看到这个信息的时候,您已经可以编译Win64汇编程序了!', 0
UszText        UString    ('当您看到这个信息的时候,',10,13,"您已经可以编译Win64汇编程序了", 21h, 0)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
Jmain    Proc


    ; ANSI编码调用方式
    ;invoke    MessageBox, NULL, offset szText, offset szCaption, MB_OK

    ; UNICODE调用方式
    invoke    MessageBox, NULL, offset UszText, offset UString$( "恭喜" ), MB_OK

    invoke    ExitProcess, NULL

Jmain     Endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    end    Jmain

  中文的完美支持. 依靠的就是unicode.inc 如果你下载附件的开发包,里面就已经自带了. 作者是陈浪涛. 也是个汇编高手. 有兴趣可以看看. 显然MASM的M不是Microsoft而是 Macro.. 用MASM的宏可以实现很多完全突破想象的功能, 这里有一个哥们就用MASM实现了面向对象. 有兴趣可以了解下. 
     
    
     关于附件中的例子编译方法和罗牛书上是一样的, 只是他用的是masm32 SDK包, 现在换成了UASM. UASM64压缩包解压到一个目录下, 运行目录下的set_path.bat就可以到各个例子目录下运行nmake了. 另外把TAB设置成8个BYTE. 这样显示出来的代码格式才正常. 

      //===========================================================================
     下面是我修改例子程序的时候, 遇到的一些问题. 不过都已经被解决了..

     无法接受和发送WM_COPYDATA消息, 原因是对齐方面的问题. COPYDATASTRUCT结构体必须按照16BYTE对齐. 我已经修改了winuser.inc文件, 将COPYDATASTRUCT结构体设置成了16BYTE对齐
    C:\JASM64\luoyunbin\Chapter04\SendMessage-1
     
     这个例子在win7 x64上已经试验不出效果了, 应该是win7的gdi画窗口的方式换了,不过虽然没有效果,我还是修改成了x64的版本.
     C:\JASM64\luoyunbin\Chapter07\DcCopy

     无法打开通用对话框 已修复OPENFILENAME对齐必须是16BYTE的. 所以我修改了系统的commdlg.inc后面的人就不会遇到这个坑了.
     C:\JASM64\luoyunbin\Chapter09\Richedit
     C:\JASM64\luoyunbin\Chapter10\FormatText
     
     设置结构体对齐
     pushcontext         alignment
     option fieldalign:16
     popcontext          alignment
    
     这些无法打开通用对话框的问题都是由于没有设置对齐引起的. 这个问题折腾了好久好久. 他们说现在用汇编和C差不多, 相信用C肯定不会遇到这种问题.  不禁又让我想起了以前用汇编写驱动的时候, DriverEntry写出来死活崩溃. 偶尔又不崩溃. 最好找了好久的问题才发现原来DriverEntry里面不能动ebx. 如果动了ebx就会出错, 想用的话就要push保存起来. 这些都是一路走来的坑...

     工具栏有编译错误,解决
     C:\JASM64\luoyunbin\Chapter09\Toolbar
     工具栏有编译错误,已解决
     C:\JASM64\luoyunbin\Chapter09\Wordpad
     工具栏错误解决, 主要是因为CommCtrl.inc头文件定义的有问题, 看来WinInc208 jwasm的作者还是没有masm32作者那样做那么多的测试.只是s使用h2incx工具转换好了就不管了. 这个转换难免还是有不少问题的..

     屌爆了, C:\JASM64\luoyunbin\Chapter10\FindFile 里面使用了COM接口也被我修改成了x64修改了不少的接口定义. 还修改了系统头文件的几个定义, 系统的ShlObj.INC里面关于SHBrowseForFolder等几个函数的名称粉碎方式定义错了.. 
     
     这是只适用于32位的例子.关于内存申请方面测试的例子, 所以就不修改了
     C:\JASM64\luoyunbin\Chapter10\Fragment


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 15
支持
分享
最新回复 (50)
雪    币: 6976
活跃值: (1482)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2

沙发自己占!!!

2017-6-8 15:36
0
雪    币: 3407
活跃值: (1242)
能力值: ( LV13,RANK:335 )
在线值:
发帖
回帖
粉丝
3
板凳~
2017-6-8 15:48
0
雪    币: 615
活跃值: (585)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
支持下群主,需要的时候再来细看下,
2017-6-8 15:57
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
讚好
2017-6-8 16:00
0
雪    币: 357
活跃值: (3438)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
6
最近搞技术的又活跃起来了,好事
2017-6-8 17:30
0
雪    币: 6575
活跃值: (4531)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
不错,学习
2017-6-8 18:47
0
雪    币: 1203
活跃值: (1249)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
附件密码多少
2017-6-8 19:21
0
雪    币: 17049
活跃值: (4318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持啊~!学习一下~!感谢分享~!
2017-6-8 19:48
0
雪    币: 1692
活跃值: (2292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
必须要顶
2017-6-8 19:56
0
雪    币: 4
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
赞,感谢分享,现在学习64位汇编的高质量入门材料真心不多
2017-6-9 00:07
0
雪    币: 12688
活跃值: (4294)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
佩服~~谢谢分享
2017-6-9 00:26
0
雪    币: 354
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
赞赞攒
2017-6-13 07:32
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
学习一下,mark,感谢分享
2017-6-13 09:00
0
雪    币: 69
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持了!!!!
2017-6-13 12:21
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
郭兴华 附件密码多少
写着都看不到?
2017-6-23 20:42
0
雪    币: 22
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
有masm32的64头文件了,你bing搜下,记得再masm32论坛里,老外写的
2017-7-28 17:26
1
雪    币: 204
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持支持
2017-7-28 17:32
0
雪    币: 1203
活跃值: (1249)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
windows环境下64位汇编语言程序设计-密码1.7z 
的密码是什么
2017-8-20 17:28
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
2017-8-23 13:51
0
雪    币: 411
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
干脆做成中文的吧
2017-8-23 18:01
0
雪    币: 1573
活跃值: (198)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
想知道  NASM编译器怎么样?
2017-9-12 22:19
1
雪    币: 4112
活跃值: (1213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
郭兴华 windows环境下64位汇编语言程序设计-密码1.7z 的密码是什么
密码是1
2017-11-5 15:35
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
\JASM64\luoyunbin\Chapter09\Wordpad
_SetFont  里        mov        @stCf.crTextColor,0FFFFFFH
改变不了颜色为什么啊
_Init  里           invoke        RegisterWindowMessage,addr  ;szFINDMSGSTRING=>stFind????查找功能也用不了    能帮帮看看吗
2017-11-18 16:20
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
_SetFont proc _lpszFont:qword,_dwFontSize,_dwColor
local @stCf:CHARFORMAT

invoke RtlZeroMemory,addr @stCf,sizeof @stCf
mov @stCf.cbSize,sizeof @stCf
mov @stCf.dwMask,CFM_SIZE or CFM_FACE or CFM_BOLD or CFM_COLOR
mov eax,_dwFontSize
mov @stCf.yHeight,eax
mov eax,_dwColor
mov @stCf.crTextColor,0FFFFFFH ;???
mov @stCf.dwEffects,not CFE_AUTOCOLOR ;???
invoke lstrcpy,addr @stCf.szFaceName,_lpszFont
invoke SendMessage,hWinEdit,EM_SETTEXTMODE,1,0
invoke SendMessage,hWinEdit,EM_SETCHARFORMAT,SCF_ALL,addr @stCf    ??? EM_SETCHARFORMAT 这个消息根本不起作用,
ret

_SetFont endp                  CHARFORMAT这里面的值 我都用遍了 每一个有效果的  有时间的话能不能帮看看
2017-11-18 22:27
0
游客
登录 | 注册 方可回帖
返回
//