12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 335|回复: 0

tcj小分析1

[复制链接]

516

主题

516

帖子

1042

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
1042
发表于 2020-2-9 02:58:28 | 显示全部楼层 |阅读模式
0x1:   某反外挂一直在打开文件我们对ReadFile 下一个断点,很快就命中了

查看下调用者发现是在 tcj 读取的大小是PAGE_SIZE * 10

对读入的数据下一个硬件断点

看了栈实际上TCJ 读完文件就直接进来了,IDA 分析下这个函数
  
分析它的子函数可以很容易看到,这就是一个 MD5 的函数

看下 TCJ 循环READFILE 的逻辑

实际上就是循环读取文件内容,每次 PAGE_SIZE * 10 大小,得到最终的MD5 值放到参数中



我们接着看 TCJ得到了文件的MD5 后要继续做了什么如果成功得到了文件的MD5 ,那么就进入了第二个函数


该函数逻辑如下,其作用是获取整个文件的 murmur哈希值和文件大小

名单最终我们得到了 2 个值


  那么,程序已经获取了目标程序的 MD5 值,HASH值,和文件大小。接着

作为参数调用。 IDA 回顾下之前的逻辑值得一提的是,在以后操作都完成后,释放才会文件句柄

我们接着分析 HandleFileHash,对输入的MD5 参数下一个硬件断点

发现断在了这个地方。回溯往上
      
  第二次中中断发现在比较 MD5 的值
  
可以得出这段代码是先把 MD5 归类成一个ID ,然后在一个链表中查找相同ID 的数据这样做的目的是加速搜索
      
观察它的结构,发现已经存在于数据库中了,看来这个数据库存放的都是 TCJ 扫描过的所有文件的信息。
  
接着,我们回到上一个地方,发现它查找到对应的数据库后,就会判断数据库中的 + 0×11字段是否匹配,如果匹配就修改8 为当前的时间

     这里的英文查找到 MD5

而且有趣的的是,不止一个 MD5 数据库,还有一个hash数据库


从这 2 个不同的地方,我们就可以知道,有2 搜索方式1. 搜索方式为 md5 的时候先获取md5 的桶ID ,再(object+ 0x60)的一个数组索引对应桶ID 的链表 下面我们接着看搜索方式为 hash 和大小的时候,

MD5 搜索类似,给hash计算桶INDEX,再算表。不过是另外一个表,以下我简称这2 个表一个为HASH快查表,一个MD5 快查表。这个函数是搜索的对应的表,不过对应的表又指向相同的数据库。
MD5 快查表的一项

HASH查表快的一项

数据库

既然知道,这里放着的是 TCJ 扫描过后的缓存,那么如果数据库中没有我们的记录,肯定是会插入的,往上继续回溯

如果没有找到对应的数据库,那么就调用 add_cache_list 添加到2 个表中去。

通过调用参数,我们可以确定最终的数据库结构和对应的大小了0×28

分析了这么多,我们写一个程序 DUMP 一下这2 份表吧
  
  


[C++] 纯文本查看 复制代码#include #include #pragma pack(1)struct SFileSig{  DWORD murmur_hash;  DWORD file_size;  DWORD64 time;  BYTE level;  BYTE id;  DWORD md5[4];};#pragma pack()struct SMd5Item{  SMd5Item* p1;  SMd5Item* p2;  DWORD md5[4];  SFileSig* database;};struct SHashItem{  SHashItem* p1;  SHashItem* p2;  DWORD murmur_hash;  DWORD file_size;  SFileSig* database;};struct STableMd5{  DWORD p1;  SMd5Item* list;};struct STableHash{  DWORD p1;  SHashItem* list;};void DumpDatabase(const SFileSig* sig) {  printf(&quot;----------------------------\n&quot;);  printf(&quot;murmur_hash:%08X\n&quot;, sig->murmur_hash);  printf(&quot;file_size:%08X\n&quot;, sig->file_size);  printf(&quot;update-time:%lu\n&quot;, sig->time);  printf(&quot;level:%02X\n&quot;, sig->level);  printf(&quot;id:%02x\n&quot;, sig->id);  printf(&quot;md5:%08X%08X%08X%08X\n&quot;, sig->md5[0], sig->md5[1], sig->md5[2], sig->md5[3]);  printf(&quot;-------------------------\n&quot;);}int __stdcall DllMain(_In_ void* _DllHandle, _In_ unsigned long _Reason, _In_opt_ void* _Reserved) {  if (_Reason == DLL_PROCESS_ATTACH) {    const auto md5_fast_list = reinterpret_cast(0x0C23BC60);    for (int index = 0; index < 0x201; index++) {      if (md5_fast_list[index].list) {        for (auto iter = md5_fast_list[index].list; ; iter = iter->p1) {          if (iter->database == nullptr || iter->md5[0] == 0)break;             printf(&quot;[FastMd5List]md5:%08X%08X%08X%08X\n&quot;, iter->md5[0], iter->md5[1], iter->md5[2],                 iter->md5[3]);          DumpDatabase(iter->database);           if (iter->p1 == md5_fast_list[index].list) break;        }      }    }    const auto hash_fast_list = reinterpret_cast(0x0C23E488);    for (int index = 0; index < 0x201; index++) {      if (hash_fast_list[index].list) {        for (auto iter = hash_fast_list[index].list; ; iter = iter->p1) {          if (iter->p1 == hash_fast_list[index].list)            break;          printf(&quot;[FastHashList]hash:%08X ,file size:%08x\n&quot;, iter->murmur_hash, iter->file_size);          DumpDatabase(iter->database);                 }      }    }  }  return 0;}
   那么tcj维护这个大表做什么呢


欲知后事如何
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-19 05:08 , Processed in 0.120117 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表