Tag: assembly

内联汇编代码以获取CPU ID

我在这里找到了一段很好的代码,它使用API​​调用执行ASM指令,以获取CPU的序列号: using System; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport(“user32”, EntryPoint = “CallWindowProcW”, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)] private static extern IntPtr ExecuteNativeCode([In] byte[] bytes, IntPtr hWnd, int msg, [In, Out] byte[] wParam, IntPtr lParam); [return: MarshalAs(UnmanagedType.Bool)] [DllImport(“kernel32”, CharSet = CharSet.Unicode, SetLastError = true)] public static extern […]

使用OllyDebug破解C#应用程序

我想知道是否有办法用OllyDebug破解C#Windows应用程序。 我用Visual C#2010 Express编写了一个简单的CrackMe应用程序。 当我用OllyDebug打开它并根据需要修改ASM代码时,OllyDebug中没有“复制到可执行文件”选项,因为我的注册表单窗口是用“new”运算符动态分配的(我相信,VirtualAlloc()函数调用在调试器中)。 虽然我能够修改ASM代码(这只是NOP’ing JE跳转),但是我无法用破解的代码保存我的.exe文件,看起来像OllyDbg“看到”数据段中的代码,当时该代码不存在应用程序启动并且仅动态分配。 任何人都可以帮我解决这个问题吗? 我认为至少有两种方法可以修改* .exe: 1)使用OllyDbg深入挖掘代码,找到分配前实际代码所在的位置(因为新的RegistrationForm实例不会神奇地超出空间,是吗?) 2)如果它允许在VS Express中快速创建应用程序并且不需要太多复杂的代码,则使用静态调用,因此每次单击“Register”时都会显示相同的RegistrationForm窗口(它将保存在应用程序的代码部分中,因此将在OllyDbg中修改。 可以指出如何重写代码并保持简单分配RegistrationForm(singleton?)的相同实例。 我唯一需要的是破解并保存* .exe,重新启动并填写任何数据以“完成注册”。 以下是使用Main()方法的MyCrackMe类的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyCrackMe { class MyCrackMe { public static void Main() { MyForm mainWindow = new MyForm(); System.Windows.Forms.Application.Run(mainWindow); } } } 主窗口类: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using […]

C#理论:将一个JMP写入asm中的编解码器

让我们假设我已经使用VirtualAllocEx (它返回地址)分配了我的codecave放置的地址,并使用WriteProcessMemory()将我的代码写入该地址。 这是问题: 如何写一个跳转到我的编解码器? 我知道跳转以“ E9 ”开头,但是如何将VirtualAllocEx返回的地址转换为正确的UInt32(dword),以便调试器/编译器能够理解指令? 例如: 我在地址00402020 (原生应用程序的OEP)。 我写了一个跳转到004028CF (空位)“ JMP 004028CF ”。 以字节为单位的指令如下所示: CPU Disasm Address Hex dump Command Comments 00402020 E9 AA080000 JMP 004028CF “ E9 ”是我们表明JMP的方式。 怎么样“ AA080000 ”,我该如何生成呢? 我需要做类似的事情,所以我可以将JMP初始化为我的codecave,它将位于VirtualAllocEx()返回的地址。 任何帮助将不胜感激! 提前致谢。

部署NetFwTypeLib以管理Windows防火墙

我的Windows服务需要从Windows防火墙创建/删除某些规则。 为此,我通过COM与\system32\hnetcfg.dll接口。 它在我的64位Windows 7计算机上运行良好 ,但在另一台64位Windows 7计算机上进行测试会引发以下错误: Service cannot be started. System.IO.FileNotFoundException: Could not load file or assembly ‘Interop.NetFwTypeLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The system cannot find the file specified. 我有一种感觉,如果我使用我的应用程序嵌入并安装程序集,我会遇到不同版本的Windows以及32位和64位之间的问题。 如何解决这个缺少的assembly部署问题? 编辑:这似乎是除了4.0之外的任何目标框架的VS2010问题 。 有人有解决方法吗?

如果语句似乎正在评估,即使条件评估为false

昨晚工作到很晚,我们试图弄清楚为什么会出现问题。 如果不应该进行validation检查失败。 我们最终在这段代码中添加了一个print语句(从Reflector中反汇编,以便检查代码实际上是我们编写的代码): public static string Redacted(string name, DateTime lastModified) { long ticks = lastModified.Ticks; if ((ticks != (ticks – (ticks % 10000L))) && (lastModified != DateTime.MaxValue)) { Log.Debug(string.Format(“Last Modified Date = ‘{0}’. Ticks = ‘{1}’. TicksCalc = ‘{2}'”, lastModified.ToString(“dd/MM/yyyy hh:mm:ss.fff”), ticks, ticks – (ticks % 10000L))); 它打印(重新格式化): Last Modified Date = ’22/03/2011 12:16:22.000’. Ticks […]

C#64位版本代码的反汇编视图比32位调试代码长75%?

编辑 我测试了32位的版本,代码很紧凑。 因此,下面是64位问题。 我正在使用VS 2012 RC。 调试是32位,Release是64位。 下面是调试然后发布一行代码的反汇编: crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff]; 0000006f mov eax,dword ptr [ebp-40h] 00000072 shr eax,8 00000075 mov edx,dword ptr [ebp-3Ch] 00000078 mov ecx,0FF00h 0000007d and edx,ecx 0000007f shr edx,8 00000082 mov ecx,dword ptr [ebp-40h] 00000085 mov ebx,0FFh 0000008a and […]

两个不同的汇编版本“找到的汇编的清单定义与汇编参考不匹配”

我有一个项目,我正在努力,需要使用Mysql Connector for NHibernate,(Mysql.Data.dll)。 我还想在同一个项目中引用另一个项目(Migrator.NET)。 问题是即使Migrator.NET是使用特定版本= false的MySql.Data引用构建的,它仍然会尝试引用构建库的旧版MySql.Data而不是仅使用那里的版本..我得到标题中列出的例外: —-> System.IO.FileLoadException:无法加载文件或程序集’MySql.Data,Version = 1.0.10.1,Culture = neutral,PublicKeyToken = c5687fc88969c44d’或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (HRESULTexception:0x80131040) 我在主程序集中引用的版本是6.1.3.0。 如何让两个组件合作? 编辑: 对于那些指定程序集绑定重定向的人,我已经设置了这个: 我在另一个项目中引用了这个主程序集,但仍然遇到了同样的错误。 如果我的主程序集被复制到本地以便在另一个程序集中使用,它是否会使用app.config中的设置,或者这些信息是否必须包含在引用我的主程序集的每个应用程序或程序集中?

是否可以在没有FullName的情况下从GAC加载程序集?

我知道如何从文件名加载程序集,也从GAC加载程序集。 由于我的.msi文件会将一个dll项目放入GAC,我想知道是否可以从GAC加载它而不知道FullName(我的意思是只是使用程序集名称,甚至是dll文件名),因为我必须从另一个项目加载此程序集。

项目参考解决方案.net 4.5和.net 3.5

继续这个线程: 在同一解决方案/项目中将.NET 3.5与4 / 4.5程序集混合使用 我找到了一个解决方法: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/36b1a209-55d5-4323-91dc-0919ba2e1d03/ 它基本上做了什么,让我的解决方案编译并确定在什么CLR下运行的每个项目。 有人看到这个缺点吗? 它构建项目,在我必须在.net 3.5上运行的第三方api上,我明确地在其App.config上写入以使用CLR 2.0而不是4.0运行 <!—-> 编辑: 我的主要应用是使用.net 4.5和C#5function。 我的第三方API在子进程上运行(我从main开始),该进程将连接到必须在3.5和CLR2上的API。 所以我明确定义那里作为CLR2运行..

创建自定义AppDomain并向其添加程序集

如何创建appdomain,向其添加程序集,然后销毁该app域? 这是我尝试过的: static void Main(string[] args) { string pathToExe = @”A:\Users\Tono\Desktop\ConsoleApplication1.exe”; AppDomain myDomain = AppDomain.CreateDomain(“MyDomain”); Assembly a = Assembly.Load(System.IO.File.ReadAllBytes(pathToExe)); myDomain.Load(a.FullName); // Crashes here! } 我也尝试过: myDomain.Load(File.ReadAllBytes(pathToExe)); 如何将程序集添加到appdomain。 一旦我这样做,我可以通过reflection找到方法执行它,然后销毁appdomain 我得到的例外是: 无法加载文件或程序集“ConsoleApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。 该系统找不到指定的文件。