mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 04:20:46 +00:00
start implement detections of export functions name. not finish does not working yet. Only fix pe loader so it works
svn path=/trunk/; revision=25658
This commit is contained in:
parent
61bb2998be
commit
70ab8ffa3c
4 changed files with 67 additions and 71 deletions
|
@ -156,6 +156,19 @@ CPU_INT ConvertToIA32Process( FILE *outfp,
|
||||||
/* dst are register */
|
/* dst are register */
|
||||||
tmp = stack - (pMystart->dst*regbits);
|
tmp = stack - (pMystart->dst*regbits);
|
||||||
|
|
||||||
|
if ((pMystart->type & 2)== 2)
|
||||||
|
{
|
||||||
|
fprintf(outfp,"mov ");
|
||||||
|
standardreg( RegTableCount,
|
||||||
|
pMystart->dst,
|
||||||
|
setup_ebp, outfp);
|
||||||
|
fprintf(outfp," , ");
|
||||||
|
standardreg( RegTableCount,
|
||||||
|
pMystart->src,
|
||||||
|
setup_ebp, outfp);
|
||||||
|
fprintf(outfp,"\n");
|
||||||
|
|
||||||
|
}
|
||||||
if ((pMystart->type & 16)== 16)
|
if ((pMystart->type & 16)== 16)
|
||||||
{
|
{
|
||||||
/* source are imm */
|
/* source are imm */
|
||||||
|
|
|
@ -98,8 +98,11 @@ int main(int argc, char * argv[])
|
||||||
// mode 1 convert to intel
|
// mode 1 convert to intel
|
||||||
// mode 2 convert to ppc
|
// mode 2 convert to ppc
|
||||||
//return LoadPFileImage(infile,outfile,BaseAddress,cpuid,type, mode);
|
//return LoadPFileImage(infile,outfile,BaseAddress,cpuid,type, mode);
|
||||||
LoadPFileImage("e:\\testppc.exe","e:\\cputoppc.asm",0,0,0,1);
|
//LoadPFileImage("e:\\testppc.exe","e:\\cputointel.asm",0,0,0,1);
|
||||||
LoadPFileImage("e:\\testppc.exe","e:\\cputointel.asm",0,0,0,2);
|
LoadPFileImage("e:\\testppc.exe","e:\\cputointel.asm",0,0,0,1);
|
||||||
|
//pMyBrainAnalys = NULL;
|
||||||
|
//pStartMyBrainAnalys = NULL;
|
||||||
|
//LoadPFileImage("e:\\testppc.exe","e:\\cputoppc.asm",0,0,0,2);
|
||||||
|
|
||||||
// return LoadPFileImage("e:\\testms.exe","e:\\cputointel.asm",0,0,0,1); // convert
|
// return LoadPFileImage("e:\\testms.exe","e:\\cputointel.asm",0,0,0,1); // convert
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -11,23 +11,15 @@
|
||||||
|
|
||||||
/* FIXME RA should be 0 in stwu */
|
/* FIXME RA should be 0 in stwu */
|
||||||
CPU_BYTE cpuPPCInit_Blr[32] = {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,1,0,0,1,1, 1,0};
|
CPU_BYTE cpuPPCInit_Blr[32] = {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,1,0,0,1,1, 1,0};
|
||||||
|
/* addi */
|
||||||
CPU_BYTE cpuPPCInit_Li[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, 0,0,1,1,1,0, 2,2};
|
CPU_BYTE cpuPPCInit_Li[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, 0,0,1,1,1,0, 2,2};
|
||||||
CPU_BYTE cpuPPCInit_stw[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,0, 2,2};
|
CPU_BYTE cpuPPCInit_stw[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,0, 2,2};
|
||||||
CPU_BYTE cpuPPCInit_stwu[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,1, 2,2};
|
CPU_BYTE cpuPPCInit_stwu[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,1,0,1, 2,2};
|
||||||
CPU_BYTE cpuPPCInit_mr[32] = {0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,2,2,2,2,2,2,2,2, 0,1,1,1,1,1, 2,2};
|
CPU_BYTE cpuPPCInit_mr[32] = {0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,2,2,2,2,2,2,2,2, 0,1,1,1,1,1, 2,2};
|
||||||
|
CPU_BYTE cpuPPCInit_lwz[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,0,0,0,0,0, 2,2};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
CPU_BYTE cpuPPCInit_stw[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,1,0,0,2,2};
|
|
||||||
CPU_BYTE cpuPPCInit_stwu[32] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,1,0,1,2,2};
|
|
||||||
CPU_BYTE cpuPPCInit_mr[32] = {0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,2,2,2,2,2,2,2,2,0,1,1,1,1,1,2,2};
|
|
||||||
|
|
||||||
00: 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,1,0,1,2,2 stwu r1,-32(r1)
|
|
||||||
04: 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,1,0,0,2,2 stw r31,28(r1)
|
|
||||||
08: 0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,2,2,2,2,2,2,2,2,0,1,1,1,1,1,2,2 mr r31,r1
|
|
||||||
0c: 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,1,0,0,2,2 stw r3,8(r31)
|
|
||||||
10: 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,2,2 lwz r9,8(r31)
|
|
||||||
*/
|
|
||||||
/* mask */
|
/* mask */
|
||||||
/*
|
/*
|
||||||
* no mask we implement function getting the reg right
|
* no mask we implement function getting the reg right
|
||||||
|
|
|
@ -253,15 +253,20 @@ CPU_INT LoadPFileImage( char *infileName, char *outputfileName,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAXSECTIONNUMBER 16
|
||||||
|
|
||||||
CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
|
CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
|
||||||
CPU_UNINT base, CPU_UNINT size,
|
CPU_UNINT base, CPU_UNINT size,
|
||||||
FILE *outfp, CPU_INT mode)
|
FILE *outfp, CPU_INT mode)
|
||||||
{
|
{
|
||||||
PIMAGE_DOS_HEADER DosHeader;
|
PIMAGE_DOS_HEADER DosHeader;
|
||||||
PIMAGE_NT_HEADERS NtHeader;
|
PIMAGE_NT_HEADERS NtHeader;
|
||||||
PIMAGE_SECTION_HEADER SectionHeader;
|
IMAGE_SECTION_HEADER SectionHeader[MAXSECTIONNUMBER] = {NULL};
|
||||||
|
PIMAGE_SECTION_HEADER pSectionHeader;
|
||||||
|
PIMAGE_EXPORT_DIRECTORY ExportEntry;
|
||||||
INT NumberOfSections;
|
INT NumberOfSections;
|
||||||
INT NumberOfSectionsCount=0;
|
INT NumberOfSectionsCount=0;
|
||||||
|
INT i;
|
||||||
|
|
||||||
DosHeader = (PIMAGE_DOS_HEADER)memory;
|
DosHeader = (PIMAGE_DOS_HEADER)memory;
|
||||||
if ( (DosHeader->e_magic != IMAGE_DOS_SIGNATURE) ||
|
if ( (DosHeader->e_magic != IMAGE_DOS_SIGNATURE) ||
|
||||||
|
@ -339,61 +344,47 @@ CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
SectionHeader->Name == ".tls$"
|
|
||||||
SectionHeader->Name == ".tls"
|
|
||||||
SectionHeader->Name == ".text" // Executable code
|
|
||||||
SectionHeader->Name == ".sxdata"
|
|
||||||
SectionHeader->Name == ".sdata"
|
|
||||||
SectionHeader->Name == ".sbss"
|
|
||||||
SectionHeader->Name == ".rsrc" // rc data
|
|
||||||
SectionHeader->Name == ".reloc"
|
|
||||||
SectionHeader->Name == ".rdata" // read only initialized data
|
|
||||||
SectionHeader->Name == ".pdata"
|
|
||||||
SectionHeader->Name == ".idlsym"
|
|
||||||
SectionHeader->Name == ".idata" // Import tables
|
|
||||||
SectionHeader->Name == ".edata" // Export tables
|
|
||||||
SectionHeader->Name == ".drective"
|
|
||||||
SectionHeader->Name == ".debug$T"
|
|
||||||
SectionHeader->Name == ".debug$S"
|
|
||||||
SectionHeader->Name == ".debug$P"
|
|
||||||
SectionHeader->Name == ".debug$F"
|
|
||||||
SectionHeader->Name == ".data" //data segment
|
|
||||||
SectionHeader->Name == ".cormeta"
|
|
||||||
SectionHeader->Name == ".bss" // bss segment
|
|
||||||
|
|
||||||
undoc
|
printf("Number of object : %d\n",NtHeader->FileHeader.NumberOfSections);
|
||||||
SectionHeader->Name == ".textbss" // bss segment
|
printf("Base Address : %8x\n\n",NtHeader->OptionalHeader.ImageBase);
|
||||||
*/
|
|
||||||
|
|
||||||
//*base = NtHeader->OptionalHeader.AddressOfEntryPoint;
|
pSectionHeader = IMAGE_FIRST_SECTION(NtHeader);
|
||||||
|
|
||||||
SectionHeader = IMAGE_FIRST_SECTION(NtHeader);
|
|
||||||
NumberOfSections = NtHeader->FileHeader.NumberOfSections;
|
NumberOfSections = NtHeader->FileHeader.NumberOfSections;
|
||||||
|
|
||||||
for (NumberOfSectionsCount = 0; NumberOfSectionsCount < NumberOfSections; NumberOfSectionsCount++, SectionHeader++)
|
for (i = 0; i < NumberOfSections; i++)
|
||||||
{
|
{
|
||||||
if (strnicmp((PCHAR) SectionHeader->Name,".rsrc",5)==0)
|
SectionHeader[i] = *pSectionHeader++;
|
||||||
{
|
printf("Found Sector : %s \n ",SectionHeader[i].Name);
|
||||||
/* FIXME add a rc bin to text scanner */
|
printf("RVA: %08lX ",SectionHeader[i].VirtualAddress);
|
||||||
|
printf("Offset: %08lX ",SectionHeader[i].PointerToRawData);
|
||||||
|
printf("Size: %08lX ",SectionHeader[i].SizeOfRawData);
|
||||||
|
printf("Flags: %08lX \n\n",SectionHeader[i].Characteristics);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (strnicmp((PCHAR) SectionHeader->Name,".textbss",8)==0)
|
/* Get export data */
|
||||||
|
if (NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0)
|
||||||
{
|
{
|
||||||
/* FIXME add a bss to text scanner */
|
for (i = 0; i < NumberOfSections; i++)
|
||||||
|
{
|
||||||
|
if ( SectionHeader[i].VirtualAddress <= (ULONG) NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress &&
|
||||||
|
SectionHeader[i].VirtualAddress + SectionHeader[i].SizeOfRawData > (ULONG)NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
|
||||||
|
{
|
||||||
|
ExportEntry = (PIMAGE_NT_HEADERS) (((ULONG)memory) +
|
||||||
|
(ULONG)(NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress -
|
||||||
|
SectionHeader[i].VirtualAddress +
|
||||||
|
SectionHeader[i].PointerToRawData));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
else if (strnicmp((PCHAR) SectionHeader->Name,".text\0",6)==0)
|
/* start decoding */
|
||||||
{
|
|
||||||
/*
|
|
||||||
FIXME we should output gas syntax
|
|
||||||
BITS 32
|
|
||||||
GLOBAL _lrotate;
|
|
||||||
EXTERN _printf;
|
|
||||||
COMMON _commvar 4;
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
for (i=0;i < NumberOfSections; i++)
|
||||||
|
{
|
||||||
|
if (strnicmp((PCHAR) SectionHeader[i].Name,".text\0",6)==0)
|
||||||
|
{
|
||||||
switch (NtHeader->FileHeader.Machine)
|
switch (NtHeader->FileHeader.Machine)
|
||||||
{
|
{
|
||||||
case IMAGE_FILE_MACHINE_ALPHA:
|
case IMAGE_FILE_MACHINE_ALPHA:
|
||||||
|
@ -485,7 +476,7 @@ CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
|
||||||
fprintf(outfp,"; CPU found POWERPC\n");
|
fprintf(outfp,"; CPU found POWERPC\n");
|
||||||
//PPCBrain(memory, pos, cpu_size, base, 0, outfp);
|
//PPCBrain(memory, pos, cpu_size, base, 0, outfp);
|
||||||
machine_type = IMAGE_FILE_MACHINE_POWERPC;
|
machine_type = IMAGE_FILE_MACHINE_POWERPC;
|
||||||
PPCBrain(memory+SectionHeader->PointerToRawData, 0, SectionHeader->SizeOfRawData, 0, 0, outfp);
|
PPCBrain(memory+SectionHeader[i].PointerToRawData, 0, SectionHeader[i].SizeOfRawData, NtHeader->OptionalHeader.ImageBase, 0, outfp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
@ -564,12 +555,9 @@ CPU_INT PEFileStart( CPU_BYTE *memory, CPU_UNINT pos,
|
||||||
default:
|
default:
|
||||||
printf("Unknown Machine : %d",NtHeader->FileHeader.Machine);
|
printf("Unknown Machine : %d",NtHeader->FileHeader.Machine);
|
||||||
return 4;
|
return 4;
|
||||||
/* End case swich */
|
} /* end case switch*/
|
||||||
}
|
} /* end if text sector */
|
||||||
/* End if .text statment */
|
} /* end for */
|
||||||
}
|
|
||||||
/* End for loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue