首页
社区
课程
招聘
[原创]Il2Cpp恢复符号过程分析
发表于: 2022-5-30 14:42 20245

[原创]Il2Cpp恢复符号过程分析

2022-5-30 14:42
20245

可以通过如下方法获得Il2CppImageDefinition数组,并且进行遍历。

Il2CppGlobalMetadataHeader *header=(Il2CppGlobalMetadataHeader*)ptr;
  if(header->sanity!=0xFAB11BAF || header->stringLiteralOffset!=sizeof(Il2CppGlobalMetadataHeader))
  {
      printf("invalid file..\n");
      return 0;
  }
  int image_count=header->imagesSize/sizeof(Il2CppImageDefinition);
 
  for(int i=0;i<image_count;i++)
  {
      const Il2CppImageDefinition *image=&image_arr[i];
  }
Il2CppGlobalMetadataHeader *header=(Il2CppGlobalMetadataHeader*)ptr;
  if(header->sanity!=0xFAB11BAF || header->stringLiteralOffset!=sizeof(Il2CppGlobalMetadataHeader))
  {
      printf("invalid file..\n");
      return 0;
  }
  int image_count=header->imagesSize/sizeof(Il2CppImageDefinition);
 
  for(int i=0;i<image_count;i++)
  {
      const Il2CppImageDefinition *image=&image_arr[i];
  }
static const char* GetStringFromIndex(StringIndex index)
{
  return (const char*)(((Il2CppGlobalMetadataHeader*)ptr)->stringOffset+ptr+index);
}
static const char* GetStringFromIndex(StringIndex index)
{
  return (const char*)(((Il2CppGlobalMetadataHeader*)ptr)->stringOffset+ptr+index);
}
static const Il2CppTypeDefinition* GetTypeDefinitionFromIndex(TypeDefinitionIndex index)
{
  return (const Il2CppTypeDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->typeDefinitionsOffset)+index;
}
static const Il2CppTypeDefinition* GetTypeDefinitionFromIndex(TypeDefinitionIndex index)
{
  return (const Il2CppTypeDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->typeDefinitionsOffset)+index;
}
const Il2CppImageDefinition *image=&image_arr[i];
  printf("image: %s\n",GetStringFromIndex(image->nameIndex));
  for(int j=0;j<image->typeCount;j++)
  {
      const Il2CppTypeDefinition *type=GetTypeDefinitionFromIndex(image->typeStart+j);
      printf("class: %s:%s\n",GetStringFromIndex(type->namespaceIndex),GetStringFromIndex(type->nameIndex));
  }
const Il2CppImageDefinition *image=&image_arr[i];
  printf("image: %s\n",GetStringFromIndex(image->nameIndex));
  for(int j=0;j<image->typeCount;j++)
  {
      const Il2CppTypeDefinition *type=GetTypeDefinitionFromIndex(image->typeStart+j);
      printf("class: %s:%s\n",GetStringFromIndex(type->namespaceIndex),GetStringFromIndex(type->nameIndex));
  }
static const Il2CppMethodDefinition* GetMethodDefinitionFromIndex(MethodIndex index)
{
  return (const Il2CppMethodDefinition*)(((Il2CppGlobalMetadataHeader*)ptr)->methodsOffset+ptr)+index;
}
static const Il2CppFieldDefinition* GetFieldDefinitionFromIndex(FieldIndex index)
{
  return (const Il2CppFieldDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->fieldsOffset)+index;
}
static const Il2CppMethodDefinition* GetMethodDefinitionFromIndex(MethodIndex index)
{
  return (const Il2CppMethodDefinition*)(((Il2CppGlobalMetadataHeader*)ptr)->methodsOffset+ptr)+index;
}
static const Il2CppFieldDefinition* GetFieldDefinitionFromIndex(FieldIndex index)
{
  return (const Il2CppFieldDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->fieldsOffset)+index;
}
uint32_t GetMethodPointer(const Il2CppImageDefinition *image,uint32_t token)
{
  for(int i=0;i<CodeRegistration->codeGenModulesCount;i++)
  {
      const Il2CppCodeGenModule *module=CodeRegistration->codeGenModules[i];
      if(!strcmp(module->moduleName,GetStringFromIndex(image->nameIndex)))
      {
          return module->methodPointers[GetTokenRowId(token)-1];
      }
  }
  printf("invalid!\n");
  return 0;
}
uint32_t GetMethodPointer(const Il2CppImageDefinition *image,uint32_t token)
{
  for(int i=0;i<CodeRegistration->codeGenModulesCount;i++)
  {
      const Il2CppCodeGenModule *module=CodeRegistration->codeGenModules[i];
      if(!strcmp(module->moduleName,GetStringFromIndex(image->nameIndex)))
      {
          return module->methodPointers[GetTokenRowId(token)-1];
      }
  }
  printf("invalid!\n");
  return 0;
}
static TypeDefinitionIndex GetIndexForTypeDefinitionInternal(const Il2CppTypeDefinition* typeDefinition)
{
  const Il2CppTypeDefinition* typeDefinitions=(const Il2CppTypeDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->typeDefinitionsOffset);
  ptrdiff_t index=typeDefinition-typeDefinitions;
  return (TypeDefinitionIndex)index;
}
static TypeDefinitionIndex GetIndexForTypeDefinitionInternal(const Il2CppTypeDefinition* typeDefinition)
{
  const Il2CppTypeDefinition* typeDefinitions=(const Il2CppTypeDefinition*)(ptr+((Il2CppGlobalMetadataHeader*)ptr)->typeDefinitionsOffset);
  ptrdiff_t index=typeDefinition-typeDefinitions;
  return (TypeDefinitionIndex)index;
}
uint32_t GetFieldOffset(TypeDefinitionIndex typeIndex,uint32_t index)
{
  return MetadataRegistration->fieldOffsets[typeIndex][index];   
}
uint32_t GetFieldOffset(TypeDefinitionIndex typeIndex,uint32_t index)
{
  return MetadataRegistration->fieldOffsets[typeIndex][index];   
}

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 10
支持
分享
打赏 + 80.00雪花
打赏次数 1 雪花 + 80.00
 
赞赏  Editor   +80.00 2022/06/28 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (8)
雪    币: 2677
活跃值: (5415)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
2
昂!
2022-5-30 15:12
0
雪    币: 202
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2022-6-2 00:34
0
雪    币: 8466
活跃值: (5066)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4
昂!
2022-6-4 11:48
0
雪    币: 187
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
NO,附件过期了
2022-11-22 18:34
0
雪    币: 3474
活跃值: (2699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢了。学习下。
2023-8-4 11:14
0
雪    币: 3672
活跃值: (31051)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2023-8-4 11:17
1
雪    币: 202
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
感谢分享,现在常见的il2cpp游戏一般都会想方设法加密global-metadata.dat 比如最近免费的某大型网游
2023-8-4 11:43
0
雪    币: 34
活跃值: (255)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
过期了啊,楼主请从新激活下~ 谢谢,最近分析一个il2cpp, 用 il2cppDump 工具,能DUMP成功,但是就是DLL文件中,唯独缺少:“GameAssemly.dll”,思来想去 始终Dump 不出来。 用CE 查看mono 能看到DLL 在列表中。
2024-2-28 02:21
0
游客
登录 | 注册 方可回帖
返回
//