找回密码
 立即注册

微信扫码登录

使用验证码登录

QQ登录

只需一步,快速开始

楼主: wyz_2015

[重发]一个关于Naomi/Atomiswave/DC的rom的转换与解密的问题

[复制链接]

4

主题

19

回帖

1778

积分

金牌会员

积分
1778
 楼主| 发表于 2025-4-4 23:58:14 | 显示全部楼层
本帖最后由 wyz_2015 于 2025-4-5 00:00 编辑
翼岬搭档 发表于 2025-4-3 22:15
如果没学过编译,劝楼主放弃吧,这个是硬伤

编译对我来说问题没那么大。只要代码本身没错,依赖包不是极其新,目前基本上没有编不过的。
我仍然认为硬伤在于搞清楚代码里的调用逻辑和AW硬件基础知识。搞清楚了,就可以利用之,编写符合自己需要的程序了。

0

主题

321

回帖

3363

积分

论坛元老

积分
3363
发表于 2025-4-5 08:48:10 | 显示全部楼层
代码搞不懂问AI啊

11

主题

346

回帖

9978

积分

论坛元老

积分
9978

活跃会员

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

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

11

主题

346

回帖

9978

积分

论坛元老

积分
9978

活跃会员

发表于 2025-4-5 09:48:13 | 显示全部楼层
本帖最后由 leoxxx 于 2025-4-5 10:03 编辑

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

4

主题

19

回帖

1778

积分

金牌会员

积分
1778
 楼主| 发表于 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弹出。

4

主题

19

回帖

1778

积分

金牌会员

积分
1778
 楼主| 发表于 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或许不一定能联想到那些知识。

1

主题

4

回帖

61

积分

注册会员

积分
61
发表于 2025-4-9 08:05:05 | 显示全部楼层
leoxxx 发表于 2025-4-5 09:46
你也跑这来了啊。之前加过你Q,我原先的那个Q被TX封了。

偶尔看看

4

主题

19

回帖

1778

积分

金牌会员

积分
1778
 楼主| 发表于 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处。额外添加的代码周围有类似这样的注释:
  1. /* modify */
  2. 额外的代码……
  3. /* */
复制代码

还有
  1. #include <stdio.h>
复制代码

也是要的,在这就省略不提了。

core/hw/naomi/naomi_cart.h
  1. class Cartridge
  2. {
  3. public:
  4.         Cartridge(u32 size);
  5.         virtual ~Cartridge();

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

  12.         virtual bool Read(u32 offset, u32 size, void* dst);
  13.         virtual bool Write(u32 offset, u32 size, u32 data);
  14.         virtual void* GetPtr(u32 offset, u32& size);
  15.         virtual void* GetDmaPtr(u32 &size) = 0;
  16.         virtual void AdvancePtr(u32 size) = 0;
  17.         virtual void Serialize(Serializer& ser) const {}
  18.         virtual void Deserialize(Deserializer& deser) {}
  19.         virtual void SetKey(u32 key) { }
  20.         virtual void SetKeyData(u8 *key_data) { }
  21.         virtual bool GetBootId(RomBootID *bootId) = 0;

  22.         const Game *game = nullptr;

  23.         /* modify */
  24.         u8* myRomPtr;
  25.         u32 myRomSize;
  26.         /* */

  27. protected:
  28.         u8* RomPtr;
  29.         u32 RomSize;
  30. };
复制代码

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

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

  4. #endif
  5.         }
  6.         else
  7.         {
  8.                 NOTICE_LOG(NAOMI, "NAOMI GAME ID [%s]", settings.content.gameId.c_str());
  9.         }

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

  17.         AWCartridge* cc = (AWCartridge*)CurrentCartridge;

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

  25.         for (uint32_t address = 0; address < CurrentCartridge->myRomSize; address += 1) {
  26.                 // printf("%08x\t", address);
  27.                 uint16_t d = cc->decrypt16_2(address);
  28.                 fwrite(&d, sizeof(uint16_t), 1, binFile3);
  29.         }
  30.         fclose(binFile3);
  31.         /* */
  32. }
复制代码
  1. Cartridge::Cartridge(u32 size)
  2. {
  3.         RomPtr = (u8 *)malloc(size);
  4.         myRomPtr = RomPtr; // modify
  5.         if (RomPtr == nullptr)
  6.                 throw NaomiCartException("Memory allocation failed");
  7.         RomSize = size;
  8.         myRomSize = RomSize; // modify
  9.         if (size != 0)
  10.                 memset(RomPtr, 0xFF, RomSize);
  11. }
复制代码

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

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

  8.         void *GetDmaPtr(u32 &size) override;
  9.         void AdvancePtr(u32 size) override;
  10.         bool GetBootId(RomBootID *bootId) override;

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

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

  18. private:
  19.         void device_reset();

  20.         enum { EPR, MPR_RECORD, MPR_FILE };

  21.         u32 rombd_key;
  22.         u32 mpr_offset, mpr_bank;
  23.         u32 epr_offset, mpr_file_offset;
  24.         u16 mpr_record_index, mpr_first_file_index;
  25.         u16 decrypted_buf[16];

  26.         u32 dma_offset, dma_limit;

  27.         struct sbox_set {
  28.                 u8 S0[32];
  29.                 u8 S1[16];
  30.                 u8 S2[16];
  31.                 u8 S3[8];
  32.         };

  33.         static const u8 permutation_table[4][16];
  34.         static const sbox_set sboxes_table[4];
  35.         static const int xor_table[16];
  36.         static u16 decrypt(u16 cipherText, u32 address, u8 key);
  37.         // u16 decrypt16(u32 address) { return decrypt(((u16 *)RomPtr)[address % (RomSize / 2)], address, rombd_key); }

  38.         void recalc_dma_offset(int mode);
  39. };
复制代码


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

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

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


以上,求指教。

152

主题

7718

回帖

1万

积分

论坛元老

独乐乐不如众乐乐,免费分享游戏光荣,贩卖游戏可耻,记住这句话的真正含义吧。

积分
17124

推广达人最佳新人

发表于 2025-4-19 19:21:52 | 显示全部楼层
进来看看
回复

使用道具 举报

4

主题

19

回帖

1778

积分

金牌会员

积分
1778
 楼主| 发表于 2025-4-23 00:06:11 | 显示全部楼层
wyz_2015 发表于 2025-4-19 18:45
关于AW板rom的解密是有进展了。
思路不是照猫画虎,借别人代码做自己的功能。而是当“小偷”,在模拟器做好 ...

ho,用原decrypt16()函数提取出来的rom虽然有重复,其实好像截取[0, 0x0c000000)字节就行了?
mslug6是如此。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|肖琪模拟游戏站 ( 沪ICP备2023018581号-5|沪公网安备31011702888952号 )

GMT+8, 2025-6-3 14:41 , Processed in 0.035309 second(s), 3 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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