|
Hello fellow developers,
I have written an application to find and replace just about anything. It even has a nice web interface and keeps everything stored in a SQL Server DB.
I have no problem finding what I am looking for, the issue comes when I replace a hard coded string inside of an EXE or DLL.
For simplicity sake I just grab the whole file as bytes, use Encoding to get me a string, and use a RegEx to Find / Replace what I am searching for. I then take the string with the values replaced and use Encoding to switch it back to bytes and overwrite the file.
This works fine on text, but DLLs and EXEs appear to have been corrupted. I get the following error when I try to execute the EXE or and executable that references a DLL I have replaced the strings inside of.
Here is a copy of the Exception, 'ConfigurationManagement.Controllers' is the DLL I changed:
System.BadImageFormatException was unhandled
Message: Could not load file or assembly 'ConfigurationManagement.Controllers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest.
I am assuming I am writing the file incorrectly and by adding new bytes to it, that there is some internal data inside the DLL or EXE that does not match its file size and locations anymore.
Does anyone know how to correctly edit the strings inside of a binary file?
Kind Regards,
Ryan
|
|
|
|
|
Hi,
A lot of data in an executable file is not absolute; it could be offsets, pointer tables, whatever.
So you should not try and replace a byte array by another byte array of different length.
You can pad a string with spaces or null characters to replace a larger string.
If you need to replace by a larger string you are in some trouble; you then have to find space
to put the new data and adapt some pointers...
|
|
|
|
|
Wow, looks like I am going to need the help of a File I/O expert. I have no idea how I would adapt the pointers.
Unfortunately, I have no control over the string size being replaced. I am basically writing this application because we have a lot of legacy applications ( I mean A LOT ) that need to have their connection strings, folder locations, web service names, etc changed... some we don't even have source code for some of them anymore as it was lost in TFS migration.
This doesn't seem to be a well documented developer issue. I've tried searching for the past week, but I don't seem to be entering the correct tags to pop a good search. If anyone has any good links to some articles to help out with this, I would be grateful.
Regards,
Ryan
|
|
|
|
|
Hi,
first of all you may want and have a look at the PE File Format[^]; that will show you an EXE is
not that simple.
second, if they are truly legacy, then you don't have to worry about signed assemblies, and other
.NET stuff.
I am not familiar with TFS, wikipedia tells me it exists to keep source code safe, not to throw
it away?
changing strings isn't a developer issue any more, since normal development includes both
keeping the sources handy (and not patching object or executable files), and putting
configuration stuff into some configuration repository (often a simple INI file, nowadays often
an XML file).
if you are looking for an automated solution for patching new and arbitrary string values, you are out of luck. On the other hand, if you are in control of the new strings, you can apply some tricks to make them shorter rather than longer, e.g.:
- choose short names for servers, folders, ...
- use "map network device" to replace most of a path by something really short
etc.
If that does not solve it, I am afraid you have a major task at hand and might want and consider a full rewrite using modern technology, and resulting in having source files again.
|
|
|
|
|
Yes, TFS is to store your code, but unfortunately, there were no developers on the team that migrated it from SVN.....( doh! ) so some code was lost.
Very true about changing connection strings not being a developer issue anymore, and I agree whole heartedly, unfortunately, some developers are not as skilled as others, especially in the past... some even thought that by hard coding them that they were more secure... it's amazing who could pass for a developer a few years ago...
The whole point of this project I am on is to fix our current environment to point to network aliases so when our Data Center blows up... we can simply point the alias to our Disaster Recovery center and we are back in business.
I should have mentioned I am a contract developer, I'm just trying to fix the web of chaos that is at my current site
Thank you for your feedback about PE File Format!
Ryan
|
|
|
|
|
You're welcome.
And good luck...
|
|
|
|
|
On top of what Luc said, you cannot replace strings inside signed assemblies. Doing so breaks the security "wrapper" and the CLR will no longer trust the assembly.
|
|
|
|
|
Ahh good point, I'm glad most of the past developers here didn't even know what a signed assembly was...
On the positive side, atleast I know what binarys need updating and can do investigation on re-compling them and hopefully updating them to use configuration files rather then hard coding connections strings in the assembly.
Thanks for the reminder!
Ryan
|
|
|
|
|
If it is a managed assembly, you can recompile it with .Net Reflector and change string or use reflix plugin.
|
|
|
|
|
Cool, thank you for the suggestion, I think that will go on the "Plan B".
Regards,
Ryan
|
|
|
|
|
Hello,
how is it possible, if i have a List<t> with a specified type of class to catch all exceptions of the classes that are inside the List?
I have a method "AddToList(T myClass)" which adds me the class into the list, so how can i can tell the class that all exceptions should be handled by a specific function/method? I doesn't want, that one class inside this List could break my application. Is there something like a event "OnException" or something which i can handle?
|
|
|
|
|
Not possible. You'd have to do a try catch whenever you call a method on the object. Why do you fear the objects in this list ?
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
Well i have them all in a list, because i want to make it work like plugins. So, i doesn't want, that a plugin can crash my application! How can i solve that? Because, OK i make the try/catch things, but what if someone who writes an plugin doesn't do it and so crashes my application? Or how can i report a crash or something? That i can block the adding of this plugin.
|
|
|
|
|
u can wrap List.Add(...) with try - catch and call a function in in case of falure
abstract calss BaseClass
{
abstract void HandleException(Exception e);
}
class Class1 : BaseClass
{
override HandleException(Exception e)
{
}
}
class Class2 : BaseClass
{
override HandleException(Exception e)
{
}
}
AddToList(BaseClass obj)
{
try
{
mylist.Add(obj);
}
catch(Exception e)
{
obj.HandleException(e);
}
}
|
|
|
|
|
Just wrap every call to the expected methods in a try/catch as usual.
Or maybe write a sheath wrapper class to add a layer of latex protection between you and the ummm... plug-in.
|
|
|
|
|
|
You have to instantiate the ExceptionGlove object...
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
It depends on where the exception is thrown.
If the class throws an exception during a call from the application, simply wrap the call in a try-catch to catch the exception.
If the class displays UI and throws an exception in a click event handler/timer/etc., use the Application.ThreadException event to handle the exception.
If the class creates a new thread and throws an exception there, you can display an error dialog from AppDomain.CurrentDomain.UnhandledException, but the AppDomain will usually terminate after the error. You'll have to host the class in a separate AppDomain to let your main program survive those cases.
That still won't help if the class calls into unmanaged code and crashes there - the process will terminate. You would have to host addins in a separate process to prevent that.
In my opinion, simply handling exceptions in the most common cases should suffice, but if you want more isolation, you should take a look at System.AddIns[^].
|
|
|
|
|
Hi,
There are to ways to register to event
for Example - for a button event
Button.Click += new System.EventHandler(this.baseButtonCancelPending_Click);
OR
Button.Click += this.baseButtonCancelPending_Click;
What is the difference?
Thanks,
Itay
|
|
|
|
|
Nothing. Second one is a syntactic shortcut and it is available from .NET2.0 onwards.
|
|
|
|
|
|
I am developing a Win app that pulls data from a datagridview control onto an excel spreadsheet.The app is doing this so far but I would like to knw if it is possible to present this data in a table .Is it possible, and if so how?
|
|
|
|
|
Ya if it is a Windows forms app in VS.NET there is a tool in the tool box (DataGridView).
You should be able to put data into it, and it should display it in a table. I have not tried it before but it looks
strait forward.
hope this helps!
static void main()
{
while (Robotics == cool)
{
Me.Build.Robots
}
}
|
|
|
|
|
i have a class
public class Command
{
public int Number;
public int[] Types= new int[30] ;
}
then i try to assign value of each by reading from a xml file
Command[] Querr = new Command[200];
XmlDocument Reader = new XmlDocument();
Reader.Load("MyXml.xml");
XmlNodeList List = Reader.SelectNodes("/MyXml/Common");
foreach (XmlNode node in List)
{
int i = int.Parse(node.Attributes["value"].InnerText);
Querr[i].Number = i;
}
I have error when Querr[i].Number=i, and it said" Object reference not set to an instance of an object"
How do i solve it? Thanks
|
|
|
|
|
yes why not you get error. You must intiate class before use. You can only use static objects without intiating.
foreach (XmlNode node in List)
{
int i = int.Parse(node.Attributes["value"].InnerText);
Querr[i]= new Querr();
Querr[i]= new Command();
Querr[i].Number = i;
}
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKSQXUFYK[M`UKs*$GwU#(QDXBER@CBN%
Rs0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
--------------------------------------------------------
128 bit encrypted signature, crack if you can
modified on Tuesday, December 30, 2008 8:13 AM
|
|
|
|