硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1383|回复: 7
收起左侧

[MDK] 解决MDK Encountered an improper 卡死BUG

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2024-8-1 16:11:01 | 显示全部楼层 |阅读模式
本帖最后由 gucha2020 于 2024-8-1 16:24 编辑

        MDK不时遇到Encountered an improper,编译器弹窗后然后卡死,只能任务管理器强行关闭才行。
逆向了一下主文件, 屏蔽 这个卡死问题(具体就是检测到MessageBox内容的前4字节为 Enco,则屏蔽弹窗)。
由于用的是MDK5.36,建议安装MDK5.36后使用附件文件。

使用方法.rar

3.64 MB, 下载次数: 35

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2024-8-1 16:15:35 | 显示全部楼层
刚才附件没上传成功。这里添加附件
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-8-1 16:53:31 | 显示全部楼层
楼主厉害,
回复

使用道具 举报

22

主题

40

回帖

106

积分

初级会员

积分
106
发表于 2024-8-1 17:19:45 | 显示全部楼层
不知道方法是否很复杂,如果不复杂,楼主可以分享一下方法,便于大家自行修改对应版本吗~
回复

使用道具 举报

0

主题

18

回帖

18

积分

新手上路

积分
18
发表于 2024-8-1 20:51:02 | 显示全部楼层
持续关注本帖
回复

使用道具 举报

2

主题

77

回帖

88

积分

初级会员

积分
88
发表于 2024-8-1 20:54:11 | 显示全部楼层
刚好用的5.36,感谢分享
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2024-8-2 08:45:17 | 显示全部楼层
eoorosy 发表于 2024-8-1 17:19
不知道方法是否很复杂,如果不复杂,楼主可以分享一下方法,便于大家自行修改对应版本吗~

有个简单点的方法,修改一行代码,屏蔽所有弹窗。也可以用。
仿真器拔掉,MDK点击仿真,会弹窗报错。点击确定,关闭MDK。
下载一个调试器,olldbg 1.1版本(2.0不好用)。
od文件打开安装文件夹下的UV4.EXE。F9全速运行,好了,现在看到MDK重新打开。
输入下断点命令:BP  MessageBoxA ,然后点击MDK 仿真按钮,MessageBoxA被拦截下来。
回到OD,双击取消这个断点。
然后ALT+F9 或 运行 OD 调试的运行到用户代码。目的是恢复到用户程序领空。
会看到这样代码:
00841880  /$  53            push ebx
00841881  |.  8BDC          mov ebx,esp
00841883  |.  83EC 08       sub esp,0x8
00841886  |.  83E4 F8       and esp,0xFFFFFFF8
00841889  |.  83C4 04       add esp,0x4
0084188C  |.  55            push ebp
0084188D  |.  8B6B 04       mov ebp,dword ptr ds:[ebx+0x4]
00841890  |.  896C24 04     mov dword ptr ss:[esp+0x4],ebp
00841894  |.  8BEC          mov ebp,esp
00841896  |.  A1 386FDD02   mov eax,dword ptr ds:[0x2DD6F38]
0084189B  |.  83EC 08       sub esp,0x8
0084189E  |.  56            push esi
0084189F  |.  8BF1          mov esi,ecx
008418A1  |.  57            push edi
008418A2  |.  33FF          xor edi,edi
008418A4  |.  397E 1C       cmp dword ptr ds:[esi+0x1C],edi
008418A7  |.  0F84 B3000000 je UV41.00841960

UV4在好几个地方会调用系统API messagebox,但是这个地方报错和Encountered。。。报错是调用的同一个函数。拔掉仿真器弹窗目的是好定位,因为Encountered。。。弹窗,需要运行才会遇到

你们调试的可能某些值不一样,
这里把je UV41.00841960  改成 jmp UV41.00841960   即可,只把前面的je改成jmp,你调试后面的地址未必也是 UV41.00841960,没关系。
然后鼠标右键--》复制到可执行文件--》所有修改--》全部复制---》保存文件
即可。
之后用这个EXE仿真即可。在点击仿真,发现没有弹窗报错了,无论是Encountered 还是其他弹窗均没有了。

这是最简单办法,也不影响使用。
如果要优化一下,只拦截 Encountered 。。。的弹窗,用OD打开上传的文件,比对一下,看插入了哪些代码,要注意的有些地方不一样,主要是跳转或CALL指令后面的常数,需要根据调试的值调整,OD会根据输入的常数,自动计算偏移地址。
回复

使用道具 举报

82

主题

510

回帖

756

积分

金牌会员

积分
756
发表于 2024-10-25 17:36:44 | 显示全部楼层
mdk真实一言难尽,要不是芯片厂商没有iar的支持,我都懒得用mdk,我也碰到了这个问题,目录和文件都英文,还是避免不了,只能终结进程,然后再次调试,程序都进不了main了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 12:25 , Processed in 0.284697 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表