<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>OpenRCE: Blog</title>
        <link>http://www.openrce.org/rss/feeds/blog</link>
        <description>OpenRCE: The Open Reverse Code Engineering Community</description>
                <item>
            <title>Lame MFC* Ordinals to Symbol Name Mapper (IDA Python)</title>
                            <pubDate>Fri, 01 Jun 2007 23:40:55 -0500</pubDate>
                                        <link>https://www.openrce.org/blog/view/760/Lame_MFC*_Ordinals_to_Symbol_Name_Mapper_(IDA_Python)</link>
                                        <author>ogami &lt;email-suppressed@example.com&gt;</author>
                                                    <description>It is fugly as all hell. I hadn't written a line of Python before attempting this script; so constructive criticism and advice is _much_ appreciated.&lt;br /&gt;
&lt;br /&gt;
I was hoping to write a script that would work for all MFC, like 42, 71, and 8. I tested it on an app compiled against MFC71, and 40, and it sort of works. It doesn't want to map the functions that are called like:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds:MFC71U_280&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Where as it seems to map the ones that are called directly just fine. I think this is because I am using the:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
ea = ScreenEA()&lt;br /&gt;
for function_ea in Functions(SegStart(ea), SegEnd(ea)):&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
method to iterate through all of the functions, is there a better way to do this? So that I can catch all of the call ds:MFC1U_234 types?&lt;br /&gt;
&lt;br /&gt;
Additionally, I'll update it with one file read into an array as soon as I finish the reverse engineering project that I am working on. I just needed to hack together something that would work, so here you are. Please advise.&lt;br /&gt;
&lt;br /&gt;
*Update: Bought a python reference..hehe.Added the single file read, should be faster now :). &lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
import re&lt;br /&gt;
import string&lt;br /&gt;
import sys&lt;br /&gt;
from sets import Set&lt;br /&gt;
&lt;br /&gt;
#Get the file from the user.&lt;br /&gt;
file_path = AskFile(0,&amp;quot;*.def&amp;quot;,&amp;quot;Please select the appropriate def file.&amp;quot;)&lt;br /&gt;
def_file = open(file_path, 'rU').readlines()&lt;br /&gt;
&lt;br /&gt;
if not def_file:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print &amp;quot;[!]Could not read file.&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(-1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
print &amp;quot;[+]Ok we are reading symbols from %s.&amp;quot; % file_path&lt;br /&gt;
&lt;br /&gt;
#Ugly hack so that IDAPython can handle my crappy code.&lt;br /&gt;
file_path_mangled = string.replace(file_path, &amp;quot;\\&amp;quot;, &amp;quot;_&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Strip file_path from def file name, we will use this&lt;br /&gt;
#to ID the function names that we need to update.&lt;br /&gt;
filename_re = re.compile (&amp;quot;.*_(.*)\.def&amp;quot;)&lt;br /&gt;
filename_match = filename_re.match(file_path_mangled)&lt;br /&gt;
if not filename_match:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(-1)&lt;br /&gt;
&lt;br /&gt;
mfc_name = filename_match.group(1)&lt;br /&gt;
mfc_tag&amp;nbsp;&amp;nbsp;= filename_match.group(1) + &amp;quot;_.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#Iterate through function names, using mfc_tag_match_re to determine&lt;br /&gt;
#what function names we will be modding.&lt;br /&gt;
mfc_tag_match_re = re.compile(mfc_tag, re.IGNORECASE)&lt;br /&gt;
&lt;br /&gt;
#Does this symbol string have the same format for all MFC?&lt;br /&gt;
symbol_string_extract_re = re.compile(&amp;quot;.+(\?.*)Z &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;[+]Starting this might take a while.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
count = 0&lt;br /&gt;
ea = ScreenEA()&lt;br /&gt;
for function_ea in Functions(SegStart(ea), SegEnd(ea)):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function_name = GetFunctionName(function_ea)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Check if this is an MFC function.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mfc_function_name = mfc_tag_match_re.match(function_name)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if mfc_function_name:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Get the ordinal from the matched function name.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal_from_idb_re = re.compile(&amp;quot;.*_([0-9]*)&amp;quot;, re.IGNORECASE)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal_from_mfc_function = ordinal_from_idb_re.match(function_name)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#If we have a new ordinal, process it.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ordinal_from_mfc_function:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal_re = re.compile(&amp;quot;(\s&amp;quot;+ordinal_from_mfc_function.group(1)+&amp;quot; )&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Search the def file list for the correct ordinal.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for line in def_file:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;found_def_ordinal = ordinal_re.findall(line)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if found_def_ordinal:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#print &amp;quot;[+]Got symbol string: %s&amp;quot; % line.replace('\n','')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripped_symbol = symbol_string_extract_re.match(line)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if stripped_symbol:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripped_mangled = stripped_symbol.group(1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripped_mangled = stripped_mangled.replace(' ','')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripped_mangled = stripped_mangled.replace('\n','')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MakeName(function_ea, stripped_mangled+&amp;quot;_Ren_&amp;quot;+str(count))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
#Go to the next function.&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;[+]Finished.&amp;quot;&lt;br /&gt;
&lt;/code&gt;</description>
                    </item>
            </channel>
</rss>
