首页
社区
课程
招聘
[分享]分享一个找call的思路
发表于: 2013-7-29 12:05 13553

[分享]分享一个找call的思路

2013-7-29 12:05
13553
原理其实很简单,利用异常处理来捕捉断点异常,论坛上也有很多相应的文章,例如
1. VEH-硬件断点+dll劫持内存补丁 http://bbs.pediy.com/showthread.php?t=174263
2. [开源]自己写的非附加调试的内存监视器 http://bbs.pediy.com/showthread.php?t=174704
另外我们再把3. int3断点也加上(就是函数头写个0xcc嘛)

我这里的思路就,写一个dll注入到程序里去,让dll自动去给“所有的函数”下断点。(函数可以直接利用ida的functions里面识别的函数,自己想办法把函数地址搞出来,这样就不用自己去识别函数了)

1)给“所有的函数”下断点,过滤出那种框架函数(就是你撒也不干,程序自己都还在运行的那些函数)
1.1)过滤的方法就是:异常触发以后,在异常处理程序里,把异常地址直接从“所有的函数”列表里删除,然后剩下的函数肯定就是你要手工做了什么操作,才会运行的了,把剩下的函数记作“非框架函数”

2)给“非框架函数”里的所有函数下断点,你再去进行你想要做操作
2.1)等待异常触发后,在异常处理里面,把地址添加到“结果函数”里面

3)基本上“结果函数”里的函数就是你操作的时候,会调用的函数。

其实方法有点类似ce里面的找地址一样,先找出一大片,然后再不停的过滤过滤, 原理就相当于是把debug_event替换成了exception_event, 然后自动的去下断点,记录断点,删断点。

===
不敢自称原创,主要是看的文章少,不知道是否出现过这类文章,仅作抛砖引玉之用。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不觉得很麻烦么
2013-7-29 12:18
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
表示没看懂
利用异常处理来捕捉断点异常
2013-7-29 13:55
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是的,就是利用异常处理来捕捉断点,核心在于自动下断点 记录断点,删断点,反正也不知道会调用什么函数,干脆把所有函数都下上断点,让丫去触发吧。
另外我觉得OD脚本或者插件肯定也可以相应的功能(自动 -> 设断点,记录断点,删断点 ),只不过我不会
2013-7-29 14:40
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼主的分享
2013-7-29 15:12
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢分享,思路很好。
2013-7-30 10:31
0
雪    币: 65
活跃值: (60)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
这种找 CALL 的方式是非常不错的,但是例如游戏一类的都是有脚本的,脚本由虚拟机执行。
我就见过一个游戏,主体开始就从数据包中加载"boot.lua",然后所有的操作都从 LuaVM 中进行,
如果按楼主的这种方法拦截,LuaVM 的 Dispatcher 和所有 Handler 都会被标记为"框架函数"!
更何况有的还集成了 LuaJIT,动态生成本机代码,都会被列为非框架函数!
2013-7-30 11:20
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
恩,肯定有很多搞不定的东西,这个思路主要是实现起来非常简单,且有一定的用处,能蒙到一个算一个,搞不定的再想其他办法嘛,哈哈,像你说的lua,这玩意我不懂,不过论坛上已经看到有人公布过lua的插件,用插件那更方便了。
因为都没拿游戏测试过,所以我臆想这样一种情景
zoulu
{
  AddMsgToQueue("zoulu");
...
}
chiyao
{
AddMsgToQueue("chiyao");
...
}

msgloop() // 不停的遍历消息
{
  while(1)
{
   GetMsgFromQueue();
   xxx()
   {
     send()
   }
}
}
这种情况如果像普通方法那样给send函数下断,想跟到zoulu,chiyao函数去,很麻烦,除非你把它的消息处理都分析出来了.
2013-7-30 12:16
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很好的思路,mark标记
2013-7-30 13:01
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
对于一些小游戏理论上没什么大问题,但是对于一些大游戏,问题就多了。.. 1.很多游戏会有代码校验,基本上游戏都有把,不可能这么多函数他一个函数不校验,2还有异常的问题,很多游戏不让设置异常,因为如果有异常能弄其实可以干很多事,3当你输出结果的时候你也会发现函数太多太多,因为函数的层层调用,那样做还是很有特别多的函数
2013-7-30 13:10
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
所以总结出一点,想法好,现实很骨感
2013-7-30 13:12
0
雪    币: 185
活跃值: (724)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我猜想即便是获取了非框架函数 执行动作肯定也是一大堆……call内部的函数也都会记录吧
2013-7-30 13:20
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
我试过写一个 ida 插件来监视函数调用,搞了后来发觉问题还不少,也没接着搞。。
原理都差不多,先 hook ida 的中断处理函数,然后在exe启动或者attach时候,插件会反汇编那些"感兴趣"的模块,分析并记录模块中所有 call 起始地址到一个 std::map 中,然后去掉 call 起始1字节的执行权限。当这个 call 被调用时,ida 会中断,调用我们的中断 hook 函数,在 hook 里删除 std::map 中的地址,并恢复函数头的执行权限,然后把 eip 往回退一条指令,让 ida 继续执行

不光可以根据call,还可以根据所有执行分支,写一个找分支算法即可。。

最开始用的是 int3 断点,然后发觉找call算法写得不太靠谱。。把一些数据和跳转表也被改成0xCC导致错误,后来就改用去除exec权限。

比如找 win7 的 calc 乘法call


附件的 .plw 放到 ida/plugins 下,调试时 鼠标点一下ida的代码区域,然后按快捷键alt+T启用插件,那个libgccxxxxx.dll 是 MinGW 运行库,是用 MinGW 编译的, 只是个简单框架
上传的附件:
2013-7-30 14:55
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这个应该算是函数识别的问题吧,我是直接在ida的functions window里面拷出来的,而且那些识别出来的库函数也不用管,基本只考虑sub_开头的函数。你会写ida插件,那OD插件估计也会吧,OD中实现类似的功能复不复杂

另外针对楼上回复的,什么crc检测啊,游戏不让设置异常(游戏不让的事情多了,OD也要考虑crc吧,游戏上不好用,可以拿去找软件的call嘛,定位按钮事件撒的也不错),找出一大堆结果(嫌结果多的话,你可以第一个断点触发后,就取消所有断点,只记录第一个断点,然后再结合OD慢慢处理)

这个思路是用来搞个小工具玩玩而已,要想更实用,如何做到方便操作,功能做全才是难点,譬如去把堆栈信息也打印出来(监控指定api,把参数都搞出来,监控个send抓抓包玩),
2013-7-30 15:42
0
雪    币: 217
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主的思路很好,貌似这个也可以拿来搞定所有的CRC。现在应用层的CRC真的很烦人,还搞动态代码变形。。。。
2013-8-1 09:46
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
我开着IDA直接找
2013-8-1 09:52
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个思路很好,最好写成一个什么自动工具来处理就更好了。
2013-8-1 14:28
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark
2013-8-17 00:09
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
生成的函数,上百万个 - -,怎么找 - -
2013-8-17 07:26
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
用OD脚本就能干的事,也好意思说
2013-8-17 17:28
0
游客
登录 | 注册 方可回帖
返回
//