Re: PInvoke + Prevent Piracy
Sébastien Lorion <[email protected]> Mon, 4 May 2009 07:35:29 -0400
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <[email protected]> |
It's a losing battle .. even dongles get cracked. It just annoys your real customers. Sébastien On Sun, May 3, 2009 at 11:59, Girish Jain <[email protected]> wrote: > I am currently using the approach of using hidden registry values (with > plain text hard coded values) and thought that it would be easy to crack.. > and therefore, was looking for another approach which would be more > difficult to break and would make my life easy in distributing my > application.... > > Although, as you pointed out, both the approaches have similar plus and > minus points... I am yet to figure out a solution which would make my life > easy with respect to distributing my application. > > Any pointers would be of great help... > > > Cheers, > Girish Jain > > ---------------------------------------- > > Date: Wed, 29 Apr 2009 11:55:51 -0400 > > From: [email protected] > > Subject: Re: [ADVANCED-DOTNET] PInvoke + Prevent Piracy > > To: [email protected] > > > > Just to ask.. why go through the troubles of preventing only copying by > > modifying a file (which a virus scanner may prevent as suspiscious > activity > > anyways depending on how you do it of course) - rather than an easier but > > probably as effective technique others already use.. such as hidden > registry > > values.. etc. Im assuming your app isn't signed otherwise you're changing > > checksum (although ways around that) unless you are dealing with native > > code. > > > > Either way you are dealing with probably a one byte patch on your > executable > > in the validation routines return code by anyone with any reverse > > engineering experience. So the argument is to protect against most users > - > > in that case why not just use hidden data in registry (or hidden file) > that > > is based on machine specific data. Even if those values/files are copied > to > > other machines they won't work because of your validation function and > > you've saved yourself the headaches with modifying your own executables > at > > runtime.. and both techniques have similiar success and downfalls, but > one > > way you don't worry about that extra code. > > > > > > > > > > > > > > > > On Wed, Apr 29, 2009 at 11:44 AM, Girish Jain wrote: > > > >> Hello All, > >> > >> In order to protect my application from piracy, I am taking the > following > >> approach: > >> > >> 1. Write some encrypted data to app executable file header at the time > of > >> application installation. > >> 2. The logic for generating this data has to consider machine specific > >> details (I am yet to select upon the data values) > >> 3. The app executable would also have the same logic for generating > machine > >> specific data. On startup, it would generate the unique data and compare > it > >> with the data from its own header, (of course after decrypting!!) > >> 4. If the data values match, application will proceed, otherwise not. > >> This would ensure that merely copying the application exe from one > machine > >> to another would not work. > >> > >> > >> For this purpose, I need to add some data to PE file and then later > >> retrieve the same using C#. I am using the following ImgHelp APIs for > the > >> purpose : > >> > >> ImageAddCertificate > >> ImageGetCertificateData > >> > >> I am able to add data to PE file and ImageAddCertificate function call > >> succeeds. While calling ImageGetCertificateData to retrieve the data, I > am > >> getting errors. It gives the following error: > >> > >> A call to PInvoke function > >> 'PESignature!PESignature.WinSDK::ImageGetCertificateData' has unbalanced > the > >> stack. This is likely because the managed PInvoke signature does not > match > >> the unmanaged target signature. Check that the calling convention and > >> parameters of the PInvoke signature match the target unmanaged > signature. > >> > >> I am struggling with using PInvoke to call ImageGetCertificateData > >> function. The functions have been defined as follows. > >> static class WinSDK > >> { > >> [DllImport("Imagehlp.dll", SetLastError=true)] > >> static public extern bool ImageAddCertificate(SafeFileHandle HANDLE, > >> ref WINCERTIFICATE certData, out long index); > >> [DllImport("Imagehlp.dll", SetLastError = true)] > >> static public extern bool ImageGetCertificateData(SafeFileHandle > >> FileHandle, long CertificateIndex, out IntPtr CertData, out long > >> RequiredLength); > >> } > >> struct WINCERTIFICATE > >> { > >> public UInt32 dwLength; > >> public int wRevision; > >> public int wCertificateType; > >> public byte[] bCertificate; > >> } > >> > >> Unmanaged counterpart > >> -------------------------------------------------------- > >> BOOL > >> IMAGEAPI > >> ImageGetCertificateData( > >> IN HANDLE FileHandle, > >> IN DWORD CertificateIndex, > >> OUT LPWIN_CERTIFICATE Certificate, > >> IN OUT PDWORD RequiredLength > >> ); > >> > >> typedef struct _WIN_CERTIFICATE > >> { > >> DWORD dwLength; > >> WORD wRevision; > >> WORD wCertificateType; // WIN_CERT_TYPE_xxx > >> BYTE bCertificate[ANYSIZE_ARRAY]; > >> } WIN_CERTIFICATE, *LPWIN_CERTIFICATE; > >> -------------------------------------------------------- > >> > >> Following is the button click event handler code (in test project) which > >> attempts to retrieves data from the PE file… > >> private unsafe void lblGetSignatureData_Click(object sender, > >> EventArgs e) > >> { > >> FileStream fs = null; > >> IntPtr certPtr; > >> unsafe > >> { > >> try > >> { > >> fs = File.Open(this._FilePath, FileMode.Open, > >> FileAccess.Read); > >> // Now retrieve cert data > >> WINCERTIFICATE certSelect = new WINCERTIFICATE(); > >> long ReqLength = 55; > >> certPtr = > >> Marshal.AllocHGlobal(Marshal.SizeOf(certSelect)); > >> Marshal.StructureToPtr(certSelect, certPtr, false); > >> WinSDK.ImageGetCertificateData(fs.SafeFileHandle, 5, out > >> certPtr, out ReqLength); > >> > >> MessageBox.Show(Encoding.ASCII.GetString(certSelect.bCertificate)); > >> } > >> catch (Exception ex) > >> { > >> MessageBox.Show(ex.Message); > >> } > >> finally > >> { > >> fs.Close(); > >> fs.Dispose(); > >> fs = null; > >> } > >> } > >> } > >> > >> > >> The data which I had initially written to the PE file was of length 55 > i.e. > >> byte array length 55. The SDK function expects the data structure to be > >> pre-initialized with the required buffer. Also, I am trying to retrieve > the > >> data added at the index position 5 (while testing I could successfully > add > >> several data values). > >> > >> > >> I am not very sure about how to handle such API calls where we need to > pass > >> structure pointer as parameter. > >> > >> Questions: > >> 1. Could you please suggest the error in my approach for calling > >> ImageGetCertificateData function. Request you to validate the following: > >> a. Method declaration in Win SDK class > >> b. WINCERTIFICATE struct definition > >> c. Code for initializing the unmanaged memory for data structure and > >> passing it as input parameter to function call > >> > >> 2. The current approach for safeguarding the application would require > that > >> I safeguard my application setup (MSI) file more than anything else. > Could > >> you please suggest some other approach to prevent piracy wherein I need > not > >> even protect MSI file and can freely distribute the same? > >> > >> Would highly appreciate your suggestions/ideas. Thanks in advance. > >> > >> > >> MSDN Link for function > >> http://msdn.microsoft.com/en-us/library/ms680154(VS.85).aspx > >> > >> -Girish Jain > >> > >> P.S. Due to certain issues you can expect delay in response from my side > >> _________________________________________________________________ > >> Windows Live Messenger. Multitasking at its finest. > >> http://www.microsoft.com/india/windows/windowslive/messenger.aspx > >> =================================== > >> View archives and manage your subscription(s) at > >> http://peach.ease.lsoft.com/archives > >> > > > > =================================== > > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > _________________________________________________________________ > Drag n’ drop—Get easy photo sharing with Windows Live™ Photos. > > http://www.microsoft.com/india/windows/windowslive/photos.aspx > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives