Finalisation du chargement depuis un fichier json
This commit is contained in:
parent
d9531cd143
commit
0ae3e474bf
140
ia86.cpp
140
ia86.cpp
|
@ -29,16 +29,16 @@ std::string intToHexString(int intValue, int size) {
|
||||||
void mapping()
|
void mapping()
|
||||||
{
|
{
|
||||||
struct_mapping::reg(&Scenario::title, "scenario_titre");
|
struct_mapping::reg(&Scenario::title, "scenario_titre");
|
||||||
struct_mapping::reg(&Scenario::Levels, "scenario_objectifs");
|
struct_mapping::reg(&Scenario::levels, "scenario_objectifs");
|
||||||
struct_mapping::reg(&Level::title, "niveau_titre");
|
struct_mapping::reg(&Level::title, "niveau_titre");
|
||||||
struct_mapping::reg(&Level::description, "niveau_description");
|
struct_mapping::reg(&Level::description, "niveau_description");
|
||||||
struct_mapping::reg(&Level::tutorial, "niveau_tutoriel");
|
struct_mapping::reg(&Level::tutorial, "niveau_tutoriel");
|
||||||
struct_mapping::reg(&Level::code, "niveau_code");
|
struct_mapping::reg(&Level::code, "niveau_code");
|
||||||
struct_mapping::reg(&Level::level, "niveau_droits");
|
struct_mapping::reg(&Level::rights, "niveau_droits");
|
||||||
struct_mapping::reg(&Level::init, "niveau_initial");
|
struct_mapping::reg(&Level::init, "niveau_initial");
|
||||||
struct_mapping::reg(&Level::goal, "niveau_objectif");
|
struct_mapping::reg(&Level::goal, "niveau_objectif");
|
||||||
struct_mapping::reg(&State::dump, "registres");
|
struct_mapping::reg(&State::dump, "registres");
|
||||||
struct_mapping::reg(&State::memzone, "memoires");
|
struct_mapping::reg(&State::code, "code");
|
||||||
struct_mapping::reg(&i386_all_regs::segs, "segments");
|
struct_mapping::reg(&i386_all_regs::segs, "segments");
|
||||||
struct_mapping::reg(&i386_all_regs::regs, "généraux");
|
struct_mapping::reg(&i386_all_regs::regs, "généraux");
|
||||||
struct_mapping::reg(&i386_all_regs::flags, "drapeaux");
|
struct_mapping::reg(&i386_all_regs::flags, "drapeaux");
|
||||||
|
@ -81,18 +81,22 @@ Scenario scenario;
|
||||||
ScenarioWindow::ScenarioWindow (finalcut::FWidget* parent)
|
ScenarioWindow::ScenarioWindow (finalcut::FWidget* parent)
|
||||||
: finalcut::FDialog{parent}
|
: finalcut::FDialog{parent}
|
||||||
{
|
{
|
||||||
|
((Menu*)this->getParent())->log.append("Chargement des scénarios");
|
||||||
scenario=readscenario("./scenarios.txt");
|
scenario=readscenario("./scenarios.txt");
|
||||||
|
if (scenario.levels.size()==0)
|
||||||
|
finalcut::FMessageBox::error(this, "Impossible de charger le scénario par défaut !");
|
||||||
listview.ignorePadding();
|
listview.ignorePadding();
|
||||||
listview.addColumn ("*");
|
listview.addColumn ("*");
|
||||||
listview.addColumn ("Intitulé");
|
listview.addColumn ("Intitulé");
|
||||||
listview.hideSortIndicator(true);
|
listview.hideSortIndicator(true);
|
||||||
listview.setFocus();
|
listview.setFocus();
|
||||||
std::vector<std::string> items;
|
std::vector<std::string> items;
|
||||||
for(size_t i=0; i < (sizeof(scenario.Levels)/sizeof(scenario.Levels[0])); i++)
|
for(size_t i=0; i < scenario.levels.size(); i++)
|
||||||
{
|
{
|
||||||
|
((Menu*)this->getParent())->log.append(".");
|
||||||
items.clear();
|
items.clear();
|
||||||
items.push_back(to_string(i));
|
items.push_back(to_string(i));
|
||||||
items.push_back(scenario.Levels[i].title);
|
items.push_back(scenario.levels[i].title);
|
||||||
const finalcut::FStringList line (items.begin(), items.end());
|
const finalcut::FStringList line (items.begin(), items.end());
|
||||||
listview.insert (line);
|
listview.insert (line);
|
||||||
}
|
}
|
||||||
|
@ -105,9 +109,7 @@ ScenarioWindow::ScenarioWindow (finalcut::FWidget* parent)
|
||||||
|
|
||||||
void ScenarioWindow::click()
|
void ScenarioWindow::click()
|
||||||
{
|
{
|
||||||
const auto& item = listview.getCurrentItem();
|
selected=listview.getindex();
|
||||||
std::string temp=item->getText(1).toString();
|
|
||||||
selected=stoi(temp);
|
|
||||||
((Menu*)this->getParent())->loadLevel();
|
((Menu*)this->getParent())->loadLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,14 +354,23 @@ Assembler::Assembler(TextWindow *log) : log(log)
|
||||||
code->assembled=false;
|
code->assembled=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MultiCode *Assembler::Createzone(std::string source)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MultiCode *Assembler::MultiAssemble(std::string source,uint32_t address)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Code *Assembler::Assemble(std::string source,uint32_t address)
|
Code *Assembler::Assemble(std::string source,uint32_t address)
|
||||||
{
|
{
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
code->address=address;
|
|
||||||
size_t srcsize=source.size();
|
size_t srcsize=source.size();
|
||||||
unsigned char src_char[srcsize+1];
|
unsigned char src_char[srcsize+1];
|
||||||
strcpy(reinterpret_cast<char*>(src_char), source.c_str());
|
strcpy(reinterpret_cast<char*>(src_char), source.c_str());
|
||||||
err2=ks_asm(ks, reinterpret_cast<const char*>(src_char), code->address, &code->content, &code->size, &srcsize);
|
err2=ks_asm(ks, reinterpret_cast<const char*>(src_char), address, &code->content, &code->size, &srcsize);
|
||||||
if (err2 != KS_ERR_OK)
|
if (err2 != KS_ERR_OK)
|
||||||
{
|
{
|
||||||
log->append("Erreur d'assemblage");
|
log->append("Erreur d'assemblage");
|
||||||
|
@ -404,7 +415,7 @@ VMEngine::VMEngine(TextWindow *log) : log(log)
|
||||||
// Level 10 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
|
// Level 10 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
|
||||||
// Level 11 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 CR0 CR2 CR3 CR4 CR8
|
// Level 11 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 CR0 CR2 CR3 CR4 CR8
|
||||||
// Level 12 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 CR0 CR2 CR3 CR4 CR8 DB0 DB1 DB2 DB3 DB6 DB7
|
// Level 12 : EIP EAX EBX ECX EDX EFLAGS ESI EDI ESP EBP CS DS ES SS FS GS ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 CR0 CR2 CR3 CR4 CR8 DB0 DB1 DB2 DB3 DB6 DB7
|
||||||
std::string VMEngine::getFlags(int level)
|
std::string VMEngine::getFlags(int rights)
|
||||||
{
|
{
|
||||||
int eflags=0;
|
int eflags=0;
|
||||||
err = uc_reg_read(uc, UC_X86_REG_EFLAGS, &eflags);
|
err = uc_reg_read(uc, UC_X86_REG_EFLAGS, &eflags);
|
||||||
|
@ -412,32 +423,32 @@ std::string VMEngine::getFlags(int level)
|
||||||
log->append("Impossible de récupérer le registre: EFLAGS");
|
log->append("Impossible de récupérer le registre: EFLAGS");
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
out << " CF:" << std::dec << ((eflags & 0x0001));
|
out << " CF:" << std::dec << ((eflags & 0x0001));
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " RF:" << std::dec << ((eflags & 0x00010000)>>16) << "\n";
|
out << " RF:" << std::dec << ((eflags & 0x00010000)>>16) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
out << " PF:" << std::dec << ((eflags & 0x0004)>>2);
|
out << " PF:" << std::dec << ((eflags & 0x0004)>>2);
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " VM:" << std::dec << ((eflags & 0x00020000)>>17) << "\n";
|
out << " VM:" << std::dec << ((eflags & 0x00020000)>>17) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
out << " AF:" << std::dec << ((eflags & 0x0010)>>4);
|
out << " AF:" << std::dec << ((eflags & 0x0010)>>4);
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " AC:" << std::dec << ((eflags & 0x00040000)>>18) << "\n";
|
out << " AC:" << std::dec << ((eflags & 0x00040000)>>18) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
out << " ZF:" << std::dec << ((eflags & 0x0040)>>6);
|
out << " ZF:" << std::dec << ((eflags & 0x0040)>>6);
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " VIF:" << std::dec << ((eflags & 0x00080000)>>19) << "\n";
|
out << " VIF:" << std::dec << ((eflags & 0x00080000)>>19) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
out << " SF:" << std::dec << ((eflags & 0x0080)>>7);
|
out << " SF:" << std::dec << ((eflags & 0x0080)>>7);
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " VIP:" << std::dec << ((eflags & 0x00100000)>>20) << "\n";
|
out << " VIP:" << std::dec << ((eflags & 0x00100000)>>20) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
out << " TF:" << std::dec << ((eflags & 0x0100)>>8);
|
out << " TF:" << std::dec << ((eflags & 0x0100)>>8);
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << " ID:" << std::dec << ((eflags & 0x00200000)>>21) << "\n";
|
out << " ID:" << std::dec << ((eflags & 0x00200000)>>21) << "\n";
|
||||||
else
|
else
|
||||||
out << "\n";
|
out << "\n";
|
||||||
|
@ -449,7 +460,7 @@ std::string VMEngine::getFlags(int level)
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string VMEngine::getRegs(int level)
|
std::string VMEngine::getRegs(int rights)
|
||||||
{
|
{
|
||||||
int regsi836[] = {
|
int regsi836[] = {
|
||||||
UC_X86_REG_EAX, UC_X86_REG_EBX, UC_X86_REG_ECX, UC_X86_REG_EDX,
|
UC_X86_REG_EAX, UC_X86_REG_EBX, UC_X86_REG_ECX, UC_X86_REG_EDX,
|
||||||
|
@ -469,78 +480,78 @@ std::string VMEngine::getRegs(int level)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EAX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[0] << " | ";
|
out << "EAX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[0] << " | ";
|
||||||
if (level > 1)
|
if (rights > 1)
|
||||||
out << "AX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[0] & 0x0000FFFF) << " | ";
|
out << "AX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[0] & 0x0000FFFF) << " | ";
|
||||||
if (level > 1)
|
if (rights > 1)
|
||||||
out << "AH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[0] & 0xFF00) >> 8) << " | ";
|
out << "AH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[0] & 0xFF00) >> 8) << " | ";
|
||||||
out << "AL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[0] & 0xFF) << "\n";
|
out << "AL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[0] & 0xFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EBX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[1] << " | ";
|
out << "EBX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[1] << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "BX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[1] & 0x0000FFFF) << " | ";
|
out << "BX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[1] & 0x0000FFFF) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "BH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[1] & 0xFF00) >> 8) << " | ";
|
out << "BH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[1] & 0xFF00) >> 8) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "BL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[1] & 0xFF) << "\n";
|
out << "BL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[1] & 0xFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "ECX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[2] << " | ";
|
out << "ECX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[2] << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "CX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[2] & 0x0000FFFF) << " | ";
|
out << "CX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[2] & 0x0000FFFF) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "CH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[2] & 0xFF00) >> 8) << " | ";
|
out << "CH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[2] & 0xFF00) >> 8) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "CL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[2] & 0xFF) << "\n";
|
out << "CL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[2] & 0xFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EDX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[3] << " | ";
|
out << "EDX:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[3] << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "DX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[3] & 0x0000FFFF) << " | ";
|
out << "DX:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[3] & 0x0000FFFF) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "DH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[3] & 0xFF00) >> 8) << " | ";
|
out << "DH:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((vals[3] & 0xFF00) >> 8) << " | ";
|
||||||
if (level > 2)
|
if (rights > 2)
|
||||||
out << "DL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[3] & 0xFF) << "\n";
|
out << "DL:" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (vals[3] & 0xFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "ESI:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[4] << " | ";
|
out << "ESI:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[4] << " | ";
|
||||||
if (level > 4)
|
if (rights > 4)
|
||||||
out << "SI:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[4] & 0x0000FFFF) << "\n";
|
out << "SI:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[4] & 0x0000FFFF) << "\n";
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EDI:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[5] << " | ";
|
out << "EDI:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[5] << " | ";
|
||||||
if (level > 4)
|
if (rights > 4)
|
||||||
out << "DI:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[5] & 0x0000FFFF) << "\n";
|
out << "DI:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[5] & 0x0000FFFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EBP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[6] << " | ";
|
out << "EBP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[6] << " | ";
|
||||||
if (level > 5)
|
if (rights > 5)
|
||||||
out << "BP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[6] & 0x0000FFFF) << "\n";
|
out << "BP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[6] & 0x0000FFFF) << "\n";
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "ESP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[7] << " | ";
|
out << "ESP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[7] << " | ";
|
||||||
if (level > 5)
|
if (rights > 5)
|
||||||
out << "SP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[7] & 0x0000FFFF) << "\n";
|
out << "SP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[7] & 0x0000FFFF) << "\n";
|
||||||
|
|
||||||
if (level > 6)
|
if (rights > 6)
|
||||||
out << "CS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[8] & 0x0000FFFF) << " | ";
|
out << "CS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[8] & 0x0000FFFF) << " | ";
|
||||||
if (level > 6)
|
if (rights > 6)
|
||||||
out << "DS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[9] & 0x0000FFFF) << " | ";
|
out << "DS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[9] & 0x0000FFFF) << " | ";
|
||||||
if (level > 6)
|
if (rights > 6)
|
||||||
out << "ES:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[10] & 0x0000FFFF) << "\n";
|
out << "ES:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[10] & 0x0000FFFF) << "\n";
|
||||||
if (level > 6)
|
if (rights > 6)
|
||||||
out << "SS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[11] & 0x0000FFFF) << " | ";
|
out << "SS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[11] & 0x0000FFFF) << " | ";
|
||||||
if (level > 7)
|
if (rights > 7)
|
||||||
out << "FS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[12] & 0x0000FFFF) << " | ";
|
out << "FS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[12] & 0x0000FFFF) << " | ";
|
||||||
if (level > 7)
|
if (rights > 7)
|
||||||
out << "GS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[13] & 0x0000FFFF) << "\n";
|
out << "GS:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[13] & 0x0000FFFF) << "\n";
|
||||||
|
|
||||||
if (level > 8)
|
if (rights > 8)
|
||||||
out << "EIP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[14] << " | ";
|
out << "EIP:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[14] << " | ";
|
||||||
out << "IP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[14] & 0x0000FFFF) << "\n";
|
out << "IP:" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << (vals[14] & 0x0000FFFF) << "\n";
|
||||||
|
|
||||||
if (level > 3)
|
if (rights > 3)
|
||||||
if (level < 9)
|
if (rights < 9)
|
||||||
out << "FLAGS:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (vals[15] & 0xFFFF)<< "";
|
out << "FLAGS:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (vals[15] & 0xFFFF)<< "";
|
||||||
else
|
else
|
||||||
out << "EFLAGS:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[15] << "";
|
out << "EFLAGS:" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << vals[15] << "";
|
||||||
|
@ -740,6 +751,7 @@ void Menu::initCore()
|
||||||
{
|
{
|
||||||
addTimer (50);
|
addTimer (50);
|
||||||
log.append(scenario.title);
|
log.append(scenario.title);
|
||||||
|
if (scenario.levels.size()>0)
|
||||||
loadLevel();
|
loadLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -809,13 +821,13 @@ void Menu::AdjustWindows()
|
||||||
tuto.show();
|
tuto.show();
|
||||||
debug.show();
|
debug.show();
|
||||||
scenar.show();
|
scenar.show();
|
||||||
if (scenario.Levels[scenar.getselected()].level > 3)
|
if (scenario.levels[scenar.getselected()].rights > 3)
|
||||||
flags.show();
|
flags.show();
|
||||||
if (scenario.Levels[scenar.getselected()].level > 5)
|
if (scenario.levels[scenar.getselected()].rights > 5)
|
||||||
stack.show();
|
stack.show();
|
||||||
if (scenario.Levels[scenar.getselected()].level > 2)
|
if (scenario.levels[scenar.getselected()].rights > 2)
|
||||||
mem.show();
|
mem.show();
|
||||||
if (scenario.Levels[scenar.getselected()].level > 6)
|
if (scenario.levels[scenar.getselected()].rights > 6)
|
||||||
screen.show();
|
screen.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,17 +964,17 @@ void Menu::onClose (finalcut::FCloseEvent* ev)
|
||||||
|
|
||||||
void Menu::loadLevel()
|
void Menu::loadLevel()
|
||||||
{
|
{
|
||||||
log.append("Chargement du scénario "+scenario.Levels[scenar.getselected()].title);
|
log.append("Chargement du scénario "+scenario.levels[scenar.getselected()].title);
|
||||||
view.setText("Objectif: "+scenario.Levels[scenar.getselected()].title);
|
view.setText("Objectif: "+scenario.levels[scenar.getselected()].title);
|
||||||
view.clear();
|
view.clear();
|
||||||
view.append(scenario.Levels[scenar.getselected()].description);
|
view.append(scenario.levels[scenar.getselected()].description);
|
||||||
tuto.clear();
|
tuto.clear();
|
||||||
tuto.append(scenario.Levels[scenar.getselected()].tutorial);
|
tuto.append(scenario.levels[scenar.getselected()].tutorial);
|
||||||
regs.set("En attente d'initialisation...");
|
regs.set("En attente d'initialisation...");
|
||||||
edit.set(scenario.Levels[scenar.getselected()].code);
|
edit.set(scenario.levels[scenar.getselected()].code);
|
||||||
AdjustWindows();
|
AdjustWindows();
|
||||||
debug.clear();
|
debug.clear();
|
||||||
vm.Configure(&scenario.Levels[scenar.getselected()].init,code);
|
vm.Configure(&scenario.levels[scenar.getselected()].init,code);
|
||||||
end();
|
end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -973,7 +985,7 @@ void Menu::end()
|
||||||
|
|
||||||
void Menu::compile()
|
void Menu::compile()
|
||||||
{
|
{
|
||||||
code=asmer.Assemble(edit.get(),scenario.Levels[scenar.getselected()].init.dump.regs.eip);
|
code=asmer.Assemble(edit.get(),scenario.levels[scenar.getselected()].init.dump.regs.eip);
|
||||||
debug.set(unasmer.Desassemble(code));
|
debug.set(unasmer.Desassemble(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,7 +1018,7 @@ bool Menu::verify()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!code->initialized)
|
if (!code->initialized)
|
||||||
vm.Prepare(&scenario.Levels[scenar.getselected()].init,code);
|
vm.Prepare(&scenario.levels[scenar.getselected()].init,code);
|
||||||
if (!code->initialized)
|
if (!code->initialized)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
|
@ -1022,8 +1034,8 @@ void Menu::refresh()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
regs.set(vm.getRegs(scenario.Levels[scenar.getselected()].level));
|
regs.set(vm.getRegs(scenario.levels[scenar.getselected()].rights));
|
||||||
flags.set(vm.getFlags(scenario.Levels[scenar.getselected()].level));
|
flags.set(vm.getFlags(scenario.levels[scenar.getselected()].rights));
|
||||||
//debug.setindex(vm.getEIP(code));
|
//debug.setindex(vm.getEIP(code));
|
||||||
}
|
}
|
||||||
if (!code->executed)
|
if (!code->executed)
|
||||||
|
|
31
ia86.h
31
ia86.h
|
@ -107,18 +107,9 @@ using finalcut::FSize;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
} __attribute__ (( packed ));
|
} __attribute__ (( packed ));
|
||||||
|
|
||||||
|
|
||||||
struct Memzone
|
|
||||||
{
|
|
||||||
uint32_t address;
|
|
||||||
uint32_t size;
|
|
||||||
std::string code;
|
|
||||||
uint8_t *content;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
i386_all_regs dump;
|
i386_all_regs dump;
|
||||||
std::vector<Memzone> memzone;
|
std::string code;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Level {
|
struct Level {
|
||||||
|
@ -126,22 +117,32 @@ struct Level {
|
||||||
std::string description;
|
std::string description;
|
||||||
std::string tutorial;
|
std::string tutorial;
|
||||||
std::string code;
|
std::string code;
|
||||||
int level;
|
int rights;
|
||||||
State init;
|
State init;
|
||||||
State goal;
|
State goal;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Scenario {
|
struct Scenario {
|
||||||
std::string title;
|
std::string title;
|
||||||
std::vector<Level> Levels;
|
std::vector<Level> levels;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Code
|
struct Code
|
||||||
{
|
{
|
||||||
std::vector<Memzone> memzones;
|
uint32_t address;
|
||||||
|
size_t size;
|
||||||
|
uint8_t *content;
|
||||||
bool assembled;
|
bool assembled;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
bool executed;
|
bool executed;
|
||||||
|
std::string code;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MultiCode
|
||||||
|
{
|
||||||
|
std::vector<Code> zones;
|
||||||
|
uint32_t entrypoint;
|
||||||
|
bool executed;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ScenarioWindow final : public finalcut::FDialog
|
class ScenarioWindow final : public finalcut::FDialog
|
||||||
|
@ -264,7 +265,9 @@ class Assembler
|
||||||
public:
|
public:
|
||||||
Assembler(TextWindow *log);
|
Assembler(TextWindow *log);
|
||||||
Code *Assemble(std::string source,uint32_t address);
|
Code *Assemble(std::string source,uint32_t address);
|
||||||
|
MultiCode *MultiAssemble(std::string source,uint32_t address);
|
||||||
private:
|
private:
|
||||||
|
MultiCode *Createzone(std::string source);
|
||||||
ks_engine *ks;
|
ks_engine *ks;
|
||||||
ks_err err;
|
ks_err err;
|
||||||
int err2;
|
int err2;
|
||||||
|
@ -307,6 +310,7 @@ class Menu final : public finalcut::FDialog
|
||||||
Menu& operator = (const Menu&) = delete;
|
Menu& operator = (const Menu&) = delete;
|
||||||
// Methods
|
// Methods
|
||||||
void loadLevel();
|
void loadLevel();
|
||||||
|
TextWindow log{this};
|
||||||
private:
|
private:
|
||||||
Code *code = new Code();
|
Code *code = new Code();
|
||||||
void onTimer (finalcut::FTimerEvent*) override;
|
void onTimer (finalcut::FTimerEvent*) override;
|
||||||
|
@ -355,7 +359,6 @@ class Menu final : public finalcut::FDialog
|
||||||
finalcut::FMenuItem About{"&A propos", &Help};
|
finalcut::FMenuItem About{"&A propos", &Help};
|
||||||
finalcut::FLabel Info{this};
|
finalcut::FLabel Info{this};
|
||||||
finalcut::FStatusBar Statusbar{this};
|
finalcut::FStatusBar Statusbar{this};
|
||||||
TextWindow log{this};
|
|
||||||
TextWindow view{this};
|
TextWindow view{this};
|
||||||
InstructionWindow debug{this};
|
InstructionWindow debug{this};
|
||||||
TextWindow regs{this};
|
TextWindow regs{this};
|
||||||
|
|
|
@ -38,10 +38,7 @@ hlt",
|
||||||
},
|
},
|
||||||
"drapeaux" : 1
|
"drapeaux" : 1
|
||||||
},
|
},
|
||||||
"memoires" :
|
"code" : "ceci est le code"
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"niveau_objectif" :
|
"niveau_objectif" :
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue