wyz_2015 发表于 2025-4-4 23:58:14

本帖最后由 wyz_2015 于 2025-4-5 00:00 编辑

翼岬搭档 发表于 2025-4-3 22:15
如果没学过编译,劝楼主放弃吧,这个是硬伤
编译对我来说问题没那么大。只要代码本身没错,依赖包不是极其新,目前基本上没有编不过的。
我仍然认为硬伤在于搞清楚代码里的调用逻辑和AW硬件基础知识。搞清楚了,就可以利用之,编写符合自己需要的程序了。

itasoga 发表于 2025-4-5 08:48:10

代码搞不懂问AI啊

leoxxx 发表于 2025-4-5 09:46:43

翼岬搭档 发表于 2025-3-25 22:03
楼主的问题其实加解密转换都是专业人士编译的工具做到的,从模拟器源码获得解密函数自己编辑工具,并且逆向 ...

你也跑这来了啊。之前加过你Q,我原先的那个Q被TX封了。

leoxxx 发表于 2025-4-5 09:48:13

本帖最后由 leoxxx 于 2025-4-5 10:03 编辑

AW转NAOMI意义何在?你确定你找到的不是转DC的?我到是见过AW转DC的,主要是给实机用的。国外和国内论坛都有相关的贴子,B站还有视频。至于工具和教程我是没见过。自行用G搜索一下看看。

wyz_2015 发表于 2025-4-5 11:19:25

leoxxx 发表于 2025-4-5 09:48
AW转NAOMI意义何在?你确定你找到的不是转DC的?我到是见过AW转DC的,主要是给实机用的。国外和国内论坛都 ...

请教AW转其他机种的问题只是顺带的,目前重点想探究AW rom的解密。
AW转NAOMI应该是有的吧?手头一份下来的mslug6的cdi文件,当时下的时候得知使用nullDC运行,运行时印象里确实有“NAOMI”的logo弹出。

wyz_2015 发表于 2025-4-5 11:23:53

本帖最后由 wyz_2015 于 2025-4-5 11:27 编辑

itasoga 发表于 2025-4-5 08:48
代码搞不懂问AI啊
233,要是我没试过我也不至于说碰到了痛点吧?
可能我没去买专门分析代码的AI吧,平时用的AI并不能胜任:给了它github仓库地址,它告诉我没法分析外部链接,我要帮AI整理好代码了估计我自己也能看懂了。同时MAME的代码涉及了太多真机的知识,AI或许不一定能联想到那些知识。

翼岬搭档 发表于 2025-4-9 08:05:05

leoxxx 发表于 2025-4-5 09:46
你也跑这来了啊。之前加过你Q,我原先的那个Q被TX封了。

偶尔看看

wyz_2015 发表于 2025-4-19 18:45:01

本帖最后由 wyz_2015 于 2025-4-19 19:34 编辑

关于AW板rom的解密是有进展了。
思路不是照猫画虎,借别人代码做自己的功能。而是当“小偷”,在模拟器做好解密后,插入一段“抄作业”的代码,把解密好的rom内容从内存拷贝到外存。

“迫害”对象选的flycast,其相关代码多从MAME修改而来。MAME里的代码里太多“FUNC”等宏了,不知道怎么处理好,故转向使用“二手”的flycast。
flycast具体的版本是:2025-03-08 06:19:55的master分支的版本,SHA1为48bce2582086883c710eeb637f20fe593a3b708a。

代码改动了3处。额外添加的代码周围有类似这样的注释:
/* modify */
额外的代码……
/* */

还有
#include <stdio.h>
也是要的,在这就省略不提了。

core/hw/naomi/naomi_cart.h
class Cartridge
{
public:
      Cartridge(u32 size);
      virtual ~Cartridge();

      virtual void Init(LoadProgress *progress = nullptr, std::vector<u8> *digest = nullptr) {
                if (digest != nullptr)
                        digest->clear();
      }
      virtual u32 ReadMem(u32 address, u32 size) = 0;
      virtual void WriteMem(u32 address, u32 data, u32 size) = 0;

      virtual bool Read(u32 offset, u32 size, void* dst);
      virtual bool Write(u32 offset, u32 size, u32 data);
      virtual void* GetPtr(u32 offset, u32& size);
      virtual void* GetDmaPtr(u32 &size) = 0;
      virtual void AdvancePtr(u32 size) = 0;
      virtual void Serialize(Serializer& ser) const {}
      virtual void Deserialize(Deserializer& deser) {}
      virtual void SetKey(u32 key) { }
      virtual void SetKeyData(u8 *key_data) { }
      virtual bool GetBootId(RomBootID *bootId) = 0;

      const Game *game = nullptr;

      /* modify */
      u8* myRomPtr;
      u32 myRomSize;
      /* */

protected:
      u8* RomPtr;
      u32 RomSize;
};


core/hw/naomi/naomi_cart.cpp
void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, LoadProgress *progress)
{

// 省略原代码。我是在这个函数的最后追加东西的

#endif
      }
      else
      {
                NOTICE_LOG(NAOMI, "NAOMI GAME ID [%s]", settings.content.gameId.c_str());
      }

      /* modify */
      FILE *binFile = fopen("/tmp/ms6原始加密.bin", "wb"), *binFile2 = fopen("/tmp/ms6用decrypt16函数解密.bin", "wb"), *binFile3 = fopen("/tmp/ms6用decrypt16_2函数解密.bin", "wb"); // 为了自己方便,我是直接写死路径的。若有需要,应根据自身电脑系统作修改。
      if (!(binFile && binFile2 && binFile3)) {
                exit(1);
      }
      fwrite(CurrentCartridge->myRomPtr, CurrentCartridge->myRomSize, 1, binFile);
      fclose(binFile);

      AWCartridge* cc = (AWCartridge*)CurrentCartridge;

      // printf("\n\n%08x\n\n", cc->myRomSize);
      for (uint32_t address = 0; address < CurrentCartridge->myRomSize; address += 1) {
                // printf("%08x\t", address);
                uint16_t d = cc->decrypt16(address);
                fwrite(&d, sizeof(uint16_t), 1, binFile2);
      }
      fclose(binFile2);

      for (uint32_t address = 0; address < CurrentCartridge->myRomSize; address += 1) {
                // printf("%08x\t", address);
                uint16_t d = cc->decrypt16_2(address);
                fwrite(&d, sizeof(uint16_t), 1, binFile3);
      }
      fclose(binFile3);
      /* */
}

Cartridge::Cartridge(u32 size)
{
      RomPtr = (u8 *)malloc(size);
      myRomPtr = RomPtr; // modify
      if (RomPtr == nullptr)
                throw NaomiCartException("Memory allocation failed");
      RomSize = size;
      myRomSize = RomSize; // modify
      if (size != 0)
                memset(RomPtr, 0xFF, RomSize);
}


core/hw/naomi/awcartridge.h
class AWCartridge: public Cartridge
{
public:
      AWCartridge(u32 size) : Cartridge(size) {}

      void Init(LoadProgress *progress = nullptr, std::vector<u8> *digest = nullptr) override;
      u32 ReadMem(u32 address, u32 size) override;
      void WriteMem(u32 address, u32 data, u32 size) override;

      void *GetDmaPtr(u32 &size) override;
      void AdvancePtr(u32 size) override;
      bool GetBootId(RomBootID *bootId) override;

      void SetKey(u32 key) override;
      void Serialize(Serializer& ser) const override;
      void Deserialize(Deserializer& deser) override;

      /* modify */
      u16 decrypt16_2(u32 address) { return decrypt(((u16 *)RomPtr), address, rombd_key); }
      u16 decrypt16(u32 address) { return decrypt(((u16 *)RomPtr), address, rombd_key); } // 这个方法是从下面private移动到上面来的,不然没法在类外调用。
      /* */

private:
      void device_reset();

      enum { EPR, MPR_RECORD, MPR_FILE };

      u32 rombd_key;
      u32 mpr_offset, mpr_bank;
      u32 epr_offset, mpr_file_offset;
      u16 mpr_record_index, mpr_first_file_index;
      u16 decrypted_buf;

      u32 dma_offset, dma_limit;

      struct sbox_set {
                u8 S0;
                u8 S1;
                u8 S2;
                u8 S3;
      };

      static const u8 permutation_table;
      static const sbox_set sboxes_table;
      static const int xor_table;
      static u16 decrypt(u16 cipherText, u32 address, u8 key);
      // u16 decrypt16(u32 address) { return decrypt(((u16 *)RomPtr), address, rombd_key); }

      void recalc_dma_offset(int mode);
};


我只拿mslug6做实验。修改代码后再编译出模拟器,载入mslug6 aw版的rom,程序会报“段错误”退出。而相应目录下的确出现了3个bin文件。

我不明白decrypt16函数中为什么要取一个address % (RomSize / 2)。我复制了它,取名decrypt16_2,改成直接取address。

执行原版函数,程序能正常跑完,但是所得rom文件的内容,重复了大概3遍。执行修改版的函数,程序就报“段错误”退出:我是在linux下操作的,“段错误”是操作了未分配的内存空间会出现的报错。


以上,求指教。

爱唱歌的汤姆猫 发表于 2025-4-19 19:21:52

进来看看

wyz_2015 发表于 2025-4-23 00:06:11

wyz_2015 发表于 2025-4-19 18:45
关于AW板rom的解密是有进展了。
思路不是照猫画虎,借别人代码做自己的功能。而是当“小偷”,在模拟器做好 ...

ho,用原decrypt16()函数提取出来的rom虽然有重复,其实好像截取[0, 0x0c000000)字节就行了?
mslug6是如此。
页: 1 [2]
查看完整版本: [重发]一个关于Naomi/Atomiswave/DC的rom的转换与解密的问题