|
|
|
|
|
|
|
.Net程序调试
帖子发起人: 手语 发起时间: 2008-12-17 13:26 下午 回复: 7
|
帖子排序:
|
|
|
|
2008-12-17, 13:26 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
|
|
今天帮同事调试一个.Net程序,结果发现一个很奇怪的问题:
同事的.Net程序通过PInvoke调用一个native exe模块(A.exe)中的函数B()。(类似于调用Dll中的函数,我不懂.Net,不知道这么描述对吗)
运行的时候发生AV。
跟踪发现B()又调用了另一个native dll模块(C.dll)中的输出函数D()。
AV发生的过程是B()通过IAT调用D(),但是IAT中D()的地址明显有问题。
通过观察IAT中附近的其他地址,我感觉这个A.exe的IAT在被load到.Net进程的地址空间的时候没有被重定位。
所以A.exe的IAT中的地址都是有问题的。
现在的问题是,这种情况有可能发生吗?是Loader的问题还是正常情况?
有什么好地解决办法?
往各路大侠指点。多谢。
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-18, 19:43 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
根据描述,涉及两个进程是吧?无论是哪个进程发生AV,都可以使用JIT调试方法在发生AV后以JIT方式附加调试器。如果是本地程序发生AV,那么WinDBG.exe -I将WinDBG设置为JIT调试器。如果是.Net程序发生AV,那么需要产生一个netapp.exe.config文件放在同一目录中,并保有如下内容:
<configuration> <system.windows.forms jitDebugging="true" /> </configuration>
如果确实需要调试.Net进程,那么使用WinDBG+SOS扩展模块可以很好的按照需要做本地调试和观察.Net的世界。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-18, 20:16 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
老雷
终于等到回复了^_^
只有一个进程,就是那个.Net程序
它把native exe (A.exe)当作dll load起来
然后调用了A.exe的输出函数B()。
我不理解的是,为什么A.exe被load到进程空间之后,没有进行重定位。
A的IAT表里全是初始值,并没有被重定位到进程中相应模块的输出函数去。
按理说,exe或者dll应该没什么区别。
当然普通exe应该不输出函数,B()是程序员特意输出的。
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-18, 20:17 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
我不太了解.Net的程序
那个写.Net的同事跟我说,他也是用LoadLibrary的方式把A.exe load到进程空间的。
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-18, 23:34 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
既然是使用LoadLibrary来加载,那么就可能根本与.Net没有关系了,即使有关系,也可以使用WinDBG将其当作本地程序来调试。记得我跟踪过更新IAT的过程,在有符号的情况下,比较好理解,所以还是建议使用调试器来找根源。或者先写个本地的小程序来Load这个特殊的EXE看有没有问题。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-19, 13:44 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
嗯,我有空就去跟一下,今天活有点忙。
刚才刚收到代码
他是这么调的
这种调用走LoadLibrary()吗?
我如果在托管进程里下LoadLibrary()的断点能拦下来吗?
[DllImport("A.exe", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, SetLastError=true)]
private static extern UInt16 B(string msgText);
public static UInt16 ShowHelp(string msgText)
{
UInt16 result = B(msgText);
return result;
}
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-19, 15:09 下午
|
手语
注册: 2008-06-06
发 贴: 73
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
依稀记得VC编译的EXE默认是不带重定位表的
这个应该就是原因吧
刚才做了个实验,跟.Net无关。
两个exe都是native的也一样。
等我想明白了再更新
鸿鹄安知燕雀之志
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-04-14, 15:04 下午
|
victor12
注册: 2010-10-11
发 贴: 5
|
Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
Golf Brilliant - Tiger Dupe 12 Review
Well it looks like even the Tiger can get out of the Woods. Every year Tiger Dupe Golf set the ambition for all over amateur in this genre. Like the John Madden amateur set the ambition for NFL Amateur Tiger Dupe has consistently set the golf clubs for sale
ambition for golf games. Admitting contempo ..should we say troubles, the Tiger has kept his top contour job with EA Sports. Afterwards all Lee Westwood golf would be boring, lets be honest!.This years Tiger Dupe golf, Tiger Dupe 12 brings you that little bit added as you can now play the Augusta masters!. The angelic beaker has assuredly TaylorMade R11 Driver
been brought to Tiger Dupe Golf. It seems that the Augusta Master accept been adored until the cartoon engine can accord this august beforehand the amends it deserves.The aboriginal affair you will apprehension about Tiger Dupe 12 is the absorption to detail as the 3D GRASS acts added like grass and the beheld presentation and annotation gives the bold that added bit of accuracy and adds to the drama.
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » .Net程序调试 » Re: 请教一个.Net程序中PInvoke的问题
|
|
|
|
|
|