首页
社区
课程
招聘
请教个问题
2006-3-26 18:01 4579

请教个问题

2006-3-26 18:01
4579
00401E51  |> \6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
00401E53  |.  68 70A34300   push    0043A370                         ; |
00401E58  |.  8D4424 0C     lea     eax, [esp+C]                     ; |
00401E5C  |.  50            push    eax                              ; |Text
00401E5D  |.  6A 00         push    0                                ; |hOwner = NULL
00401E5F  |.  FF15 74954300 call    [<&USER32.MessageBoxA>]          ; \MessageBoxA

--------------------------------
call    [<&USER32.MessageBoxA>]  
这个格式是什么意思,谢谢解答

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

收藏
点赞0
打赏
分享
最新回复 (8)
雪    币: 222
活跃值: (100)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rockandtcl 3 2006-3-26 18:20
2
0
我对这个不是很了解

只是查了下API手册上的定义
MessageBoxA和MessageBox区别是在于是否支持 UNICODE
它的压栈是先进后出的
第一个 PUSH 是压入行为,正如你上所Style = MB_OK|MB_APPLMODAL
第二个 PUSH 是压入标题,如你的0043A370,0043A370是标题的地址
第三个 PUSH 是压入对话框的内容,正如你的那个,先装入地址到EAX,然后压入。
第四个 PUSH 是压入HWND表识,NULL代表无宿主窗口
然后一个CALL调用就出来了。
这是一般的汇编编程,至于那个USER32是个库。MessageBox在那有定义

另一种调用方法是罗书上讲的
invoke MessageBox,null,offset text,offset caption,0

这在汇编的书,WIN32汇编上有详细的介绍。你可以去罗云彬的论坛上看下

我也是很菜的,所以讲不清楚的地方还望见谅
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
snheart 2006-3-26 20:05
3
0
谢谢楼上的兄弟
汇编很有趣啊,以前没好好学啊,悔
关键的是上面那个CALL格式没见过
不知道和   call    004049A0  的区别是什么
各位哥哥再帮忙解答下,谢谢
雪    币: 222
活跃值: (100)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rockandtcl 3 2006-3-26 20:42
4
0
第一个是API函数调用
那个call    004049A0  可能是普通函数调用或者是过程调用
我不是很清楚。大概意思是这样的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
snheart 2006-3-26 22:14
5
0
谢谢了
我用peid查看破解文件的相关进程,发现user32是windows\systme32里面的一个文件,可能是相关的函数库吧。我大胆猜测一下可能是调用MessageBoxA的库?
但是这种CALL的格式在书里没发现。。
雪    币: 222
活跃值: (100)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rockandtcl 3 2006-3-27 12:32
6
0
那个USER32不是操作系统的
而是MASM32中INCLUDE里面的UER32.INC
一般W32ASN都要加上inluce user32.inc
MessageBoxExA在里面有定义
MessageBoxExA的定义如下:
MessageBoxExA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2006-3-27 16:09
7
0
呵呵,楼上的兄弟,那个USER32不是操作系统的?
对于windows来说,USER32一定是操作系统的(我不知道Unix或者Linux有没有这个库,所以用了“对Windows来说”)。

MessageBox有两种版本:MessageBoxA和MessageBoxW。其中MessageBoxA对应ANSI版本,MessageBoxW对应Unicode版本(也就是Wide版本,主要是为了适应东方字体的双字节而设计的)。至于两者最终的关系,你在看雪的FAQ中找一找,我不会告诉你太多,那样会使你变得懒惰,你得自己查资料并自己思考。顺便告诉你这些知识点在《Windows程序设计》第二章中也可以找到相关信息,那可真是一本不错的书。
雪    币: 222
活跃值: (100)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
rockandtcl 3 2006-3-27 19:09
8
0
最初由 happytown 发布
呵呵,楼上的兄弟,那个USER32不是操作系统的?
对于windows来说,USER32一定是操作系统的(我不知道Unix或者Linux有没有这个库,所以用了“对Windows来说”)。


谢谢楼上的
我不是说了吗?我不是很清楚,我很菜的,谢谢你的提醒。看来要好好学习了。以前做的那些只是凭感觉和运气加了点谨严和耐心,就是缺乏必要的知识。


呵呵
做cracker的五个必要条件是: 1. 知识 2. 经验 3. 感觉 4. 耐心 5. 运气 。
雪    币: 295
活跃值: (346)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
blackeyes 13 2006-3-28 02:41
9
0
最初由 snheart 发布
谢谢楼上的兄弟
汇编很有趣啊,以前没好好学啊,悔
关键的是上面那个CALL格式没见过
不知道和 call 004049A0 的区别是什么
各位哥哥再帮忙解答下,谢谢


1.) E8 xx xx xx xx  (5 字节)
    E8 + <4字节的数:offset>, call 的地址就是下一条指令的地址 + offset, 对本例而言, 就是:

00401E5F E8 3C2B0000      call 004049A0
00401E64 ...

  004049A0 = 00401E64 + 00002B3C

2.) FF15 yy yy yy yy (6 字节)
    FF15 + <4字节的数:地址>, call 的地址就是[yyyyyyy]中的值, 对本例而言, 就是:

00401E5F  |.  FF15 74954300 call    [<&USER32.MessageBoxA>]         

在 00439574 中放着 MessageBoxA 的地址.

在我的机器上, MessageBoxA的地址是77E33327. 那么结果就应该是:

00439574: 22 33 E3 77
游客
登录 | 注册 方可回帖
返回