首页
社区
课程
招聘
[求助]关于代码自检测的编写。
发表于: 2005-6-25 05:14 6518

[求助]关于代码自检测的编写。

2005-6-25 05:14
6518
很早玩过一款网络游戏。 当时很多数据是在本机计算的。 所以可以修改指令达到一些特殊效果。 但后来一修改就会导致程序退出。 到指令上下内存读断点发现原来是有个timer不停的读指令来效验完整性。

现在做一个程序, 想把这个功能加上。 以下是我的设想。
1: 得到自运行程序文件名字, 解吸pe格式得到隐射的虚拟地址
2: 创建一个线程序对全部指令地址进行crc效验,为了不影响指令的执行
    把crc比较值记录在文件某个位置,比如追加到exe结尾部分。
开个timer或者thread来检测
伪代码如下
    int iCrc = GetCrcFromFile();
    if ( GetCrcFromFileMapping() != iCrc ) ExitProcess(-1);
但是我必须跟踪程序来得到GetCrcFromFileMapping的值,从而最后手动修改
exe的时候把这个值放进去。但问题是。
但一跟踪程序就需要设置断点, 只要设置断点产生的int 3(CC)就一定会
影响到GetCrcFromFileMapping的返回。 从而得不到正确crc值。
不知道有什么好办法吗?

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 442
活跃值: (1241)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
想法不错,发段代码上来大家评评怎样?
2005-6-25 10:09
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
最初由 jjnet 发布
但一跟踪程序就需要设置断点, 只要设置断点产生的int 3(CC)就一定会
影响到GetCrcFromFileMapping的返回。 从而得不到正确crc值。
不知道有什么好办法吗?

用内存断点试试
2005-6-25 10:31
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
或用硬件断点试试。
2005-6-25 13:36
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
5
换个思路:CreateFile打开自身,CreateFileMapping映射该文件,然后ReadFile从头读取自身的每个字节,CRC验证。
有不少程序都是这样做的~
2005-6-26 22:30
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
谢谢思路,不过我想到了更好的办法。
做了个程序用ReadProcessMemory循环读。
有空把代码铁出来。
2005-6-27 01:50
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
7
其实都是一样的,你读内存中的文件和读磁盘上的文件是一个道理,无非你的方法更安全些。
2005-6-27 11:35
0
雪    币: 236
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
我觉得还应该主程序里加一段代码验证新开线程的存活性,不然爆破了之后CRC也就没意义了.
2005-6-27 20:46
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
我觉得还应该主程序里加一段代码验证新开线程的存活性,不然爆破了之后CRC也就没意义了.
========================
对啊。。不过是不是有必要再加代码验证 验证新开线程的存活性 的代码。。 现在我的实现方法是把这段效验代码通过CreateRemoteThread,writeprocessmemory等把线程注入到explorer.exe来进行判断了。 觉得这样更安全。
2005-6-29 18:38
0
游客
登录 | 注册 方可回帖
返回
//