翼岬搭档 发表于 2025-4-3 22:15
如果没学过编译,劝楼主放弃吧,这个是硬伤
编译对我来说问题没那么大。只要代码本身没错,依赖包不是极其新,目前基本上没有编不过的。
我仍然认为硬伤在于搞清楚代码里的调用逻辑和AW硬件基础知识。搞清楚了,就可以利用之,编写符合自己需要的程序了。 代码搞不懂问AI啊 翼岬搭档 发表于 2025-3-25 22:03
楼主的问题其实加解密转换都是专业人士编译的工具做到的,从模拟器源码获得解密函数自己编辑工具,并且逆向 ...
你也跑这来了啊。之前加过你Q,我原先的那个Q被TX封了。 本帖最后由 leoxxx 于 2025-4-5 10:03 编辑
AW转NAOMI意义何在?你确定你找到的不是转DC的?我到是见过AW转DC的,主要是给实机用的。国外和国内论坛都有相关的贴子,B站还有视频。至于工具和教程我是没见过。自行用G搜索一下看看。
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:27 编辑
itasoga 发表于 2025-4-5 08:48
代码搞不懂问AI啊
233,要是我没试过我也不至于说碰到了痛点吧?
可能我没去买专门分析代码的AI吧,平时用的AI并不能胜任:给了它github仓库地址,它告诉我没法分析外部链接,我要帮AI整理好代码了估计我自己也能看懂了。同时MAME的代码涉及了太多真机的知识,AI或许不一定能联想到那些知识。 leoxxx 发表于 2025-4-5 09:46
你也跑这来了啊。之前加过你Q,我原先的那个Q被TX封了。
偶尔看看 本帖最后由 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下操作的,“段错误”是操作了未分配的内存空间会出现的报错。
以上,求指教。 进来看看 wyz_2015 发表于 2025-4-19 18:45
关于AW板rom的解密是有进展了。
思路不是照猫画虎,借别人代码做自己的功能。而是当“小偷”,在模拟器做好 ...
ho,用原decrypt16()函数提取出来的rom虽然有重复,其实好像截取[0, 0x0c000000)字节就行了?
mslug6是如此。
页:
1
[2]