diff options
Diffstat (limited to 'reverse-engineering/dosbox_snif/main_validate_code.c')
-rw-r--r-- | reverse-engineering/dosbox_snif/main_validate_code.c | 136 |
1 files changed, 91 insertions, 45 deletions
diff --git a/reverse-engineering/dosbox_snif/main_validate_code.c b/reverse-engineering/dosbox_snif/main_validate_code.c index 22ce62d..afb32ae 100644 --- a/reverse-engineering/dosbox_snif/main_validate_code.c +++ b/reverse-engineering/dosbox_snif/main_validate_code.c @@ -4,24 +4,92 @@ #include "rsp_lemm.h" #include "utils.h" -#include <string.h> /* memset() */ -#include <stdio.h> /* printf() */ +#include <string.h> /* memset(), memcmp() */ +#include <stdio.h> /* snprintf(), printf() */ +#include <stdlib.h> /* free() */ +#include <stddef.h> /* offsetof() */ +//#include <unistd.h> /* sleep() */ + +int game_data_diff(struct game_data *g1, struct game_data *g2, char diff[], size_t difflen) { + int i, start, end, lemm, lemmcount, off; + uint8_t *g1_raw = (uint8_t *)g1; + uint8_t *g2_raw = (uint8_t *)g2; + + + start=offsetof(struct game_data, lemm_count_to_process); + end=offsetof(struct game_data, lemmings); + for (i=start; i<end; i++) { + if ( g1_raw[i] != g2_raw[i] ) { + snprintf(diff, difflen, "game_data[0x%02X] : %02hhX / %02hhX", i, g1_raw[i], g2_raw[i]); + return 1; + } + } + + lemmcount = imin(g1->lemm_level_count, (sizeof(g1->lemmings) / sizeof(struct _lemm_data))); +// printf("lemmcount:%i\n", lemmcount); + + for (lemm=0; lemm < lemmcount; lemm++ ) { + start=offsetof(struct game_data, lemmings) + lemm * sizeof(struct _lemm_data); +// printf("lemmings[%i] : [0x%0X]\n", lemm, start); + + for (off=0; off<sizeof(struct _lemm_data); off++) { + i=start+off; + if ( g1_raw[i] != g2_raw[i] ) { + snprintf(diff, difflen, "lemmings[%i][0x%02X] : %02hhX / %02hhX", lemm, off, g1_raw[i], g2_raw[i]); + return 1; + } + + } + + } -inline int imin(int a, int b) { - if ( a < b ) return a; - return b; + if ( memcmp(g1,g2,sizeof(struct game_data)) != 0 ) { + snprintf(diff, difflen, "Unknown"); + return 1; + } + + return 0; } -int main(int argc, char *argv[]) { - int rv, i, end=0, byte, loops; - struct rsp_state rsp; - char ds_si[10], command[16], hex_byte[3]; - unsigned int addr, size, offset; +void _mem_dump(struct rsp_state *rsp, struct game_data *g) { unsigned int bs=0x100; /* RSP memdump block size */ - struct game_data g_before, g_after, g_simulated, *g; + unsigned int i, addr, size, offset, byte; + char command[16], hex_byte[3]; hex_byte[2]='\0'; + for (offset=0 ; offset < sizeof(struct game_data) ; offset += bs) { + size = imin(bs,sizeof(struct game_data)-offset); + addr = (0xb55 << 4) + offset; + snprintf(command, 15, "m%06x,0x%x", addr, size); + //printf("-> %s\n", command); + rsp_query(rsp, command); + if ( rsp_decode(rsp) != size*2) { + printf("%06x : Bug\n", addr); + break; + } + + //printf("%06x : %s\n", addr, rsp->decoded); + for (i=0;i<size;i++) { + memcpy(hex_byte, rsp->decoded+(i*2), 2); + if ( sscanf(hex_byte, "%x", &byte) != 1 ) { + printf("Bug decode\n"); + break; + } + ((char *)g)[offset+i] = byte; + //printf("((char *)&g)[0x%02x] = 0x%02x\n", offset+i, byte); + } + } + //printf("\n"); +} + +int main(int argc, char *argv[]) { + int rv, end=0, loops; + char ds_si[10]; + struct rsp_state rsp; + char msg_diff[256]; + struct game_data g_before, g_after, g_simulated; + rv=rsp_lemm_init(&rsp, ds_si); if ( rv != 0 ) { @@ -43,53 +111,31 @@ int main(int argc, char *argv[]) { printf("Bug 03\n"); continue; } - rsp_recv_full(&rsp); + //rsp_recv_full(&rsp); if ( rsp_check_and_clear(&rsp, "S05") != 0 ) { printf("Bug 04\n"); continue; } rsp_query(&rsp, "p8"); // Read $eip - if ( rsp_check_and_clear(&rsp, "c4380000") ) { - g = &g_before; - } else { - g = &g_after; - } - - //printf("sizeof(struct game_data) == %i\n", sizeof(struct game_data) ); - - for (offset=0 ; offset < sizeof(struct game_data) ; offset += size) { - size = imin(bs,sizeof(struct game_data)-offset); - addr = (0xb55 << 4) + offset; - snprintf(command, 15, "m%06x,0x%x", addr, size); - //printf("-> %s\n", command); - rsp_query(&rsp, command); - if ( rsp_decode(&rsp) != size*2) { - printf("%06x : Bug\n", addr); - break; - } - //printf("%06x : %s\n", addr, rsp.decoded); - for (i=0;i<size;i++) { - memcpy(hex_byte, rsp.decoded+(i*2), 2); - if ( sscanf(hex_byte, "%x", &byte) != 1 ) { - printf("Bug decode\n"); - break; - } - ((char *)g)[offset+i] = byte; - //printf("((char *)&g)[0x%02x] = 0x%02x\n", offset+i, byte); - } - } - //printf("\n"); + //printf("DEBUG : rsp->response_bom+1 : %s\n", rsp.response_bom + 1); + if ( rsp_check_and_clear(&rsp, "c4380000") == 0 ) { + // Beginning of move_lemmings() + _mem_dump(&rsp,&g_before); - if ( g == &g_before ) { // Exec simulation memcpy(&g_simulated,&g_before,sizeof(struct game_data)); move_lemmings(&g_simulated); } else { + // End of move_lemmings() + _mem_dump(&rsp,&g_after); + // Compare simulation results and orignal code results - if ( game_data_diff(&g_simulated, &g_after) != 0 ) { - (void) scanf("%s"); + if ( game_data_diff(&g_after, &g_simulated, msg_diff, sizeof(msg_diff)) != 0 ) { + printf("Diff found : %s\n", msg_diff); + //(void) scanf("nothing"); + //sleep(1); } } |