Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible to use the function signatures from IDA for the decomp? #17

Open
palmerj opened this issue Jan 13, 2023 · 2 comments
Open

Possible to use the function signatures from IDA for the decomp? #17

palmerj opened this issue Jan 13, 2023 · 2 comments

Comments

@palmerj
Copy link

palmerj commented Jan 13, 2023

Ghidra:

int __cdecl16far main(int argc,char **argv, char **envp)

{
  byte bVar1;
  uint uVar2;
  char *unaff_DS;
  char *pcVar3;
  int iVar4;
  
  _aFchkstk();
  pcVar3 = unaff_DS;
  _printf((char *)0x1010);
  if (argc < 2) goto LAB_1292_0069;
  pcVar3 = argv[3];
  uVar2 = _strlen(argv[2]);
  if (uVar2 != 1) goto LAB_1292_0069;
  bVar1 = **(byte **)(argv + 2);
  if (bVar1 == 100) {
LAB_1292_00a7:
    pcVar3 = (char *)0x1;
  }
  else {
    if (100 < bVar1) goto LAB_1292_0069;
    if (bVar1 != 0x43) {
      if (bVar1 == 0x44) goto LAB_1292_00a7;
      if (bVar1 != 99) goto LAB_1292_0069;
    }
    pcVar3 = (char *)0x0;
  }
LAB_1292_0069:
  if ((pcVar3 == (char *)0xffff) || (argc < 3)) {
    show_usage((int)pcVar3);
    _exit(1);
  }
  pcVar3 = argv[5];
  strcpy((char *)0x4acc,unaff_DS);
  for (iVar4 = 3; iVar4 < argc; iVar4 = iVar4 + 1) {
    _strcat((char *)0x4acc,unaff_DS);
    pcVar3 = argv[iVar4 * 2 + 1];
    _strcat((char *)0x4acc,unaff_DS);
  }
  if (pcVar3 == (char *)0x0) {
    iVar4 = dcs_decompress(0x4acc);
  }
  else {
    iVar4 = dcs_compress(0x4acc);
  }
  return iVar4;
}

BLC:

void _main(__uint16 param_1, int16_t param_2, __uint32 param_3)
{
   uint8_t uVar1;
   int16_t iVar2;
   int16_t iVar3;
   __uint16 xVar4;
   int16_t unaff_DS;
   int16_t iVar5;

   __aFchkstk();
   _printf(0x13c8, 0x1010);
   iVar3 = (int16_t)param_3;
   xVar4 = (__uint16)((uint32_t)param_3 >> 0x10);
   if (param_2 < 2) {
      goto loc_12989;
   }
   unaff_DS = *(int16_t*)(iVar3 + 6);
   iVar2 = _strlen(0x13c8, *(__uint16*)(iVar3 + 4));
   if (iVar2 != 1) {
      goto loc_12989;
   }
   uVar1 = **(uint8_t**)(iVar3 + 4);
   if (uVar1 == 100) {
loc_129C7:
      unaff_DS = 1;
   }
   else {
      if (100 < uVar1) {
         goto loc_12989;
      }
      if (uVar1 != 0x43) {
         if (uVar1 == 0x44) {
            goto loc_129C7;
         }
         if (uVar1 != 99) {
            goto loc_12989;
         }
      }
      unaff_DS = 0;
   }
loc_12989:
   if ((unaff_DS == -1) || (param_2 < 3)) {
      show_usage(0x13c8, unaff_DS);
      _exit(0x1000, 1);
   }
   iVar2 = *(int16_t*)(iVar3 + 10);
   _strcpy(0x13c8, 0x4acc);
   iVar5 = 3;
   iVar5 < param_2;
   iVar5 = iVar5 + 1;
   _strcat(0x13c8, 0x4acc);
   iVar2 = *(int16_t*)(iVar5 * 4 + iVar3 + 2);
   _strcat(0x13c8, 0x4acc);
   if (iVar2 == 0) {
      dcs_decompress(0x13c8, 0x4acc);
   }
   else {
      dcs_compress(0x13c8, 0x4acc);
   }
   return;
}

Not having the main and string function signatures and parameters as defined in IDA disassembly I think it hurting the decomp process.

Seems to be missing an obvious loop too.

This is for a DOS 16 Real mode EXE binary. See EXE here

@palmerj
Copy link
Author

palmerj commented Jan 13, 2023

Note I can't seem to rename signature parameters, only locals. So it would be really good/powerful to use the IDA variable types and names.

@palmerj
Copy link
Author

palmerj commented Jan 13, 2023

Still it's really cool that's it's even possible to do this decomp in IDA - thank so much

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant