首页
社区
课程
招聘
[原创].Net程序集基于方法的保护原理(HookJIT篇)
发表于: 2010-7-4 22:54 37335

[原创].Net程序集基于方法的保护原理(HookJIT篇)

2010-7-4 22:54
37335
int *__cdecl getJit()
{
int *result; // eax@1
result = (int *)dword_790B7260;
if ( !dword_790B7260 )
{
result = &dword_790B7268;
dword_790B7268 = (int)&CILJit___vftable_;
dword_790B7260 = (int)&dword_790B7268;
}
return result;
}
extern "C" 
ICorJitCompiler* __stdcall getJit()
{
    static char FJitBuff[sizeof(FJitCompiler)];
    if (ILJitter == 0)
    {
        // no need to check for out of memory, since caller checks for return value of NULL
        ILJitter = new(FJitBuff) FJitCompiler();
        _ASSERTE(ILJitter != NULL);
    }
    return(ILJitter);
}
class FJitCompiler : public ICorJitCompiler
{
public:

    /* the jitting function */
    CorJitResult __stdcall compileMethod (
            ICorJitInfo*            comp,               /* IN */
            CORINFO_METHOD_INFO*    info,               /* IN */
            unsigned                flags,              /* IN */
            BYTE **                 nativeEntry,        /* OUT */
            ULONG  *                nativeSizeOfCode    /* OUT */
            );
    
    /* notification from VM to clear caches */
    void __stdcall clearCache();
    BOOL __stdcall isCacheCleanupRequired();

    static BOOL Init();
    static void Terminate();

private:
    /* grab and remember the jitInterface helper addresses that we need at runtime */
    BOOL GetJitHelpers(ICorJitInfo* jitInfo);
};
int __stdcall CILJit::compileMethod(ULONG_PTR classthis, ICorJitInfo *comp,
               CORINFO_METHOD_INFO *info, unsigned flags,         
               BYTE **nativeEntry, ULONG  *nativeSizeOfCode)
struct CORINFO_METHOD_INFO
{
    CORINFO_METHOD_HANDLE       ftn;
    CORINFO_MODULE_HANDLE       scope;
    BYTE *                      ILCode;
    unsigned                    ILCodeSize;
    unsigned short              maxStack;
    unsigned short              EHcount;
    CorInfoOptions              options;
    CORINFO_SIG_INFO            args;
    CORINFO_SIG_INFO            locals;
};

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (30)
雪    币: 259
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
沙发,顶一下
2010-7-4 23:20
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
等下篇学习~
2010-7-5 09:33
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
网上遍地都是, 人都说烂了。 你发出来,居然加精?!!!
2010-7-5 17:29
0
雪    币: 776
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
太深奥了 再学一遍啊
2010-7-5 18:37
0
雪    币: 337
活跃值: (74)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
哈哈哈哈...safeaz气晕了.
其实啊,"发出来"就是关键了,高手们知道了不说,或不屑一说,泛谈多实例少,最深层的技术则藏着掩着大家难得一窥.技术本身是层窗户纸,也总会过时,无论含量多少,讲清楚,给出代码例子,让后来学习的人可以一目了然,节省时间,这方面国外的大师们做很棒.而我只是钻个空子罢了.

哈哈...想想还是让人乐.坛里.net气氛并不浓,前时也拜读过你关于DNGuard的文章,其实把你的分析和代码细致些贴出来就是精华.祝好!
2010-7-5 21:36
0
雪    币: 21
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哈哈,过去的事就算了。 那是和Rick玩的。
2010-7-6 12:10
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
特意登陆赞精神
2010-7-7 09:22
0
雪    币: 248
活跃值: (123)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
保护后的APP运行不了
上传的附件:
2010-7-7 14:46
0
雪    币: 337
活跃值: (74)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
10
楼上,您好!

从给出的抓图来看,和删除掉HookJitPrj.dll的运行效果是一样的。也就是说:HookJitPrj.dll没有运行,挂勾没完成,程序跑的是换成了空的方法体,没能在解析时替换回正确的方法字节码,所以出错了。

问题可能出在这里:
//加入Program类
[DllImport("HookJitPrj.dll", CallingConvention = CallingConvention.Cdecl)]
 private static extern void HookJIT();


部分.net1.1和.net2.0混杂的机器环境下(更具体的环境不明),系统找不到指定的非托管DLL,导致HookJIT()方法不会被执行。

你可以试一下把HookJitPrj.dll直接放入System32系统目录中,如果错误消除,说明猜测正确,这种情况的最简单解决方法为:拷入系统路径或改为固定路径 [DllImport("C:\\HookJitPrj.dll",。。。。],智能一点的办法是PInvoke kernel32.dll中的API获取指针然后用委托调用了。

如果HookJitPrj.dll放入系统路径仍旧不能执行的话,猜想您写的任意[DllImport"非托管.dll",。。。。]都执行不了的。我不知道它怎么了,只好把环境搬来一起研究一下了。
2010-7-8 15:00
0
雪    币: 7188
活跃值: (4165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
期待下文的jitNativeCode...
2010-7-8 15:24
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主看下:
http://hi.baidu.com/kingcham/blog/item/28fa43951b2b2112d31b70d9.html

好像你的HookJitPrj.dll编译有问题
2010-7-20 15:37
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
异常:已引发:“无法加载 DLL“HookJitPrj.dll”: 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 (异常来自 HRESULT:0x800736B1)。”(System.DllNotFoundException)
引发了一个 System.DllNotFoundException:“无法加载 DLL“HookJitPrj.dll”: 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 (异常来自 HRESULT:0x800736B1)。”
2010-7-20 15:39
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我的机器上,不做任何更改,重新编译一下HookJitPrj.dll就行了
2010-7-20 15:49
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主,我有个问题,要得到一个方法的字节很简单,但是反过来,已知字节,怎么得到方法呢?

MethodInfo/MethodDefinition GetMethod(byte[]){}

想通过byte[]得到MethodInfo或者Mono.Cecil中的MethodDefinition,以便调用,该怎么做呢?
2010-7-20 16:03
0
雪    币: 160
活跃值: (29)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=ssyfzy;837965]楼主,我有个问题,要得到一个方法的字节很简单,但是反过来,已知字节,怎么得到方法呢?

MethodInfo/MethodDefinition GetMethod(byte[]){}

想通过byte[]得到MethodInfo或者Mono.Cecil中的MethodDefinition,以...[/QUOTE]

有点风、马、牛!不过万物都有联系。

把字节码填回原方法体(只针对这个简单例子)然后Mono.Cecil。。 AssemblyDefinition asm = AssemblyFactory.GetAssembly(。。。; foreach (TypeDefinition type in asm.MainModule.Types)想改什么改什么了。
反射则得到classtype后:
MethodInfo mi = yourGettype.GetMethod("方法名");然后动态改什么是什么了。
2010-7-21 16:38
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
把字节码填回原方法体

怎么填呢?要在程序中填,而不是手动
比如我的程序中有一个
void Run()
{
}
函数,反编译什么也看不到,运行时我怎么把byte[]填进去并调用?
2010-7-23 11:15
0
雪    币: 152
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习学习下。。。这好东西啊
2010-7-23 15:16
0
雪    币: 173
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
lz共享精神可嘉,学习中
2010-7-25 02:35
0
雪    币: 194
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
 我是写.NET程序的,希望保护好劳动成果!
2010-11-18 15:08
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
一般只看贴不回贴,今天必须得回!绝大多数.NET破解的文章毫无疑义,能看到源码了还破解个屁,楼主的文章很有建设意义!赞!
2010-12-20 04:20
0
雪    币: 5467
活跃值: (3854)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
22
学习了,正好用上
2011-1-22 18:06
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
支持凤姐顶一下
2011-1-22 18:35
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
请在静态库中使用 MFC,但我在执行到加载mscorjit.dll仍不成功,貌似找不到,把mscorjit.dllCOPY到当前目录下可以了,跟了下,没有发现执行my_compileMethod方法,怀疑楼主的例子真的与挂勾没有半毛钱关系
2011-1-24 16:47
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
收藏了,!~
2011-5-31 11:26
0
游客
登录 | 注册 方可回帖
返回
//