Obfuscation - CodeKlau erschweren

    • VB.NET

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Annoxoli.

      Obfuscation - CodeKlau erschweren

      TEIL 1

      Liebe Forengemeinde,

      in diesem kleinen Tutorial zeige ich euch mal die Vorteile von Obfuscaten von Programmen.

      .net Programme, kann man mit ein paar Tricks kinderleicht knacken. (Dekompilieren etc.)
      Viele Programme nutzen aber Sensible Daten (z.B. FTP Daten, E-Mail Daten u.s.w)
      [Hierzu eine Wichtige Info: Sensible Daten gehören generell >> GAR NICHT << in ein Programm rein,
      schon gar nicht fest im code. ]


      Durch das Dekompilieren sieht man diese Daten im Klatext.

      Folgendes Beispiel:
      In einem kleinem Programm habe ich vor, eine E-Mail zu Versenden. Mein Originaler Source Code sieht wie folgt aus:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.Net.Mail
      3. Imports System.Security.Cryptography.X509Certificates
      4. Public Class Form1
      5. Private Sub cmdSendMail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSendMail.Click
      6. Dim Msg As New System.Net.Mail.MailMessage
      7. Msg.IsBodyHtml = False
      8. Dim oCertOverride As New CertificateOverride
      9. ServicePointManager.ServerCertificateValidationCallback = AddressOf oCertOverride.RemoteCertificateValidationCallback
      10. Dim mySmtpsvr As New SmtpClient()
      11. mySmtpsvr.Host = "smtp.googlemail.com"
      12. mySmtpsvr.Port = 587
      13. mySmtpsvr.UseDefaultCredentials = False
      14. mySmtpsvr.Credentials = New NetworkCredential("dasistmeineadresse@whatever.com", "dasistmeinpasswort")
      15. mySmtpsvr.EnableSsl = True
      16. Msg.From = New MailAddress("dasistmeineadresse@whatever.com")
      17. Msg.To.Add("empfängerderemail@whatever.com")
      18. Msg.Subject = "EMailüberschrift"
      19. Msg.Body = "DasistmeinEmailInhalt"
      20. Try
      21. mySmtpsvr.Send(Msg)
      22. Catch ex As Exception
      23. MsgBox("Mh, da ist was schief gelaufen! Probiers nochmal :)", MsgBoxStyle.Critical, "fehler")
      24. End Try
      25. End Sub
      26. Public Class CertificateOverride
      27. Public Function RemoteCertificateValidationCallback(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
      28. Return True
      29. End Function
      30. End Class
      31. End Class


      Wie wir sehen können, ist das Passwort im Klartext im Programm selbst eingebunden.
      Das sollte man generell vermeiden. Optimal ist eine Verschlüsslung (z.B. eine Recht einfache, die CESAR Verschlüsslung)
      [Wichtig: hierbei nochmal im Teil 1 / 2 die Info zum Thema Sensible Daten in einem Programm anschauen]

      Nach dem Kompilieren ist das Programm nun auf jeden PC Einsatzbereit.
      Aber bevor wir das machen, Dekompilieren wir das Programm mit einem kleinen Tool,
      der Source Code den wir erhalten, sieht wie folgt aus:
      (Da etwas länger, ist der Code im Spoiler)
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports Microsoft.VisualBasic
      2. Imports Microsoft.VisualBasic.CompilerServices
      3. Imports System
      4. Imports System.Collections.Generic
      5. Imports System.ComponentModel
      6. Imports System.Diagnostics
      7. Imports System.Drawing
      8. Imports System.Net
      9. Imports System.Net.Mail
      10. Imports System.Net.Security
      11. Imports System.Runtime.CompilerServices
      12. Imports System.Security.Cryptography.X509Certificates
      13. Imports System.Threading
      14. Imports System.Windows.Forms
      15. Namespace BeispielProjekt
      16. <DesignerGenerated()>
      17. Public Class Form1
      18. Inherits Form
      19. Public Class CertificateOverride
      20. <DebuggerNonUserCode()>
      21. Public Sub New()
      22. End Sub
      23. Public Function RemoteCertificateValidationCallback(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) As Boolean
      24. Return True
      25. End Function
      26. End Class
      27. Private Shared __ENCList As List(Of WeakReference) = New List(Of WeakReference)()
      28. Private components As IContainer
      29. <AccessedThroughProperty("cmdSendMail")>
      30. Private _cmdSendMail As Button
      31. Friend Overridable Property cmdSendMail() As Button
      32. <DebuggerNonUserCode()>
      33. Get
      34. Return Me._cmdSendMail
      35. End Get
      36. <DebuggerNonUserCode()>
      37. <MethodImpl(MethodImplOptions.Synchronized)>
      38. Set(value As Button)
      39. Dim value2 As EventHandler = New EventHandler(Me.cmdSendMail_Click)
      40. Dim flag As Boolean = Me._cmdSendMail IsNot Nothing
      41. If flag Then
      42. Me._cmdSendMail.Click -= value2
      43. End If
      44. Me._cmdSendMail = value
      45. flag = Me._cmdSendMail IsNot Nothing
      46. If flag Then
      47. Me._cmdSendMail.Click += value2
      48. End If
      49. End Set
      50. End Property
      51. <DebuggerNonUserCode()>
      52. Public Sub New()
      53. Form1.__ENCAddToList(Me)
      54. Me.InitializeComponent()
      55. End Sub
      56. <DebuggerNonUserCode()>
      57. Private Shared Sub __ENCAddToList(value As Object)
      58. Dim _ENCList As List(Of WeakReference) = Form1.__ENCList
      59. Monitor.Enter(_ENCList)
      60. ' The following expression was wrapped in a checked-statement
      61. Try
      62. Dim flag As Boolean = Form1.__ENCList.Count = Form1.__ENCList.Capacity
      63. If flag Then
      64. Dim num As Integer = 0
      65. Dim arg_3F_0 As Integer = 0
      66. Dim num2 As Integer = Form1.__ENCList.Count - 1
      67. Dim num3 As Integer = arg_3F_0
      68. While True
      69. Dim arg_90_0 As Integer = num3
      70. Dim num4 As Integer = num2
      71. If arg_90_0 > num4 Then
      72. Exit While
      73. End If
      74. Dim weakReference As WeakReference = Form1.__ENCList(num3)
      75. flag = weakReference.IsAlive
      76. If flag Then
      77. Dim flag2 As Boolean = num3 <> num
      78. If flag2 Then
      79. Form1.__ENCList(num) = Form1.__ENCList(num3)
      80. End If
      81. num += 1
      82. End If
      83. num3 += 1
      84. End While
      85. Form1.__ENCList.RemoveRange(num, Form1.__ENCList.Count - num)
      86. Form1.__ENCList.Capacity = Form1.__ENCList.Count
      87. End If
      88. Form1.__ENCList.Add(New WeakReference(RuntimeHelpers.GetObjectValue(value)))
      89. Finally
      90. Monitor.[Exit](_ENCList)
      91. End Try
      92. End Sub
      93. <DebuggerNonUserCode()>
      94. Protected Override Sub Dispose(disposing As Boolean)
      95. Try
      96. Dim flag As Boolean = disposing AndAlso Me.components IsNot Nothing
      97. If flag Then
      98. Me.components.Dispose()
      99. End If
      100. Finally
      101. MyBase.Dispose(disposing)
      102. End Try
      103. End Sub
      104. <DebuggerStepThrough()>
      105. Private Sub InitializeComponent()
      106. Me.cmdSendMail = New Button()
      107. Me.SuspendLayout()
      108. Dim arg_27_0 As Control = Me.cmdSendMail
      109. Dim location As Point = New Point(12, 12)
      110. arg_27_0.Location = location
      111. Me.cmdSendMail.Name = "cmdSendMail"
      112. Dim arg_51_0 As Control = Me.cmdSendMail
      113. Dim size As Size = New Size(75, 23)
      114. arg_51_0.Size = size
      115. Me.cmdSendMail.TabIndex = 0
      116. Me.cmdSendMail.Text = "Button1"
      117. Me.cmdSendMail.UseVisualStyleBackColor = True
      118. Dim autoScaleDimensions As SizeF = New SizeF(6F, 13F)
      119. Me.AutoScaleDimensions = autoScaleDimensions
      120. Me.AutoScaleMode = AutoScaleMode.Font
      121. size = New Size(284, 262)
      122. Me.ClientSize = size
      123. Me.Controls.Add(Me.cmdSendMail)
      124. Me.Name = "Form1"
      125. Me.Text = "Form1"
      126. Me.ResumeLayout(False)
      127. End Sub
      128. Private Sub cmdSendMail_Click(sender As Object, e As EventArgs)
      129. Dim Msg As MailMessage = New MailMessage()
      130. Msg.IsBodyHtml = False
      131. Dim oCertOverride As Form1.CertificateOverride = New Form1.CertificateOverride()
      132. ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(oCertOverride.RemoteCertificateValidationCallback)
      133. Dim mySmtpsvr As SmtpClient = New SmtpClient()
      134. mySmtpsvr.Host = "smtp.googlemail.com"
      135. mySmtpsvr.Port = 587
      136. mySmtpsvr.UseDefaultCredentials = False
      137. mySmtpsvr.Credentials = New NetworkCredential("dasistmeineadresse@whatever.com", "dasistmeinpasswort")
      138. mySmtpsvr.EnableSsl = True
      139. Msg.From = New MailAddress("dasistmeineadresse@whatever.com")
      140. Msg.[To].Add("empfängerderemail@whatever.com")
      141. Msg.Subject = "EMailüberschrift"
      142. Msg.Body = "DasistmeinEmailInhalt"
      143. Try
      144. mySmtpsvr.Send(Msg)
      145. Catch expr_B1 As Exception
      146. ProjectData.SetProjectError(expr_B1)
      147. Interaction MsgBox("Mh, da ist was schief gelaufen! Probiers nochmal :)", "fehler")
      148. ProjectData.ClearProjectError()
      149. End Try
      150. End Sub
      151. End Class
      152. End Namespace

      Neben vielem anderen (dekompilierter DesignerCode, dekompilierter verborgener Code) findet sich auch unser Code aus dem ersten Listing, und zwar komplett und unverfälscht aus der dekompilierten Exe wiederhergestellt.

      Wie wir es sehen, kann man Problemlos das Programm Dekompilieren und das Passwort auslesen (zeile#149).

      @Moderator:
      Teil 2 Folgt in einem Folgebeitrag, da der Inhalt vom Tutorial sonst zu lang ist!

      zzgl Info:
      Teil 2 kommt erst in 30 Mins.. (Sperre vom Forum aus)
      (Sollte jemand jetzt schon an dem kompl. Tutorial Interessiert sein, ich habe es einmal in meinem Forum kompl. gepostet Klick hier)

      Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Annoxoli“ ()

      TEIL 2:

      Wenn wir unser Programm Obfuscaten, sieht der Source Code schon etwas anders aus:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports BeispielProjekt.My
      2. Imports Microsoft.VisualBasic
      3. Imports Microsoft.VisualBasic.CompilerServices
      4. Imports System
      5. Imports System.Collections.Generic
      6. Imports System.ComponentModel
      7. Imports System.Drawing
      8. Imports System.Net
      9. Imports System.Net.Mail
      10. Imports System.Net.Security
      11. Imports System.Runtime.CompilerServices
      12. Imports System.Security.Cryptography.X509Certificates
      13. Imports System.Threading
      14. Imports System.Windows.Forms
      15. Imports
      16. Namespace BeispielProjekt
      17. <DesignerGenerated()>
      18. Public Class Form1
      19. Inherits Form
      20. Public Class CertificateOverride
      21. Public Function RemoteCertificateValidationCallback(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) As Boolean
      22. Return True
      23. End Function
      24. Shared Sub New()
      25. Ⴀ.ႤႳ()
      26. End Sub
      27. End Class
      28. Private SharedAs List(Of WeakReference)
      29. PrivateAs IContainer
      30. <AccessedThroughProperty("cmdSendMail")>
      31. PrivateAs Button
      32. Shared Sub New()
      33. Ⴀ.ႤႳ()
      34. Form1.Ⴗ = New List(Of WeakReference)()
      35. End Sub
      36. Public Sub New()
      37. Form1.Ⴃ(Me)
      38. Me.Ⴃ()
      39. End Sub
      40. Private Shared Sub Ⴃ(Ⴐ As Object)
      41. DimAs List(Of WeakReference) = Form1.Ⴗ
      42. Global.Ⴈ.Ⴈ.Ⴐ(ⴗ, 640, 677)
      43. ' The following expression was wrapped in a checked-statement
      44. Try
      45. Dim num As Integer = 1
      46. While True
      47. Dim flag As Boolean
      48. Dim flag2 As Boolean
      49. Select Case num
      50. Case 0
      51. GoTo IL_C7
      52. Case 1
      53. IL_54:
      54. flag = Form1.Ⴗ.Count = Form1.Ⴗ.Capacity
      55. num = If(Not flag, 6, 4)
      56. Continue While
      57. Case 2
      58. GoTo IL_AE
      59. Case 3
      60. Dim num2 As Integer
      61. num2 += 1
      62. num = 5
      63. Continue While
      64. Case 4
      65. Dim num2 As Integer = 0
      66. Dim arg_89_0 As Integer = 0
      67. Dim num3 As Integer = Form1.Ⴗ.Count - 1
      68. Dim num4 As Integer = arg_89_0
      69. num = 11
      70. Continue While
      71. Case 5
      72. Dim num4 As Integer
      73. num4 += 1
      74. num = 11
      75. Continue While
      76. Case 6
      77. GoTo IL_155
      78. Case 7
      79. Dim num4 As Integer
      80. Dim weakReference As WeakReference = Form1.Ⴗ(num4)
      81. flag = Ⴀ.Ⴐ(weakReference, 253, 215)
      82. GoTo IL_AE
      83. Case 8
      84. Dim num2 As Integer
      85. Dim num4 As Integer
      86. Form1.Ⴗ(num2) = Form1.Ⴗ(num4)
      87. num = 3
      88. Continue While
      89. Case 9
      90. Dim num2 As Integer
      91. Dim num4 As Integer
      92. flag2 = num4 <> num2
      93. GoTo IL_C7
      94. Case 10
      95. Dim num2 As Integer
      96. Form1.Ⴗ.RemoveRange(num2, Form1.Ⴗ.Count - num2)
      97. Form1.Ⴗ.Capacity = Form1.Ⴗ.Count
      98. num = 6
      99. Continue While
      100. Case 11
      101. Dim num4 As Integer
      102. Dim arg_114_0 As Integer = num4
      103. Dim num3 As Integer
      104. Dim num5 As Integer = num3
      105. num = If(arg_114_0 <= num5, 7, 10)
      106. Continue While
      107. Case 12
      108. GoTo IL_174
      109. End Select
      110. GoTo IL_54
      111. IL_AE:
      112. num = If(Not flag, 5, 9)
      113. Continue While
      114. IL_C7:
      115. num = If(Not flag2, 3, 8)
      116. End While
      117. IL_155:
      118. Form1.Ⴗ.Add(New WeakReference(Global.Ⴈ.Ⴈ.Ⴄ(Ⴐ, 832, 847)))
      119. IL_174:
      120. Finally
      121. Monitor.[Exit](ⴗ)
      122. End Try
      123. End Sub
      124. Protected Override Sub Dispose(disposing As Boolean)
      125. Try
      126. Dim num As Integer = 3
      127. While True
      128. Dim arg_49_0 As Boolean
      129. Select Case num
      130. Case 0
      131. num = If(Me.Ⴗ IsNot Nothing, 1, 2)
      132. Continue While
      133. Case 1
      134. arg_49_0 = True
      135. GoTo IL_49
      136. Case 2
      137. arg_49_0 = False
      138. GoTo IL_49
      139. Case 3
      140. IL_2C:
      141. num = If(Not disposing, 2, 0)
      142. Continue While
      143. Case 4
      144. Me.Ⴗ.Dispose()
      145. GoTo IL_5F
      146. Case 5, 6
      147. GoTo IL_5F
      148. Case 7, 8
      149. GoTo IL_63
      150. End Select
      151. GoTo IL_2C
      152. IL_49:
      153. Dim flag As Boolean = arg_49_0
      154. num = If(Not flag, 7, 4)
      155. Continue While
      156. IL_5F:
      157. num = 7
      158. End While
      159. IL_63:
      160. Finally
      161. MyBase.Dispose(disposing)
      162. End Try
      163. End Sub
      164. Private Sub Ⴃ()
      165. Dim num As Integer = 5
      166. While True
      167. Select Case num
      168. Case 0, 1
      169. Return
      170. Case 2
      171. Global.Ⴈ.Ⴈ.Ⴜ(Me.Ⴈ(), True, 754, 664)
      172. Dim sizeF As SizeF = New SizeF(6F, 13F)
      173. Ⴓ.Ⴅ(Me, sizeF, 991, 1008)
      174. num = 9
      175. Continue While
      176. Case 3
      177. GoTo IL_CB
      178. Case 4
      179. Global.Ⴈ.Ⴃ.Ⴀ(Me.Ⴈ(), MyComputer.Ⴐ(1111907667), 404, 489)
      180. Dim arg_AE_0 As Control = Me.Ⴈ()
      181. Dim size As Size = New Size(75, 23)
      182. Global.Ⴈ.Ⴈ.Ⴓ(arg_AE_0, size, 825, 804)
      183. num = 6
      184. Continue While
      185. Case 5
      186. IL_32:
      187. Me.Ⴈ(New Button())
      188. MyComputer.Ⴓ(Me, 285, 369)
      189. Dim arg_69_0 As Control = Me.Ⴈ()
      190. Dim point As Point = New Point(12, 12)
      191. Ⴀ.Ⴓ(arg_69_0, point, 600, 593)
      192. num = 4
      193. Continue While
      194. Case 6
      195. Ⴓ.Ⴀ(Me.Ⴈ(), 0, 9, 118)
      196. GoTo IL_CB
      197. Case 7
      198. Me.Controls.Add(Me.Ⴈ())
      199. Me.Name = MyComputer.Ⴐ(1111907669)
      200. Me.Text = MyComputer.Ⴐ(1111907669)
      201. num = 8
      202. Continue While
      203. Case 8
      204. GoTo IL_19E
      205. Case 9
      206. MyComputer.Ⴅ(Me, AutoScaleMode.Font, 479, 504)
      207. Dim size As Size = New Size(284, 262)
      208. Me.ClientSize = size
      209. num = 7
      210. Continue While
      211. End Select
      212. GoTo IL_32
      213. IL_CB:
      214. Global.Ⴈ.Ⴈ.Ⴅ(Me.Ⴈ(), MyComputer.Ⴐ(1111907668), 986, 992)
      215. num = 2
      216. End While
      217. IL_19E:
      218. Me.ResumeLayout(False)
      219. End Sub
      220. Friend Overridable Function Ⴈ() As Button
      221. Return Me.Ⴗ
      222. End Function
      223. <MethodImpl(MethodImplOptions.Synchronized)>
      224. Friend Overridable Sub Ⴈ(Ⴐ As Button)
      225. Dim num As Integer = 7
      226. While True
      227. Select Case num
      228. Case 0, 3
      229. Dim eventHandler As EventHandler
      230. Ⴀ.Ⴅ(Me.Ⴗ, eventHandler, 520, 580)
      231. num = 4
      232. Continue While
      233. Case 1
      234. Dim eventHandler As EventHandler
      235. Ⴀ.Ⴅ(Me.Ⴗ, eventHandler, 316, 375)
      236. num = 2
      237. Continue While
      238. Case 2, 5
      239. Me.Ⴗ =
      240. Dim flag As Boolean = Me.Ⴗ IsNot Nothing
      241. num = If(Not flag, 4, 3)
      242. Continue While
      243. Case 4, 6
      244. Return
      245. Case 7
      246. IL_28:
      247. Dim eventHandler As EventHandler = New EventHandler(Me.Ⴃ)
      248. Dim flag As Boolean = Me.Ⴗ IsNot Nothing
      249. num = If(Not flag, 2, 1)
      250. Continue While
      251. End Select
      252. GoTo IL_28
      253. End While
      254. End Sub
      255. Private Sub Ⴃ(Ⴐ As Object, Ⴄ As EventArgs)
      256. Dim num As Integer = 0
      257. Dim mailMessage As MailMessage
      258. Dim smtpClient As SmtpClient
      259. While True
      260. Select Case num
      261. Case 0
      262. IL_2E:
      263. mailMessage = New MailMessage()
      264. GoTo IL_34
      265. Case 1
      266. Ⴓ.Ⴗ(Ⴀ.ႤႤ(mailMessage, 788, 800), MyComputer.Ⴐ(1111907673), 681, 658)
      267. GoTo IL_146
      268. Case 2
      269. GoTo IL_146
      270. Case 3
      271. Global.Ⴈ.Ⴈ.ႤႳ(smtpClient, True, 1006, 896)
      272. Ⴀ.ႤႰ(mailMessage, New MailAddress(MyComputer.Ⴐ(1111907671)), 361, 359)
      273. num = 1
      274. Continue While
      275. Case 4
      276. GoTo IL_DD
      277. Case 5
      278. GoTo IL_15E
      279. Case 6
      280. Global.Ⴈ.Ⴈ.ႤႳ(smtpClient, False, 347, 310)
      281. MyComputer.Ⴗ(smtpClient, New NetworkCredential(MyComputer.Ⴐ(1111907671), MyComputer.Ⴐ(1111907672)), 11, 30)
      282. GoTo IL_DD
      283. Case 7
      284. GoTo IL_34
      285. Case 8
      286. smtpClient = New SmtpClient()
      287. Global.Ⴈ.Ⴈ.ႤႤ(smtpClient, MyComputer.Ⴐ(1111907670), 244, 164)
      288. Global.Ⴈ.Ⴈ.ႤႠ(smtpClient, 587, 905, 989)
      289. num = 6
      290. Continue While
      291. End Select
      292. GoTo IL_2E
      293. IL_34:
      294. Ⴀ.Ⴍ(mailMessage, False, 167, 231)
      295. Dim [object] As Form1.CertificateOverride = New Form1.CertificateOverride()
      296. Ⴀ.Ⴃ(New RemoteCertificateValidationCallback([object].RemoteCertificateValidationCallback), 194, 133)
      297. num = 8
      298. Continue While
      299. IL_DD:
      300. num = 3
      301. Continue While
      302. IL_146:
      303. mailMessage.Subject = MyComputer.Ⴐ(1111907674)
      304. num = 5
      305. End While
      306. IL_15E:
      307. mailMessage.Body = MyComputer.Ⴐ(1111907675)
      308. Try
      309. Select Case3
      310. Case 0, 2, 3, 4
      311. IL_18C:
      312. smtpClient.Send(mailMessage)
      313. GoTo IL_193
      314. Case 1
      315. GoTo IL_193
      316. End Select
      317. GoTo IL_18C
      318. IL_193:
      319. Catch expr_195 As Exception
      320. ProjectData.SetProjectError(expr_195)
      321. Interaction.MsgBox(MyComputer.Ⴐ(1111907676), MsgBoxStyle.Critical, MyComputer.Ⴐ(1111907677))
      322. ProjectData.ClearProjectError()
      323. End Try
      324. Select Case0
      325. Case 0, 1, 2, 3, 4
      326. Return
      327. End Select
      328. End Sub
      329. End Class
      330. End Namespace



      Man kann noch grob die Strukturen vom Source Code erkennen, jedoch sehen wir unser Passwort nicht mehr!
      Mit dem Tool, womit ich das entsprechende Programm Dekompiliert habe, zeigt in der Übersicht zwischen
      dem Geschützten, und ungeschützten Programm deutliche Unterschiede:
      Spoiler anzeigen
      (Rot = Geschützte Source Code | Grün = Default Source Code)


      Natürlich hat man niemals 100% Schutz vor Angriffen u.s.w.
      aber wieso sollte man einem Einbrecher den Schlüssel in die Hand drücken,
      wenn man Ihm auch eine Mauer vor der Nase bauen kann.

      Screenshot vom Source Code:
      Spoiler anzeigen

      (Ungeschützt)


      (Geschützt)



      Generell sollte man aber Methoden über FTP / EMail (bzw allgemein mit Empfindlichen Daten) vermeiden, und sich für eine andere Methode entscheiden.
      Dazu bedenkt, das dass Dekompilieren von Programmen nur zur eigenen Überprüfung des Programms erlaubt ist.
      Solltet Ihr dies bei einem anderen Programm machen, ohne die Erlaubnis vom Besitzer, so macht Ihr euch Strafbar!
      (Edit by ErfinderDesRades:
      Vergleichbares steht auch hier: Computerprogramme und das Urheberrecht: „Dekompilierung“
      Alles natürlich ohne Gewähr, und mehr "Rechtsberatung" kann und darf hier auch gar nicht erfolgen.)


      Für fragen stehe ich euch gerne zur Verfügung!

      Gruß, Annoxoli

      Quellen: Wikipedia (Cesar Verschlüsslung)
      Dekompiler: ILSpy (Kostenlos)
      Obfuscator Programm: DeepSea Obfuscator (Kostenpflichtig)
      Tutorial Inhalt: by @Annoxoli

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Zum Thema:

      Wichtig ist wovor man schützen will. Wenn man das Programm vor Änderungen schützen will (dekompilieren -> kopieren -> ändern), reicht es manchmal schon kreativ zu sein, um andere zu verwirren (natürlich nur ein kleiner Schutz)

      Wenn man vor dem kopieren oder dem generellen lesen des Sourcecodes schützen will, gibts nur 2 Möglichkeiten: Wechsel auf eine Sprache mit der man native Assemblys erstellen kann oder Obfuskieren.

      Natürlich ist man selbst mit nativen Assemblys nicht 100% geschützt, aber anhand des Aufwandes ist es meistens unwirtschaftlich diese zu disassemblen und daraus lesbaren Code zu machen.

      Beim Obfuskieren (z.B.: mit Themida) ist man zumindest von Leuten mit geringen Kenntnissen sicher, da Themida eine virtuelle Maschine (virtuelle Laufzeitumgebung) für das Programm erstellt, wodurch ein normaler Decompiler ala dotPeek oder JustDecompile nicht mehr in der Lage ist, den Code auszulesen.

      Angeblich kann man durch auslesen des Arbeitsspeichers wieder an die Informationen kommen, aber das habe ich bis jetzt noch nicht versucht und selbst wenn es geht, muss man sich entweder mit asm oder IL-Code herumschlagen.

      Um sichere Software zu erstellen, gehört wahrscheinlich auch den "Cracker" auf falsche fährten zu locken. Methoden die ähnlich heißen, aber verschiedene Dinge bewirken. (Allerdings wird die Wartung dadurch richtig schwierig)
      SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

      Weil einfach, einfach zu einfach ist! :D
      In meiner letzten Firma wurde die .NET-Software richtig gesichert.
      Das Programm wurde verschlüsselt und das Entschlüsseln auf dem Ziel-PC erfolgt mit Zugriff auf einen Dongle.
      Diese Variante ist wohl nahezu sicher, allerdings kostspielig, womit sich sofort ergibt, dass auch Software ihren Preis hat.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      In Deutschland ist das Dekompielieren (Reverse Engineering) generell nicht verboten!
      Nichtmal wenn in den Lizenzvereinbarungen entsprechende Klauseln vorhanden sind!
      Siehe Wikipedia!
      de.wikipedia.org/wiki/Reverse_Engineering

      Edit by ErfinderDesRades:
      Ich wiederhole nochmal meinen Edit aus Post#4: Jede Aussage in rechtlichen Dingen ist ohne Gewähr, es sei denn, man ist Rechtsanwalt.
      Auch diese Aussage ist ohne Gewähr.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Kleiner Zusatz, hab folgendes in der MSDN gefunden:


      .NET-Assemblies sind für jedermann offen lesbar. Selbst Obfuskatoren können eine Software nicht wirksam verschlüsseln. Wie kann geistiges Eigentum dann vor dem Zugriff Dritter geschützt werden? Ist ein solcher Schutz überhaupt sinnvoll? Dieser Artikel zeigt, wie eine im Release-Modus erstellte Assembly disassembliert und dekompiliert werden kann. Es wird dargestellt, wie leicht es ist, den ursprünglichen Sourcecode zu rekonstruieren. Anschließend wird diskutiert, auf welche Weise Software-Hersteller sich vor der Offenlegung ihrer Produkte schützen, und dass es ein Leichtes ist, die angewandten Schutzmechanismen wieder zu brechen. Als Fallbeispiel wird die Methode Validate() einer Klasse IbanValidator betrachtet, ein Algorithmus, der die Prüfziffer einer International Bank Account Number (IBAN) berechnet und verifiziert, ob es sich um eine grundsätzlich gültige Kontonummer handelt (siehe Kasten „IBAN“).


      Quelle: msdn.microsoft.com/de-de/library/bb979521.aspx

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Annoxoli“ ()

      Also ich finde du hast ein guten Tutorial übers Obfuscateing gemacht. Aber es gibt doch viel mehr methoden sein Programm zu schützen, ich nenne mal ein paar mir bekannte:



      - Obfuscateing

      - Packing(bsp- UPX)

      - Randomizeing (Variablen, String, ...)

      - Junk Code (confuser)

      würde mich freuen wenn du auch darüber tutorials machen kannst
      Wie @Dodo: schon sagt, wird es ebenfalls im Klatext abgespeichert.
      Was du machen kannst ist, eine Algorithmus entwickeln, der dein passwort verschlüsselt.
      das kannst du dann zb. in einer Textdatei mitliefern oder wo anders abspeichern.
      allerdings, ist es dann wieder möglich, unter .net an dein entschlüsslungspasswort zu kommen.
      demnach, was in meinem tutorial steht:
      am besten auf sensible daten im programm ( grade unter .net ) verzichten.
      wenn es möglich ist lieber auf externe sachen verweisen ( wie zb. PHP Scripte etc. )

      gruß, annoxoli
      hier, habe ihn aber nicht getestet:
      LINK NICHT MEHR VERFÜGBAR

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Annoxoli“ ()