📄 dumpinfo.idc
字号:
fLineX = writeLine(fOption, fFileH, fCurEA, fTxt, fNum, fLineX);
}
} //End FOR Loop
} //End BIG IF
//Message Percent Complete
ProgNum = ((fCurEA - fSrtEA) * 100) / (fEndEA - fSrtEA) ; //Get Percent Finsihed
if (ProgNum > ProgPer) { //If serious gain (5%) write.
fTxt = form("\nPercent Complete: %d ",ProgNum); //Full Message
Message(fTxt);
ProgPer = ProgNum + 4;
} else if (ProgNum > ProgDot) { //Else write a "*" for 1% gain
Message("*");
ProgDot = ProgNum;
}
//Increment Current EA
fCurEA = NextAddr(fCurEA);
} //End WHILE Loop
//Write "parts()" Function
if (fOption & OPT_IDC_FILE) {
fLineX = fLineX/1000;
fTxt = form("}\n\nstatic parts() {\n\tMessage(\"\\nSTART!\\n\");\n"); //parts() and Message
fprintf(fFileH, fTxt);
for(i=0; i <= fLineX; i++) { //write part_X subs
fTxt = form("\tpart_%d();\n",i);
fTxt = fTxt + form("\tMessage(\"Part %d of %d Completed\\n\");\n", i, fLineX);
fprintf(fFileH, fTxt);
}
fTxt = form("\tMessage(\"\\nFINISHED!\\n\");\n}\n"); //End parts() & Msg.
fprintf(fFileH, fTxt);
}
//Change Status
Message("\nPercent Complete: 100\n");
SetStatus(IDA_STATUS_READY); //Set Status 'Ready'
}
//__________________________________________________________________________________________________
//哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
//FUNCTION: void main()
//--------------------------------------------------------------------------------------------------
//NOTES:
// i, j - (long) Counters
// mOption - (long) Holds program option and type info
// mStartEA - (long) For the starting address
// mEndEA - (long) For the ending address
// mFName - (char*) Name for output file
// mFileH - (handle) File Handle
// mStartTxt - (char*)
// mStrLine - (char*)
// mError - (bool) Error Status
//--------------------------------------------------------------------------------------------------
static main() {
auto i, j, mOption, mStartEA, mEndEA, mFName, mFileH, mStartTxt, mStrLine, mError;
mError = TRUE; //Set Error Status True
Message("\n\nBegin Dump: DumpInfo.idc. \n"); //Show Start Message To Window
//Program Options -I should really build a UI prompt of some sort...
//Control the program by commenting/uncommenting the information types you want.
mOption = 0x00000000L; //Initialize Option Var
mOption = mOption + OPT_MAK_FILE; //Set Option: Write File (Or MessageWindow)
mOption = mOption + OPT_IDC_FILE; //Set Option: Create IDC (Or Text File)
mOption = mOption + OPT_USE_FLTR; //Set Option: Use Filter
mOption = mOption + OPT_REG_FCOM; //Set Option: Regular Function Comments
mOption = mOption + OPT_RPT_FCOM; //Set Option: Repeatable Function Comments
mOption = mOption + OPT_REG_ICOM; //Set Option: Regular Indented Comments
mOption = mOption + OPT_RPT_ICOM; //Set Option: Repeatable Indented Comments
mOption = mOption + OPT_ANT_LINE; //Set Option: Anterior Lines
mOption = mOption + OPT_POS_LINE; //Set Option: Posterior Lines
mOption = mOption + OPT_USR_NAME; //Set Option: User Created Names
mOption = mOption + OPT_STR_CODE; //Set Option: String References From CODE
mOption = mOption + OPT_STR_DATA; //Set Option: String References In DATA
//Prompt User For Starting/Ending Point
mStartTxt = form("Start Dump From\n (E)tire Disassembly - From %s To %s\n", \
ltoa(MinEA(),16),ltoa(MaxEA(),16));
mStartTxt = mStartTxt + form(" (C)urent Selection - From %s to %s\n", \
ltoa(SelStart(),16),ltoa(SelEnd(),16));
mStartTxt = mStartTxt + form(" (S)egment Only - (You'll Select a Single Segment)\n");
mStartTxt = mStartTxt + form(" (F)unction Only - (You'll Select a Single Function)\n");
mStartTxt = AskIdent("E", mStartTxt);
//(E)ntire File
if ((mStartTxt == "E") || (mStartTxt == "b")) {
mStartEA = MinEA();
mEndEA = MaxEA();
if ((mStartEA != 0) || (mEndEA != 0)) mError = FALSE; //Error Checking
//(C)urrent Selection
} else if ((mStartTxt == "C") || (mStartTxt == "c")) {
mStartEA = SelStart(); //Get Selection Start
mEndEA = SelEnd(); //Get Selection End
if ((mStartEA != BADADDR) || (mEndEA != BADADDR)) mError = FALSE; //Error Checking
else Warning("There Is No Currently Selected Area"); //No Selection Warning
//(S)egment Only -A "ChooseSegment()" Function would be nice... :)
} else if ((mStartTxt == "S") || (mStartTxt == "s")) {
i = 1;
mStartEA = FirstSeg(); //Set StartEA
mStartTxt = "Please Choose Segment By Number:\n"; //Create Text for UI
do {mStartTxt = mStartTxt + form(" (%d) %s", i, SegName(mStartEA));
mStartEA = NextSeg(mStartEA); //Get Text Seg Name
i++;
} while ( mStartEA != BADADDR);
j = AskLong("1", mStartTxt); //Get User Input (long)
mStartEA = FirstSeg(); //Set StartEA First Seg
mEndEA = SegEnd(mStartEA); //Set EndEA to End of Seg
for (i=1; i<j; i++) { //Loop to user selected -
mStartEA = NextSeg(mStartEA); //segment setting start -
mEndEA = SegEnd(mStartEA); //and end
}
if ((mStartEA != BADADDR) || (mEndEA != BADADDR)) mError = FALSE; //Error Checking
//(F)unction Only
} else if ((mStartTxt == "F") || (mStartTxt == "f")) {
mStartEA = ChooseFunction("Choose Function");
mEndEA = FindFuncEnd(mStartEA);
if ((mStartEA != -1) || (mEndEA != BADADDR)) mError = FALSE; //Error Checking
}
//Show Status Messages
if (mOption & OPT_MAK_FILE) Message("Create File: TRUE \n");
else Message("Create File: FALSE \n");
if (mOption & OPT_IDC_FILE) Message("Create IDC: TRUE \n");
else Message("Create IDC: FALSE \n");
//Error Test
if (mError == TRUE) Message("\nThere was an error getting address info. \n");
else {
//Setup Output
//Create IDC string
if (mOption & OPT_IDC_FILE) {
mStrLine = form("// User Dump: IDC Format\n// Autogenerated by DumpInfo.IDC \n");
mStrLine = mStrLine + form("// IDC script for porting info to a new disassembly.\n");
mStrLine = mStrLine + form("// Disassembled File: %s\n",GetInputFile());
mStrLine = mStrLine + form("// Cursor Address: %s\n",ltoa(BeginEA(),16));
mStrLine = mStrLine + form("// Minimum Address: %s\n",ltoa(MinEA(),16));
mStrLine = mStrLine + form("// Maximum Address: %s\n",ltoa(MaxEA(),16));
mStrLine = mStrLine + form("// Segment Address: %s\n",ltoa(SegStart(mStartEA),16));
mStrLine = mStrLine + form("// Segment Name...: %s\n",SegName(mStartEA));
mStrLine = mStrLine + form("// StartingAddress: %s\n",ltoa(mStartEA,16));
mStrLine = mStrLine + form("// Ending Address: %s\n\n",ltoa(mEndEA,16));
mStrLine = mStrLine + form("#include <idc.idc>\n\nstatic main ( ) {\n");
mStrLine = mStrLine + form("\t parts();\n}\n\n");
//Create TEXT string
} else {
mStrLine = form("User Dump: Text Format\nAutogenerated by DumpInfo.IDC \n");
mStrLine = mStrLine + form("Disassembled File: %s\n",GetInputFile());
mStrLine = mStrLine + form("Cursor Address: %s\n",ltoa(BeginEA(),16));
mStrLine = mStrLine + form("Minimum Address: %s\n",ltoa(MinEA(),16));
mStrLine = mStrLine + form("Maximum Address: %s\n",ltoa(MaxEA(),16));
mStrLine = mStrLine + form("Segment Address: %s\n",ltoa(SegStart(mStartEA),16));
mStrLine = mStrLine + form("Segment Name...: %s\n",SegName(mStartEA));
mStrLine = mStrLine + form("StartingAddress: %s\n",ltoa(mStartEA,16));
mStrLine = mStrLine + form("Ending Address: %s\n\n",ltoa(mEndEA,16));
}
//Output To File
if (mOption & OPT_MAK_FILE) {
if (mOption & OPT_IDC_FILE)
mFName = AskFile(1,"*.idc", "Output File Name?"); //Get *.IDC File Name
else mFName = AskFile(1,"*.txt", "Output File Name?"); //Get *.TXT File Name
mFileH = fopen(mFName, "wt"); //Open File for Output
if (mFileH == 0) Warning("Error opening output file!\n"); //Error Opening File
else {
fprintf(mFileH, mStrLine); //Else Run Program
findInfo(mOption,mFileH,mStartEA,mEndEA);
}
//Output to Message Window
} else {
Message (mStrLine);
findInfo(mOption,mFileH,mStartEA,mEndEA);
}
//Cleanup
if (mFileH != 0) {
if (mOption & OPT_IDC_FILE) mStrLine = form("\n\n// End of IDC File.");
else mStrLine = form("\n\nEnd of Text File.");
fprintf(mFileH, mStrLine);
fclose(mFileH);
}
}
//Show End Message
Message("\nEnd of DumpInfo.idc. \n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -