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

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

1.崩溃现象

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

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

2.OD定位奔溃原因

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

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

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

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

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

一开始进入,直接push ebp,最后pop ebp,典型的寄存器保护嘛,容易理解,我们看到这个时候ebp是004FFAE4,在执行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++强制转换这种东西最好还是不要用滴,很容易出事,出了事很难查。

论OD最原始的用途------找程序BUG相关推荐

  1. 转挣扎的菜鸟 - 当OD不能装载也不能附加程序时

    原方转自 http://www.unpack.cn/thread-65647-1-1.html [文章标题]: 挣扎的菜鸟 - 当OD不能装载也不能附加程序时 [文章作者]: justlovemm [ ...

  2. OD 调试带启动参数的程序

    看到有这样一个问题: 怎么调试需要命令行启动的软件??没有命令行启动程序就自动关闭,命令行不是固定的,用od怎么调试这种软件? 带参数程序的调试 模拟一个需要命令行的Demo [cpp] view p ...

  3. 找程序员做老公的十大好处

    找了个程序员做老公,所以认识了很多程序员.以前就没对程序员有过不好的看法,现在则更不会.发现csdn上老有悲观的论调,说程序员找不到老婆.今天来写写找程序员做老公的好处.希望能给各位mm有借鉴,找程序 ...

  4. 程序bug导致了天大的损失,要枪毙程序猿吗?

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  5. 微信小程序 bug 集中营

    微信小程序 bug 集中营 create by jsliang on 2018-9-17 17:58:56 Recently revised in 2018-10-18 09:38:15  Hello ...

  6. 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  7. 实习生两分钟解决程序bug,老程序员笑笑不说话,还是太年轻?

    又到一年高校毕业季,为了能实现更好就业,大学生们也是使尽了浑身解数. 从某种程度上来说,985.211高校毕业的大学生找工作要比普本院校毕业的学生要容易很多,现在也有不少985高校的毕业生已经进入了实 ...

  8. 携程再爆大数据杀熟,携程致歉信:程序 bug 已紧急修复,将赔偿用户

    3月10日,前360移动搜索负责人@陈利人在一篇名为<携程的牌坊塌了>的文章中爆料,日前在携程购买了一张机票,总价为17548元:当他发现没有选择报销凭证退回重选时,提示已无票,重新搜索价 ...

  9. 软件测试对于减少程序BUG有多大帮助?

    软件测试对于减少程序BUG有多大帮助? 有经验的程序员通常认为测试与代码同等重要,测试可以减少代码变更或扩展的不确定性.测试应该方便阅读简单且能快速运行,使用的内存也不会很多. 常见的软件错误可能会导 ...

最新文章

  1. .NET 获取客户端的操作系统版本、浏览器版本和IP地址
  2. 如何在GNOME中添加自己的菜单项
  3. 诡异!MyBatis的Insert方法一直返回-2147482646?
  4. python网页登录钉钉_django 钉钉扫码登录
  5. Python 实现类似sed命令的字符串替换小程序
  6. windows修改策略后执行命令_Windows 下的提权大合集
  7. Android控件— — —ImageView
  8. android安卓机版市场,安卓各版本市场份额数据更新 安卓8.0暴增
  9. Spring源码:AOP(1)
  10. 计算机系统的物质实体,计算机基础-(-第1次-).pdf
  11. 信息学奥赛一本通(1205:汉诺塔问题)
  12. 软件portable
  13. 不重启程序使用最新版package
  14. 腾讯C++程序员面试题
  15. python开源商城_Python 开源网上商城项目
  16. 深度相机原理揭秘--双目立体视觉
  17. Word也能制作座位表?掌握这个技巧安排座位不慌乱
  18. Python学习(八):返回值变量的作用域参数的传递浅拷贝和深拷贝类对象和方法
  19. python中一切都是对象对吗_在 Python 中一切皆对象,它完全支持()
  20. 我的Crystal xcelsius之旅

热门文章

  1. Spring提供获取应用上下文的工具
  2. 授权码模式-获取令牌
  3. Log4j的layout配置
  4. CentOS查看 占用 内存 最多的 进程
  5. spring配置详解-三种对象创建方式_
  6. 单例设计模式-反射攻击解决方案及原理分析
  7. oracle 物化视图、中间表的方案
  8. Netty--Reactor模式
  9. 优酷在多模态内容理解上的研究及应用
  10. Scala比较器:Ordered与Ordering