首页
社区
课程
招聘
[原创]asm的魅力(一)
发表于: 2009-9-2 12:22 22429

[原创]asm的魅力(一)

2009-9-2 12:22
22429
流传一句话:asm对程序员灵魂有帮助(某大牛说的

asm是很美妙的语言,他会让你感受一种特殊的舒服感,希望你看了我的简短的程序之后会爱上他!

现在很多人学习asm,不管是masm,fasm,tasm,nasm...等等吧!精髓是不变的。

我建议还是不要被IDE的设计迷惑了。否则都是问题-----会masm写程序,却不懂asm。

一点不可笑..............

在此隆重感谢含笑大哥百忙之中抽时间为我解惑。我也是从masm走出来的..只是不想被局限。

下面的程序我不想多解释....懂得的人自然受启发,不懂的看了会很迷惑,不要紧,这就是我的目的,我就是要让你认识asm。

不要跟我说:你用invoke写那个多方便啊,你用call多直接啊!这些东西我也懂。

还是欢迎大牛们指导不足之处,我也在学习之中,希望能有所共鸣。谢过!!!

希望女王大哥可以看到我发的东西,想念他。废话不少了。。。。。。。。。露怯吧!!!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;编译批处理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;set path = E:\asm\tool\tasm32\tasm32\tasm32make\bin
;;set include = E:\asm\tool\tasm32\tasm32\tasm32make\include
;;set lib = E:\asm\tool\tasm32\tasm32\tasm32make\lib
;;tasm32.exe /ml /m2 charme,,,
;;tlink32.exe /Tpe /aa charme,,,E:\asm\tool\tasm32\tasm32\tasm32make\lib\import32.lib;
;;del *.bak
;;del *.map
;;del *.xrf
;;del *.obj
;;pause
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;data:2009/9/2
;;author:charme[N.B.C]
;;index:hi.baidu.com/charme000
;;email:charme000@gmail.com
;;thanks hanxiao
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


.386P
.model flat,stdcall

include E:\asm\tool\tasm32\tasm32\tasm32make\include\WINDOWS.INC

extrn            GetModuleHandleA:PROC
extrn            MessageBoxA:PROC
extrn            _wsprintfA:PROC
extrn            ExitProcess:PROC

.data
    hInst           dd    ?
    dwA            dd    0100h
    dwB            dd    0200h
    dwC            dd    ?
    szOut          db    20h dup(0)

.code
start:
   
    mov    eax, DWORD ptr [esp]
    mov    dwExit, eax
    
    xor ebx,ebx
    push    ebx
    push    offset aa                            
    push    offset GetModuleHandleA                    
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    aa:
    mov      hInst,eax
    push    dwC
    push    dwB
    push    dwA
    push    dwProc2Entry
    push    ebx
    push    ebx
    push    offset szMsg
    push    ebx
    push    dwProc1Entry
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    
_sub3:

    add      esp, 20
    pop      dwC
    push    offset _ret
    push    ebx
    push    ebx

    push    offset szMsg
    push    ebx
    push    dwProc1Entry
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]

szFmt        db    'dwC=%xh',0
_ret:
    
    push    dwC
    push    offset szFmt
    push    offset szOut
    push    offset bb
    push    offset _wsprintfA            
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    bb:
    push    ebx
    push    ebx
    push    offset szOut
    push    ebx
    push    offset cc
    push    offset  MessageBoxA
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    cc:
    push    ebx
    push    offset ee
    push    offset ExitProcess
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    ee:
    push    offset  dwExit
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]

.data
    dwProc1Entry    dd    OFFSET _sub1
    dwProc2Entry    dd    OFFSET _sub2
    dwExit               dd    ?
    szMsg                db    "子程序",0

.code
_sub1:
   
    push   offset ff
    push   offset    MessageBoxA
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    ff:
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    
_sub2:
    mov   eax,[esp]
    add   eax,[esp+4]
    mov   [esp+8],eax
    push  offset _sub3
     lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
end start
没有是么技术水品,大家将就看吧!!!很少在看雪发东西,不过这里确实藏龙卧虎!!!好地方!

附件我就不加了!!编译批处理自己修改下,用tasm32   tlink32编译链接就可以了!!!!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
支持
分享
最新回复 (25)
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
汗,写病毒的就是厉害!现在流行复古?
2009-9-2 16:59
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
3
不是复古,,只是做个研究,写程序当然是有选择的使用,,用masm方便,那就masm,,需要这样写的就这样写,,呼呼,,
2009-9-2 17:29
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
xor ebx,ebx
    push    ebx
    push    offset aa                           
    push    offset GetModuleHandleA                    
    lea esp,[esp+4]
    jmp DWORD ptr [esp-4]
    aa:

当然不是复古,不要诬陷古人,像这种猥琐的调用函数,猥琐的设置返回地址……古人才不会这么猥琐……
2009-9-2 17:35
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=Fypher;680371]xor ebx,ebx
    push    ebx
    push    offset aa                           
    push    offset GetModuleHandleA                    
    lea esp,[esp...[/QUOTE]

当然不是复古,呼呼,程序里一个call  ret  invoke  entry leave有没有用,呼呼,,古人起码还用call呢,,关键就是玩堆栈,,呼呼
2009-9-2 18:12
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
露怯  lòu qiè
  1、从言谈举止中流露出胆怯来。
  3、在害怕的人或事前流露出胆怯来。
  2、因为缺知识,言谈举止发生可笑的错误。[display one's ignorance;make a fool of oneself]

原来是这个意思,我是文盲。。
2009-9-3 01:53
0
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
确实有帮助,对程序的运行机理又加深了一些体会.
汇编菜菜鸟.路过.膜拜LZ.
2009-9-3 09:27
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
这种调用方式,怎么那么眼熟....
...又见到nbc的成员
2009-9-3 10:21
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
9
累不累啊,呵呵。
2009-9-3 10:45
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
期待 asm的魅力(二)
2009-9-3 10:54
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
11
哎,,可惜啊,,我闭关一段时间,,结果NBC老大把我版主给去掉了,,因此我就退出了,,不管了
2009-9-3 15:50
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
让堆栈来的深一点吧。怕。

什么是NBC?
2009-9-3 23:18
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
靠堆栈调用的方法比较少见,学习
2009-9-12 18:31
0
雪    币: 420
活跃值: (77)
能力值: ( LV13,RANK:500 )
在线值:
发帖
回帖
粉丝
14
不论是call ,jmp,jn,

  不过是玩EIP而已 。。
2010-6-8 11:47
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
路过 看过 标记
2010-10-24 12:25
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
路过,学习了.
2010-10-24 14:48
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这到是不错的方法,本人初学,确实只会invoke
2010-11-9 10:18
0
雪    币: 216
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
“asm的魅力”,很好的题目,很好的帖子,最近几天刚刚开始学习WIN32汇编,这篇帖子对我非常有帮助。

刚刚用了好几个小时试着跟着源程序的思路,总算完整的走了一遍,心里挺多感慨的:

1、DATA+CODE段的多分

源程序中写了两组DATA+CODE段,另外 “szFmt” 字符串的定义位置也是穿插的,这样的书写格式对我是个启发,也许可以适当选择用在自己以后的编程风格里以增加源程序的可读性。

2、子程序的调用和返回方式
.
.
PUSH...              ;传递参数
PUSH...           ;子程序返回地址(或传递参数)
PUSH...           ;子程序起始地址
LEA ESP,[ESP+4]
JMP DWORD PTR [ESP-4]

刚开始这样的格式没看懂,反复在脑子里过了几遍以后觉得越来越清晰了,而且这种使用堆栈的方式挺有意思,好像感受到了一点LZ帖子里说的 “ 玩 ” 的感觉。

3、编程思路

可能因为使用了固定的跳转和子程序调用返回模式,再加上对堆栈参数的顺序排放,整个程序模块化的感觉少了些,流畅的感觉多了些 ( 有点象打麻将时候的 “ 一条龙 ”?) 。。最后看源程序的时候,眼睛变成 “EIP”,脑子里跟着 “ESP”  。。。

可能因为看程序的时间稍微耗的长了点,现在思维比较迟钝,没办法,只能靠数字123帮着整理上面的思路了。。。LZ的 “asm的魅力”系列 还有(二)~(五)没有读,相信和这篇帖子一样精彩。哦,我用的是 RADASM 编译工具 ,“_wsprintfA”  改成  “wsprintfA”  ,     “_sub3:”   标号下面 “20 ” 改成  “8”  之后运行正常。 另外感觉好像 " ee: " 标号下面的  “push offset dwExit”  应该是  “push dwExit”。 我很菜,WIN32的asm程序才只读过iczelion教程里的第二章的消息框和第三章的简单窗口,正对API丰富的命名和更加丰富的类结构惶恐,不过在读完LZ这个程序以后,让我这个初学者对WIN32的陌生感少了一些。非常感谢您的分享,也很羡慕从这个帖子里传达着的对asm的信心和执着。 MERRY CHRISTMAS!
2010-12-25 15:20
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
研究下堆栈
2011-3-13 23:01
0
雪    币: 5047
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
标记下,初学,看不懂几句.
2011-3-13 23:18
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
不明白的地方是:
	cc:
	push	ebx
	push	offset ee
	push	offset ExitProcess
	lea	esp,[esp+4]
	jmp	DWORD ptr [esp-4]
	ee:
	push	offset dwExit
	lea	esp,[esp+4]
	jmp	DWORD ptr [esp-4]

在cc:中执行了ExitProcess后还会执行ee:标签中的jmp 原栈顶地址吗?我调试的时候发现不能。求解
2011-3-14 00:47
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=Fypher;680371]xor ebx,ebx
    push    ebx
    push    offset aa                           
    push    offset GetModuleHandleA                    
    lea esp,[esp...[/QUOTE]

的确很猥琐,LZ也真是的,贴在这里的代码还故意写成这样,嗯,不说你猥琐都不行了
2011-3-14 17:18
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
23
不得不说,超级变态
2011-3-14 22:26
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
看不懂的,进来感谢下分享精神
2011-3-15 09:09
0
雪    币: 431
活跃值: (259)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
25
这个代码风格,虽然我不甚喜欢,但表示尊重。
2011-3-16 19:40
0
游客
登录 | 注册 方可回帖
返回
//