没有pdb也要定位问题:一次注入崩溃的定位过程
2015-01-27 19:13
267 查看
最近遇到一个注入过程中崩溃的问题,花了比较长的时间定位,写下来记录一下
一、背景
我写了一个进程s,s进程会运行时会监控进程中是否有i进程在运行,如果i进程运动的话,s进程就注入一个my.dll到i进程中,并在i进程中执行一个myfunc的函数
如下图
我写完程序后,运行测试,功能是没有错误的,一切正常。。。
二、 问题和分析
我的程序安装采用了Winrar的自解压文件,自解压完成后,自解压程序会运行s程序
然后手工启动i进程后,发现i进程崩溃了。崩溃报告使用VS2008去调试可以看到如下内容
从崩溃上,崩溃在某个线程上,熟悉注入代码同学应该可以猜到应该是崩溃在注入时使用的CreateRemoteThread上了。
下面介绍一下我写的注入的过程
1、 利用windows apiCreateRemoteThread在i进程中创建远程线程
2、 线程的线程函数为i进程中的某个函数地址
3、 这个函数地址中有如下代码流程将被执行
上面的函数中的代码以二进制的形式被注入到进程的内存中,这段代码是没有pdb文件也没有代码源文件的
代码如下
HMODULE hUser32= LoadLibrary("user32.dll");
FARPROC pMessageBox = GetProcAddress(hUser32," MessageBox ");
// Load the injected DLL into this process
HMODULE h = LoadLibrary("mydll.dll");
if(!h)
{
pMessageBox (0,"Could not load the dll", "Error", MB_ICONERROR);
ExitProcess(0);
}
// Get the addressof the export function
FARPROC p =GetProcAddress(h, "myfunc");
if(!p)
{
pMessageBox (0,"Could not load the function", "Error", MB_ICONERROR);
ExitProcess(0);
}
// So we do notneed a function pointer interface
__asm call p
// Exit the threadso the loader continues
ExitThread(0);
弯路分析时间:
我怀疑了
i进程还没有加载到必须的dll
i进程是否主窗口没有完全显示,
权限不足
做了一些尝试后,基本上排除了上面的可能性,这也是定位过程的“走弯路时间T_T”
因为我在myfunc的入口处也写了日志,myfunc完全没有调用,然后通过PrcessExplorer发现Mydll.dll并没有被加载
也就是说代码崩溃在上面的代码中我使用黄色底色标识出的那几行中,到底为什么会崩溃呢?
因为CreateRemoteThread的函数地址我们是知道的,直接使用OllyDBG查看那段内存。
一目了然啊,在GetProcesAddress这个地址上,崩溃的进程的内存中明显是个错误地址。
GetProcessAddress函数地址=kernal32.dll的load address + GetProcessAddress偏移地址(如下图GetProcessAddress的偏移地址是0x00011222)
通过PrcessExplorer发现崩溃时kernal32.dll的load address和未崩溃时的kernal32.dll的load address是一致的。
也就是说GetProcessAddress偏移地址被修改了,导致了崩溃
基本上就是怀疑WINRAR自解压程序修改GetProcessAddress的偏移地址,为了验证写了一个验证程序
代码如下,打印GetProcAddress的地址
FARPROC getprocaddress = NULL;
// Get the address of the main DLL
HMODULE kernel32 =LoadLibraryA("kernel32.dll");
getprocaddress =GetProcAddress(kernel32, "GetProcAddress");
DebugPrintf(_T("=========get procadd 0x%8X"),getprocaddress);
测试结果:
第一条日志是直接运行测试程序的输出,也是正确的GetProcAddress的地址,
第二条是WINRAR自解压运行的结果,是错误的。
解决这个问题,我放弃了使用WINRAR自解压程序做安装包,改用INNO Setup。
三 总结
原来定位问题都需要pdb来定位到代码行才可以去分析问题,个别极端情况下,没有pdb,但是了解了代码实现思路,使用olldbg也可以非常精准的定位问题。
一、背景
我写了一个进程s,s进程会运行时会监控进程中是否有i进程在运行,如果i进程运动的话,s进程就注入一个my.dll到i进程中,并在i进程中执行一个myfunc的函数
如下图
我写完程序后,运行测试,功能是没有错误的,一切正常。。。
二、 问题和分析
我的程序安装采用了Winrar的自解压文件,自解压完成后,自解压程序会运行s程序
然后手工启动i进程后,发现i进程崩溃了。崩溃报告使用VS2008去调试可以看到如下内容
从崩溃上,崩溃在某个线程上,熟悉注入代码同学应该可以猜到应该是崩溃在注入时使用的CreateRemoteThread上了。
下面介绍一下我写的注入的过程
1、 利用windows apiCreateRemoteThread在i进程中创建远程线程
2、 线程的线程函数为i进程中的某个函数地址
3、 这个函数地址中有如下代码流程将被执行
上面的函数中的代码以二进制的形式被注入到进程的内存中,这段代码是没有pdb文件也没有代码源文件的
代码如下
HMODULE hUser32= LoadLibrary("user32.dll");
FARPROC pMessageBox = GetProcAddress(hUser32," MessageBox ");
// Load the injected DLL into this process
HMODULE h = LoadLibrary("mydll.dll");
if(!h)
{
pMessageBox (0,"Could not load the dll", "Error", MB_ICONERROR);
ExitProcess(0);
}
// Get the addressof the export function
FARPROC p =GetProcAddress(h, "myfunc");
if(!p)
{
pMessageBox (0,"Could not load the function", "Error", MB_ICONERROR);
ExitProcess(0);
}
// So we do notneed a function pointer interface
__asm call p
// Exit the threadso the loader continues
ExitThread(0);
弯路分析时间:
我怀疑了
i进程还没有加载到必须的dll
i进程是否主窗口没有完全显示,
权限不足
做了一些尝试后,基本上排除了上面的可能性,这也是定位过程的“走弯路时间T_T”
因为我在myfunc的入口处也写了日志,myfunc完全没有调用,然后通过PrcessExplorer发现Mydll.dll并没有被加载
也就是说代码崩溃在上面的代码中我使用黄色底色标识出的那几行中,到底为什么会崩溃呢?
因为CreateRemoteThread的函数地址我们是知道的,直接使用OllyDBG查看那段内存。
一目了然啊,在GetProcesAddress这个地址上,崩溃的进程的内存中明显是个错误地址。
GetProcessAddress函数地址=kernal32.dll的load address + GetProcessAddress偏移地址(如下图GetProcessAddress的偏移地址是0x00011222)
通过PrcessExplorer发现崩溃时kernal32.dll的load address和未崩溃时的kernal32.dll的load address是一致的。
也就是说GetProcessAddress偏移地址被修改了,导致了崩溃
基本上就是怀疑WINRAR自解压程序修改GetProcessAddress的偏移地址,为了验证写了一个验证程序
代码如下,打印GetProcAddress的地址
FARPROC getprocaddress = NULL;
// Get the address of the main DLL
HMODULE kernel32 =LoadLibraryA("kernel32.dll");
getprocaddress =GetProcAddress(kernel32, "GetProcAddress");
DebugPrintf(_T("=========get procadd 0x%8X"),getprocaddress);
测试结果:
第一条日志是直接运行测试程序的输出,也是正确的GetProcAddress的地址,
第二条是WINRAR自解压运行的结果,是错误的。
解决这个问题,我放弃了使用WINRAR自解压程序做安装包,改用INNO Setup。
三 总结
原来定位问题都需要pdb来定位到代码行才可以去分析问题,个别极端情况下,没有pdb,但是了解了代码实现思路,使用olldbg也可以非常精准的定位问题。
相关文章推荐
- 一次网站停止访问的问题解决过程,原因令人崩溃
- 一次奇怪的问题定位过程
- Android开发过程遇到的安装好的APP打开程序崩溃,或者安装后应用列表里没有的问题及解决方案
- 一次内存泄漏问题定位过程与分析
- IDE-----VS2005运行过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的解决
- 程序崩溃 没有代码 无法定位 Dr Watson Windbg
- 一次msmq安装问题的解决过程
- 离奇的classifying.dll崩溃问题。 没有使用lib的问题
- webwork页面输入没有被注入的问题
- [项目管理]记一次外包过程遇到的“问题”以及“应对之道”
- 一次SQL调优数据库性能问题后的过程(300W)
- 神秘的类和对象初始化过程——由一个大多数程序员都可能犯的、却又很难定位的问题谈起。
- oracle中函数和过程没有参数问题
- 一次逻辑从库应用日志缓慢的问题的定位及解决
- 一次乱码问题解决过程反思
- 安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法
- ++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- Microsoft Windows 2000 Server 上ORA-01089到ora-27100问题的一次解决过程!
- VC++有源码调试中崩溃问题定位的一个好方法
- vc2005编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决