📄 program-crack-mtv-detail.html
字号:
<br> 0804a4c4 fl_add_menu
<br> 0804a4d4 fl_use_fselector
<br> 0804a4e4 __errno_location
<br> 0804a4f4 exit
<br> 0804a504 fl_get_filename
<br> 0804a514 __fxstat
<br> 0804a524 fl_add_timer
<br> 0804a534 fl_set_object_resize
<br> 0804a544 open
<br> 0804a554 fl_set_object_lalign
<br> 0804a564 fl_get_directory
<br> 0804a574 fl_show_choice
<br> 0804a584 fl_set_slider_size
<br> 0804a594 fputs
<br> 0804a5a4 execvp
<br> 0804a5b4 fl_get_counter_value
<br> 0804a5c4 close
<br> 0804a5d4 XOpenDisplay
<br> 0804a5e4 free
<br> 0804a604 fl_set_button
<br> 0804a614 _start
<br> 08052e7c whereError
<br> 080583c0 _fini
<br> mtv用到了xforms库,fl_xxxx都是这个库里的函数, 其中的哪个fl_get_input是
<br>这么的显眼, 虽然没有做过xforms的编程,但是可以大胆设想这个东东会不会类似
<br>windows中的GetDlgItemText(GetDlgItemTextA), 所以不妨试试
<p>(gdb)break fl_get_input
<br>Breakpoint 1 at 0x804a264
<br>(gdb)r
<br>Starting program: /usr/X11R6/bin/mtv
<br>(no debugging symbols found)...Breakpoint 1 at 0x400429e3
<p>出现填写注册信息对话框, 我做如下输入
<p>Name: I007
<br>Order number: B123456789 (有editmask,只能一字母后跟字数)
<br>Key: 87654321 (也有editmask)
<p>按OK键后, mtv果然在断点处停住, 猜得不错. 如果没猜中, 只好慢慢跟踪罗
<br>(no debugging symbols found)...(no debugging symbols found)...
<br>Breakpoint 1, 0x400429e3 in fl_get_input ()
<br>(gdb)
<p>继续让它运行...
<br>(gdb) c
<br>Continuing.
<p>Breakpoint 1, 0x400429e3 in fl_get_input ()
<br>(gdb) c
<br>Continuing.
<p>Breakpoint 1, 0x400429e3 in fl_get_input ()
<br>(gdb) c
<br>Continuing.
<p>它连续调用了fl_get_input三次, 正好对应三个输入项, 然后注册信息错误的
<br>对话框就出现了, 看来是没错了, 现在关键是要看最后一次调用fl_get_input
<br>后的代码,当然看它每次调用fl_get_input后到取回的字串放到了什么地地方
<br>也很重要.我重新输入一次注册信息,然后让它在三次调用fl_get_input后的
<br>情况:
<br>(gdb) c
<br>Continuing.
<p>Breakpoint 1, 0x400429e3 in fl_get_input ()
<br>(gdb) bt
<br>#0 0x400429e3 in fl_get_input ()
<br>#1 0x804ea96 in _start ()
<br>#2 0x4003b5f5 in fl_do_forms ()
<br>#3 0x8050a59 in _start ()
<p>这是堆栈中的情况, 看来调用完fl_get_input后应返回到_start中的
<br>地址0x804ea96处, 我们来看看这段代码
<br>(gdb) disass 0x804ea96 0x804ffff
<br>Dump of assembler code from 0x804ea96 to 0x804ffff:
<br>0x804ea96 <_start+17538>: movl
%eax,0x806e584
<br>0x804ea9b <_start+17543>: pushl
%eax
<br>0x804ea9c <_start+17544>: movl
0x806e9d4,%eax
<br>0x804eaa1 <_start+17549>: movl
0x18(%eax),%ecx
<br>0x804eaa4 <_start+17552>: pushl
%ecx
<br>0x804eaa5 <_start+17553>: call
0x804a264 <fl_get_input> <-第二次
<br>0x804eaaa <_start+17558>: movl
%eax,%ebp
<br>0x804eaac <_start+17560>: movl
0x806e9d4,%eax
<br>0x804eab1 <_start+17565>: pushl
%eax
<br>0x804eab2 <_start+17566>: movl
0x10(%eax),%edx
<br>0x804eab5 <_start+17569>: pushl
%edx
<br>0x804eab6 <_start+17570>: call
0x804a264 <fl_get_input> <-第三次
<br>0x804eabb <_start+17575>: movl
%eax,%ebx
<br>0x804eabd <_start+17577>: movl
%ebp,%edx
<br>0x804eabf <_start+17579>: movl
%ebp,%eax
<br>0x804eac1 <_start+17581>: addl
$0x18,%esp
<br>0x804eac4 <_start+17584>: andl
$0x3,%edx
<br>0x804eac7 <_start+17587>: je
0x804eadf <_start+17611>
<br>0x804eac9 <_start+17589>: jp
0x804eada <_start+17606>
<br>0x804eacb <_start+17591>: cmpl
$0x2,%edx
<br>0x804eace <_start+17594>: je
0x804ead5 <_start+17601>
<br>0x804ead0 <_start+17596>: cmpb
%dh,(%eax)
<br>....
<br>(gdb) break *0x804ea96
<br>Breakpoint 2 at 0x804ea96
<br>(gdb) c
<br>Continuing.
<p>Breakpoint 2, 0x804ea96 in _start ()
<br>(gdb) info reg eax
<br>eax
0x8083dd0 134757840
<br>(gdb) x/s 0x8083dd0
<br>0x8083dd0: "I007"
<p>看来 "I007" 放在 0x8083dd0, 这个地址还存放到了 0x806e584
<p>(gdb) ni
<br>....
<p>到第三次调用fl_get_input完回到0x804eabb时,我们知道了输入的信息存在在哪
<p>名称
值
地址
<br>Name
"I007" 0x8083dd0
<br>Order number "B123456789" 0x809e850
<br>Key
"87654321" 0x809e880
<p>以下的一些反汇编代码中会有一些注释, 主要说明是执行到这样地方时一些情况,
<br>也不一步步的ni了..
<br>(gdb) disass 0x804eabb 0x804ffff
<br>Dump of assembler code from 0x804eabb to 0x804ffff:
<br>0x804eabb <_start+17575>: movl
%eax,%ebx (eax: 0x809e880->""87654321")
<p>0x804eabd <_start+17577>: movl
%ebp,%edx (ebp: 0x809e850->"B123456789"
<br>)
<br>0x804eabf <_start+17579>: movl
%ebp,%eax
<br>0x804eac1 <_start+17581>: addl
$0x18,%esp
<br>0x804eac4 <_start+17584>: andl
$0x3,%edx
<br>0x804eac7 <_start+17587>: je
0x804eadf <_start+17611> --
<br>0x804eac9 <_start+17589>: jp
0x804eada <_start+17606> |
<br>0x804eacb <_start+17591>: cmpl
$0x2,%edx
|
<br>0x804eace <_start+17594>: je
0x804ead5 <_start+17601> |
<br>0x804ead0 <_start+17596>: cmpb
%dh,(%eax)
|
<br>0x804ead2 <_start+17598>: je
0x804eb05 <_start+17649> |
<br>0x804ead4 <_start+17600>: incl
%eax
|
<br>0x804ead5 <_start+17601>: cmpb
%dh,(%eax)
|
<br>0x804ead7 <_start+17603>: je
0x804eb05 <_start+17649> |
<br>0x804ead9 <_start+17605>: incl
%eax
|
<br>0x804eada <_start+17606>: cmpb
%dh,(%eax)
|
<br>0x804eadc <_start+17608>: je
0x804eb05 <_start+17649> |
<br>0x804eade <_start+17610>: incl
%eax
|
<br>
|
<br>以下检查Order number长度是否为10:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -