|

本帖最后由 Kode 于 2025-3-17 14:25 编辑
问题背景:
数组报错,定位错误位置。之前遇到一个易友,在有的电脑可以正常运行,有的电脑会报数组错误,知道是数组报错,但不知道是哪个数组错了,由于在别人电脑又不方便把源码传过去,自己写输出日志调试定位等等又太麻烦。可以参考下面这种方式,快速定位数组报错的位置。
问题展示:
数组成员引用下标超出定义范围。
定位原理:
易语言静态编译的程序,在编译的时候,编译器会自动帮你添加检查数组下标是否越界等等代码。如果越界,则会弹出如上图所示的信息,里面标示了错误代码、以及一些定位标志。
```
0040104B 8B5D FC mov ebx, dword ptr [ebp-0x4] ; 数组地址
0040104E E8 B1FFFFFF call 00401004 ; 取成员数
00401053 B8 01000000 mov eax, 0x1 ; 引用下标,从0开始,1是第二个成员
00401058 3BC1 cmp eax, ecx ; 总成员数和引用成员下标进行比较
0040105A 7C 17 jl short 00401073 ; 如果超过范围则调用下面的提示
0040105C 68 00000000 push 0x0
00401061 68 1C330104 push 0x401331C ; 定位标志
00401066 68 01000000 push 0x1
0040106B E8 62010000 call 004011D2 ; 弹出提示
00401070 83C4 0C add esp, 0xC
00401073 C1E0 02 shl eax, 0x2
00401076 03D8 add ebx, eax
00401078 895D F8 mov dword ptr [ebp-0x8], ebx ; 通过下标计算的成员地址
```
定位方法:
别人在使用软件的过程中,出现如上图所示报错,那么记录下来定位标志:67187484
打开计算器,得到67187484的十六进制:04 01 33 1C
端顺翻转之后 得到 1C 33 01 04
再在前面加上:68 , 最终得到:68 1C 33 01 04
打开Ollydebug.exe,加载你的软件,在CPU窗口中按快捷键Ctrl+B,然后输入上面的标志
便可以来到弹出报错的位置:
随后,可以用鼠标滚轮,查看一下上下文。或者搜索一下中文字符串,看看附近有哪些字符串可以用于在源码中定位。
本文例子中,有取硬盘特征字这个函数可以作为定位特征,在源码中搜索,可以到达报错附近位置。
如果看完本文,还是不会操作,可以在帖子下面留言或者加入QQ群:500002537 交流讨论。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|