能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不觉得很麻烦么
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
表示没看懂
利用异常处理来捕捉断点异常
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
是的,就是利用异常处理来捕捉断点,核心在于自动下断点 记录断点,删断点,反正也不知道会调用什么函数,干脆把所有函数都下上断点,让丫去触发吧。
另外我觉得OD脚本或者插件肯定也可以相应的功能(自动 -> 设断点,记录断点,删断点 ),只不过我不会
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢楼主的分享
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢分享,思路很好。
|
能力值:
( LV3,RANK:30 )
|
-
-
7 楼
这种找 CALL 的方式是非常不错的,但是例如游戏一类的都是有脚本的,脚本由虚拟机执行。
我就见过一个游戏,主体开始就从数据包中加载"boot.lua",然后所有的操作都从 LuaVM 中进行,
如果按楼主的这种方法拦截,LuaVM 的 Dispatcher 和所有 Handler 都会被标记为"框架函数"!
更何况有的还集成了 LuaJIT,动态生成本机代码,都会被列为非框架函数!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
恩,肯定有很多搞不定的东西,这个思路主要是实现起来非常简单,且有一定的用处,能蒙到一个算一个,搞不定的再想其他办法嘛,哈哈,像你说的lua,这玩意我不懂,不过论坛上已经看到有人公布过lua的插件,用插件那更方便了。
因为都没拿游戏测试过,所以我臆想这样一种情景
zoulu
{
AddMsgToQueue("zoulu");
...
}
chiyao
{
AddMsgToQueue("chiyao");
...
}
msgloop() // 不停的遍历消息
{
while(1)
{
GetMsgFromQueue();
xxx()
{
send()
}
}
}
这种情况如果像普通方法那样给send函数下断,想跟到zoulu,chiyao函数去,很麻烦,除非你把它的消息处理都分析出来了.
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
很好的思路,mark标记
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
对于一些小游戏理论上没什么大问题,但是对于一些大游戏,问题就多了。.. 1.很多游戏会有代码校验,基本上游戏都有把,不可能这么多函数他一个函数不校验,2还有异常的问题,很多游戏不让设置异常,因为如果有异常能弄其实可以干很多事,3当你输出结果的时候你也会发现函数太多太多,因为函数的层层调用,那样做还是很有特别多的函数
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
所以总结出一点,想法好,现实很骨感
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
我猜想即便是获取了非框架函数 执行动作肯定也是一大堆……call内部的函数也都会记录吧
|
能力值:
( LV2,RANK:10 )
|
-
-
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 编译的, 只是个简单框架
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
这个应该算是函数识别的问题吧,我是直接在ida的functions window里面拷出来的,而且那些识别出来的库函数也不用管,基本只考虑sub_开头的函数。你会写ida插件,那OD插件估计也会吧,OD中实现类似的功能复不复杂
另外针对楼上回复的,什么crc检测啊,游戏不让设置异常(游戏不让的事情多了,OD也要考虑crc吧,游戏上不好用,可以拿去找软件的call嘛,定位按钮事件撒的也不错),找出一大堆结果(嫌结果多的话,你可以第一个断点触发后,就取消所有断点,只记录第一个断点,然后再结合OD慢慢处理)
这个思路是用来搞个小工具玩玩而已,要想更实用,如何做到方便操作,功能做全才是难点,譬如去把堆栈信息也打印出来(监控指定api,把参数都搞出来,监控个send抓抓包玩),
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
楼主的思路很好,貌似这个也可以拿来搞定所有的CRC。现在应用层的CRC真的很烦人,还搞动态代码变形。。。。
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
我开着IDA直接找
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
这个思路很好,最好写成一个什么自动工具来处理就更好了。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
mark
|
能力值:
( LV5,RANK:60 )
|
-
-
19 楼
生成的函数,上百万个 - -,怎么找 - -
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
用OD脚本就能干的事,也好意思说
|
|
|