您的位置:首页 > 其它

没有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也可以非常精准的定位问题。

 

 

 

 

 

 

 

 



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐