首页
社区
课程
招聘
[求助]此处的or al,al 作用是什么?
发表于: 2006-9-12 20:21 6850

[求助]此处的or al,al 作用是什么?

2006-9-12 20:21
6850
一个函数中的
             lodsb   
            or    al,al
            jz    @F

这三句连起来看不懂啊,特别是or al,al,它的作用是什么?
同时程序是怎么影响ZF 标志位来 实现 JZ @F功能的?
顺便请各位大大,能看看我其他的注释写的正确吗?
麻烦了。
以下为代码部分:

_SendtoNotepad proc _lpsz
local @hWinNotepad

pushad
invoke FindWindow,addr szDestClass,NULL
;因为szDestClass db 'Notepad',0,所以FindWindow就是查看记事本是否打开了。
.if eax
;如果找到了那么返回的是记事本程序的主窗口的句柄,否则为0
mov ecx,eax ;把主窗口的句柄放入ECX
invoke ChildWindowFromPoint,ecx,20,20
;得到编辑子窗口的句柄
.endif
.if eax
mov @hWinNotepad,eax
;把主窗口的句柄放入局部变量@hWinNotepad
mov esi,_lpsz
@@:
lodsb
;ESI所指位址的内存载入一个BTYE到AL 里,会使得ESI 暂存器递少一。LODSB 之意思是loadstring byte
也就是拿ESI来记数了
or al,al
;经过lodsb从EAX中的字符串地址中取出一个字符放入AL
jz @F
;after 向下第一个@ 跳,判断ESI是否为0,当0(也就是取完时)就结束循环
movzx eax,al ;将键值扩张到32位
invoke PostMessage,@hWinNotepad,WM_CHAR,eax,1
;WM_CHAR是模拟按键的消息,向记事本主程序发送WM_CHAR消息是不行的,要向记事本客户区中的编辑子窗口发送才行,所以需要用ChildWindowFromPoint来获取编辑子窗口的句柄,EAX中是要发送的键值(内容),1为重复的次数
jmp @B ;before 向上第一个@ 跳 @@:
.endif
popad
ret

_SendtoNotepad endp @B
@@:

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
or al,al 判断 AL内是否为0 ,如果是0表示取完
则跳出循环。

是这样吗?
2006-9-12 20:35
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
但mov        esi,_lpsz
这句又是什么目的呢?
2006-9-12 20:43
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
;ESI所指位址的内存载入一个BTYE到AL 里,会使得ESI 暂存器递少一。LODSB 之意思是loadstring byte
也就是拿ESI来记数了

注释不是说得很明白吗?
2006-9-12 20:44
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
mov    @hWinNotepad,eax         
;把主窗口的句柄放入局部变量@hWinNotepad
这一句放的应该是记事本的Edit句柄。
or al,al是检测al的值,如果al为零,则下面的jz指令就跳,否则不跳。

mov esi,_lpsz ;将_lpsz保存的指向字符串的指针传给esi,为下面lodsb操作作准备。
2006-9-12 20:48
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
此处的,_lpsz在程序中也是第一次出现,应该没有值才对啊?
2006-9-12 20:51
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
_lpsz是_SendtoNotepad函数的参数,程序在调用这个函数时会将一个指向字符串的指针作为_SendtoNotepad的_lpsz参数传给函数。
2006-9-12 20:53
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
最初由 thebutterfly 发布
;ESI所指位址的内存载入一个BTYE到AL 里,会使得ESI 暂存器递少一。LODSB 之意思是loadstring byte
也就是拿ESI来记数了

注释不是说得很明白吗?


大哥,这注释本来就是我自己写的。
我是不太明白连起来的 意思

特别是mov    esi,_lpsz这句
综观程序,,_lpsz是第一出现,怎么可能会有值呢?
2006-9-12 20:56
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
最初由 小虾 发布
_lpsz是_SendtoNotepad函数的参数,程序在调用这个函数时会将一个指向字符串的指针作为_SendtoNotepad的_lpsz参数传给函数。

mov esi,_lpsz ;将_lpsz保存的指向字符串的指针传给esi,为下面lodsb操作作准备。


也就是说_lpsz会自动指向字符串???

那它如何知道指向哪个字符串呢?

2006-9-12 20:58
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
lpsz是第一出现,程序中没发现 有把它指向字符串的语句啊
2006-9-12 21:01
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
都说了,_lpsz是_SendtoNotepad函数的参数,当主程序调用该函数时,会传入一个指针给_SendtoNotepad函数的,而这个传入的这个指针_SendtoNotepad会将他保存在_lpsz参数指向的位置。
2006-9-12 21:06
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
最初由 小虾 发布
都说了,_lpsz是_SendtoNotepad函数的参数,当主程序调用该函数时,会传入一个指针给_SendtoNotepad函数的,而这个传入的这个指针_SendtoNotepad会将他保存在_lpsz参数指向的位置。


我知道它是程序给这个函数的一个指针,

但程序随机给这个指针分配一个地址指向吗??
然后再让_lpsz指向这个地址?
如果不是,那程序如何知道要把这个指针指向哪去呢?
2006-9-12 21:15
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
我想知道的是:程序如何自动并准确的让这个指针指向正确的地址

能麻烦斑竹再最后指点下吗?

我现在在牛角里,出不来了。。。
2006-9-12 21:17
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
14
函数一般是通过[ebp]来定位函数参数的,所以_lpsz是一定会指向函数传入的参数的。你上网去找找函数的实现方法你就会明白了。如函数在进入后和进入后的汇编代码如下:
进入函数前:
push _lpsz ;这是[esp]指向的就是_lpsz参数。
call _SendtoNotepad ;call _SendtoNotepad函数。

进入函数后:
push ebp ; 函数会建立堆践链
mov ebp,esp
; 将esp指针传给ebp,这时[ebp]保存的就是ebp的初始值,[ebp+4]保存的就是call的返回地址。[ebp+8]就是保存着程序传入的_lpsz参数了。在函数里,函数只需读取[ebp+8]就可以取得函数传入的第一个参数,也就是_lpsz参数。所以上面的mov esi,_lpsz反汇编后就是mov esi,[ebp+8]的语句。
2006-9-12 21:30
0
雪    币: 247
活跃值: (135)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
谢谢,解释的如此透彻。
完全明白了。。。

不光对编程有帮助啊,感觉对逆向也有了点体会。。

苦思不解,被人提点开窍后的感觉就是爽。。
2006-9-12 21:47
0
游客
登录 | 注册 方可回帖
返回
//