首页
社区
课程
招聘
[原创]逆向让生活更美好之调用 MessageBox引发的异常
发表于: 2014-2-13 21:31 5295

[原创]逆向让生活更美好之调用 MessageBox引发的异常

2014-2-13 21:31
5295
问题简述:
在调试一个小程序,在测试时发现,点“帮助”信息的“关于”,程序异常退出,由于物理机为WIN8 X64环境,没有看到任何异常信息。
把文件复制到虚拟机XP系统下,再次编译运行,点“关于”时,轰然一声弹出如下熟悉的面孔(上图难,请见谅)

0x77d28944指令引用“0x0000006d”地址内存,该内存为能为“read”

还是那句话,上调试器,等下,先IDA看看,这段代码偏奇怪
cmp     eax, 271Dh
.text:0040135F                 jnz     short loc_401394
.text:00401361                 push    0
.text:00401363                 push    0
.text:00401365                 mov     al, byte ptr Caption ; "myedit"
.text:0040136A                 movzx   ax, al
.text:0040136E                 push    ax              ; lpCaption
.text:00401370                 push    offset aRN        ; "我的文本编辑?
.text:00401375                 push    [ebp+hWnd]      ; hWnd
.text:00401378                 call    MessageBoxA
.text:0040137D                 jmp     short loc_401394


MessageBox可不是这么玩的,反汇编处理的MessageBox需要4个push,1个call

push  xx
push  xx
push  xx
push  xx
call   MessageBox


这下真上调试器,在MessageBox上下断点,栈区看见如下字样:
hOwner = 04000000
Text = "我的文本编辑器"
Title = "0000006d"
style = MB_OK|MB_APPLMODAL
LANGUAGE ID = 0 (LANG_NEUTRAL)


Title处竟然是地址,这下大概明白问题所在了,应该是在调用MessageBox时,参数的问题。
用win32asm写一段代码来测试下

    .386
    .model flat,stdcall
    option    casemap:none
;include   
include     windows.inc
include        user32.inc
include        kernel32.inc
includelib  user32.lib
includelib  kernel32.lib
;数据段
    .data
szcaption    db    "demo",0   
szText        db    "HelloWorld",0
   
    .data?
   
    .const
;代码段   
    .code
start:
    invoke MessageBox,NULL,offset szText, offset szcaption,MB_OK
    invoke ExitProcess,NULL
end start
   
问题出在offset上 ,把offset去掉再进行编译,链接,在radasm开发工具里并不会报错,反汇编出来的代码就是上面那段,纠正后用IDA查看正确的是下面的模样:

.text:00401356                 push    0               
.text:00401358                 push    offset Caption  
.text:0040135D                 push    offset aRN      
.text:00401362                 push    [ebp+hWnd]      
.text:00401365                 call    MessageBoxA

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 110
活跃值: (204)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
MessageBox第二三个参数本来就是字符串的地址啊,你把取地址的OFFSET去掉了的话,程序就把原本是字符串的数据当做地址,再根据这个地址去读它指向的字符串,当然就会出现内存错误了呀
2014-2-14 10:03
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没错啊,这是有点小儿科了
2014-2-14 10:15
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看不懂汇编。
2014-2-14 13:26
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这完全不是逆向让生活更美好,完全是一般的调试而已
而且现代编译器是不可能编译出这样的代码而没有任何提示的,所以楼主肯定是在弄汇编程序
汇编语言的逆向有个球的意义啊
2014-2-15 09:10
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
这种扯蛋的错误,除非人为故意,否则c++编译器编译不出
2014-2-15 09:20
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
用汇编,生活当然不美好,用c或者直接易语言,活得才够滋润.
2014-2-15 09:22
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
夯实基础,另实在不会易语言
2014-2-15 11:08
0
游客
登录 | 注册 方可回帖
返回
//