论OD最原始的用途------找程序BUG

今天说说OD调试器原作者开发该软件的初衷,找程序BUG。当然这款软件现在主要用来做程序破解和写外挂,都是利用了OD方便快捷的逆向程序的好处。最近在看红狼远控源码,Gh0st,老地再也不能老的东西了,不过我认为,老不老不是关键,关键是我们能从中学到很多东西,不想听我闲BB可以直接看正文,从网上下载了一个Gh0st3.6的源码,源码是VC6写的,有三个工程,如下:

 

其中svchost是主木马,编译出来是个dll,install是个加载器,就是把这个dll做成个服务在被控机器上,gh0sht是个控制端。由于VC编写调试阅读C++不太方便,我把他移植到了VS2010,svchost编译成了一个exe,这样很方便调试,阅读作者源代码,他大概也是这样做的,一开始svchost是个exe,后来改变成了dll,里面有宏进行控制,还有main函数。一开始只移植到vs2010不改变dllexe,程序完美运行,被控端成功上线,美滋滋。注意被控端不能是xp以上的版本,xp可以的,因为xp以上的版本安装服务和以前略有不同。把svchost改变成exe时费了一番功夫,一运行程序就崩溃,搞得我很郁闷。下面进入正题:

1.崩溃现象

 

这个问题是必现的,并且每次都崩溃到 DWORD dwExitCode =SOCKET_ERROR;

SOCKET_ERROR是个值为-1的宏,每次都发生访问冲突,源码就在这里,可依然没有办法,把错误信息贴入到度娘上看看,收效不大,这该怎么下手,

2.OD定位奔溃原因

看到桌面的OD图面索性打开试试吧,其实一开始心里并没有底,注意,OD有个查看源码的工能,可快速的匹配C++和反汇编代码,找到源码位置双击就可以进入到该源码所在汇编位置了。

 

扫描二维码关注公众号,回复: 900373 查看本文章

找到上面崩溃那句代码如下图,并且上OD运行到这里,

 

汇编代码:mov dword ptr ss:[ebp-0x22C],-0x1

看看ebp的值为0难怪会崩溃,ebp寄存器一般与堆栈相关,那就看下ebp什么时候突然变为0,经过一步一步走,发现执行下面这句汇编代码时ebp变为了0

那就调试这个call,看看ebp为什么变为0,跟进去这个call看了下,

一开始进入,直接push ebp,最后pop ebp,典型的寄存器保护嘛,容易理解,我们看到这个时候ebp004FFAE4,在执行pop ebp之前我们再看下,

这个时候堆栈最顶部是个0,接下来ebp就变为了0,这是典型的堆栈溢出

3.找到崩溃位置

知道是堆栈溢出了,并且找到是一块溢出的,就好找位置了,用OD重新调试一下程序,走到刚刚那个call,执行一下push ebp,然后双击堆栈地址,并且锁定它,就看那句的代码将这块内存覆盖,

 

一步一步走发现执行下面这句代码,导致了ebp在堆栈中覆盖,

 

那我们就看下源代码吧,9成确定是这个函数原作者没有用好,看了下代码如下:

 
const char chOpt = 1; // True
// Set KeepAlive 开a启?保馈?活?机ú制?, 防え?止1服务?端?产ú生Θ?死à连?接ó
if (setsockopt(m_Socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&chOpt, sizeof(chOpt)) == 0)
{
// 设Θ?置?超?时骸?详ê细?信?息¢
tcp_keepalive	klive;
klive.onoff = 1; // 启?用?保馈?活?
klive.keepalivetime = 1000 * 60 * 3; // 3分?钟ó超?时骸?Keep Alive
klive.keepaliveinterval = 1000 * 5; // 重?试?间?隔?为a5秒? Resend if No-Reply
WSAIoctl
(
m_Socket,
SIO_KEEPALIVE_VALS,
&klive,
sizeof(tcp_keepalive),
NULL,
0,
(unsigned long *)&chOpt,
0,
NULL
);
}

看了下这个API,7个参数类型是LPDWORD,原作者定义了一个const char chOpt =1;然后强制转换,怪不得会进行溢出。

 

4.解决办法,

const char chOpt =1; 改为 unsigned long chOpt =1; 就可以了,没有必要加const的,这个函数会修改这个值,这道问题不大,关键是是long型。

 

5.最后感悟

不知道VC6编译时为什么不会崩溃,不知道安装成服务就不会崩溃,慢慢找不崩溃的原因吧。最后,C++强制转换这种东西最好还是不要用滴,很容易出事,出了事很难查。

猜你喜欢

转载自blog.csdn.net/liujiayu2/article/details/77261951