首页
论坛
专栏
课程

[原创]请求加精!绕过.Net 2.0强名称验证,解决混合代码无法反编译的问题。

2008-6-11 22:32 13316

[原创]请求加精!绕过.Net 2.0强名称验证,解决混合代码无法反编译的问题。

2008-6-11 22:32
13316
目标:破解.NET2.0的强名称验证。对于经过强名称签名的混合代码(含有原生代码或者非托管代码)程序,无法通过反编译修改的方法进行Crack, 需要破解强名称验证才能进行修改。
工具:OD,PEBrowsePro,WinHex
关键:mscorwks.dll

笔记一  破解强签名验证

1、根据前人破.Net1.1的经验,找到Net运行库目录,定位到mscorsn.dll,OD查找String,得到结果

        文本字串参考位于 mscorsn:.text, 条目 7
        地址=79E611C1
        反汇编=push    79E610C0
        文本字串=ASCII "mscorsn.dll has been obsoleted. Please use mscoree.dll for Strong Name APIs.",LF
2、找到mscoree.dll,果然函数StrongNameSignatureVerification存在,下断,运行程序,没有断下来。
        原因出在哪里呢?难道是2.0另有模块验证强名称?
3、        在OD中设置选项-调试设置-中断于新模块,特别关注system32和.Net运行目录下以MS开始命名的模块,
        Executable modules, 条目 11
        基址=79E70000
        大小=00561000 (5640192.)
         入口=79EA0B2C mscorwks.<模块入口点>
         名称=mscorwks
        文件版本=2.0.50727.42 (RTM.050727-4200)
         路径=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
        果然在mscorwks.dll中发现StrongNameSignatureVerification函数,定位函数发现使用了重定位技术,看来有点不容易破
        查找参考,发现运行时先调用StrongNameSignatureVerification,成功后即加载,失败即报错,也就是说,只要修改判断即可
        测试果然成功。具体如下:
79F06A0A   . /0F85 CF981E00 jnz     7A0F02DF
79F06A10   > |897D FC       mov     dword ptr [ebp-4], edi
79F06A13   . |8B45 EC       mov     eax, dword ptr [ebp-14]
79F06A16   . |85C0          test    eax, eax
79F06A18   . |0F85 CD981E00 jnz     7A0F02EB
79F06A1E   . |8D4E 20       lea     ecx, dword ptr [esi+20]
79F06A21   . |E8 6316F8FF   call    79E88089
79F06A26   . |FF75 08       push    dword ptr [ebp+8]
79F06A29   . |68 12000080   push    80000012
79F06A2E   . |50            push    eax
79F06A2F   . |E8 A1000000   call    StrongNameSignatureVerification        ;调用函数
79F06A34   > |0FB6C0        movzx   eax, al
79F06A37   . |85C0          test    eax, eax                                                ;检查结果
79F06A39     |E9 7C8A0800   jmp     79F8F4BA                                                  ;返回0报错,返回1通过验证,修改为直接跳到正常程序即可。
79F06A3E     |90            nop
79F06A3F   . |E8 41000000   call    StrongNameErrorInfo
79F06A44   . |8BF8          mov     edi, eax
79F06A46   . |85FF          test    edi, edi
79F06A48   . |7D 0A         jge     short 79F06A54
79F06A4A   . |57            push    edi
79F06A4B   . |E8 24ABFBFF   call    79EC1574
79F06A50   . |85C0          test    eax, eax
79F06A52   . |75 1B         jnz     short 79F06A6F
79F06A54   > |8B45 08       mov     eax, dword ptr [ebp+8]
79F06A57   . |89BE 90000000 mov     dword ptr [esi+90], edi
79F06A5D   . |8B00          mov     eax, dword ptr [eax]
79F06A5F   . |8986 94000000 mov     dword ptr [esi+94], eax
79F06A65   . |C786 8C000000>mov     dword ptr [esi+8C], 1
79F06A6F   > |834D FC FF    or      dword ptr [ebp-4], FFFFFFFF
79F06A73   . |8D4D EC       lea     ecx, dword ptr [ebp-14]
79F06A76   . |E8 F779F9FF   call    79E9E472
79F06A7B   . |8BC7          mov     eax, edi
79F06A7D   > |E8 65ADF6FF   call    79E717E7
79F06A82   . |C2 0400       retn    4
79F06A85 > $ |6A 0C         push    0C
79F06A87   . |B8 E427327A   mov     eax, 7A3227E4
79F06A8C   . |E8 23ADF6FF   call    79E717B4
79F06A91   . |6A 00         push    0
79F06A93   . |8D4D E8       lea     ecx, dword ptr [ebp-18]
79F06A96   . |E8 74ADF6FF   call    79E7180F
79F06A9B   . |8365 FC 00    and     dword ptr [ebp-4], 0
79F06A9F   . |A1 5C1C387A   mov     eax, dword ptr [7A381C5C]
79F06AA4   . |85C0          test    eax, eax
79F06AA6   . |0F85 43F21D00 jnz     7A0E5CEF
79F06AAC   > |E8 828DFBFF   call    79EBF833
79F06AB1   . |85C0          test    eax, eax
79F06AB3   . |0F84 50F21D00 je      7A0E5D09
79F06AB9   . |8B00          mov     eax, dword ptr [eax]
79F06ABB   > |8BF0          mov     esi, eax
79F06ABD   > |8365 EC 00    and     dword ptr [ebp-14], 0
79F06AC1   . |834D FC FF    or      dword ptr [ebp-4], FFFFFFFF
79F06AC5   . |8D4D E8       lea     ecx, dword ptr [ebp-18]
79F06AC8   . |E8 6BADF6FF   call    79E71838
79F06ACD   . |8BC6          mov     eax, esi
79F06ACF   . |E8 13ADF6FF   call    79E717E7
79F06AD4   . |C3            retn
79F06AD5 > $ |6A 34         push    34
79F06AD7   . |B8 A856327A   mov     eax, 7A3256A8
79F06ADC   . |E8 D3ACF6FF   call    79E717B4
79F06AE1   . |33DB          xor     ebx, ebx
79F06AE3   . |53            push    ebx
79F06AE4   . |8D4D E4       lea     ecx, dword ptr [ebp-1C]
79F06AE7   . |885D F2       mov     byte ptr [ebp-E], bl
79F06AEA   . |E8 20ADF6FF   call    79E7180F
79F06AEF   . |895D FC       mov     dword ptr [ebp-4], ebx
79F06AF2   . |A1 5C1C387A   mov     eax, dword ptr [7A381C5C]
79F06AF7   . |3BC3          cmp     eax, ebx
79F06AF9   . |0F85 910A1E00 jnz     7A0E7590
79F06AFF   > |6A 24         push    24                               ; /n = 24 (36.)
79F06B01   . |8D45 C0       lea     eax, dword ptr [ebp-40]          ; |
79F06B04   . |53            push    ebx                              ; |c
79F06B05   . |50            push    eax                              ; |s
79F06B06   . |E8 4ECDF6FF   call    <jmp.&MSVCR80.memset>            ; \memset
79F06B0B   . |83C4 0C       add     esp, 0C
79F06B0E   . |6A 01         push    1
79F06B10   . |FF75 08       push    dword ptr [ebp+8]
79F06B13   . |8D45 C0       lea     eax, dword ptr [ebp-40]
79F06B16   . |50            push    eax
79F06B17   . |885D F3       mov     byte ptr [ebp-D], bl
79F06B1A   . |C645 E0 01    mov     byte ptr [ebp-20], 1
79F06B1E   . |E8 02FDFFFF   call    79F06825

4、绕过系统的强名称验证后,就可以为所欲为的进行DIY了。是不是很方便呢。

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (9)
aoanzhishu 4 2008-6-12 09:03
2
0
这是沙发啊.
xxyyzasabc 2008-6-12 09:13
3
0
路过....
kanxue 8 2008-6-12 09:47
4
0
离精华帖还有些距离,篇幅短了点
phoenixkiller 2009-6-3 22:01
5
0
学习一下,可以直接修改StrongNameSignatureVerification,让al返回1即可。
轻风飞扬 2009-6-5 19:38
6
0
顶一个,这类经验贴比较少见到
tease 2009-6-5 20:07
7
0
楼主的思路很好,可是很多计算机的DONET补丁打的不一样,会导致mscorwks.dll的版本不一样:这样会破解不通用
下面我给出mscorwks.dll版本号一览。(其中有8.0,9.0的部分是安装VS显示的版本号)
.NET Framework product version
Service pack level
Version

.NET Framework 1.0
Original release
1.0.3705.0 and 7.0.9466.0

.NET Framework 1.0
Service pack 1
1.0.3705.209

.NET Framework 1.0
Service pack 2
1.0.3705.288 and 7.0.9502.0

.NET Framework 1.0
Service pack 3
1.0.3705.6018 and 7.0.9951.0

.NET Framework 1.1
Original release
1.1.4322.573 and 7.10.3052.4

.NET Framework 1.1
Service pack 1
1.1.4322.2032 (if you have the MSI-based 1.1 SP1 installed) or 1.1.4322.2300 (if you have the OCM-based 1.1 SP1 installed on Windows Server 2003) and 7.10.6001.4

.NET Framework 2.0
Beta 1
2.0.40607.16 and 8.0.40607.16

.NET Framework 2.0
Beta 2
2.0.50215.44 and 8.0.50215.44

.NET Framework 2.0
Original release
2.0.50727.42 and 8.0.50727.42

.NET Framework 2.0
Service pack 1
2.0.50727.1433 and 8.0.50727.1433

.NET Framework 2.0
Service pack 2
2.0.50727.3053 and 8.0.50727.3053

.NET FrameWork2.0
The final version of windows vista
2.0.50727.312

.NET Framework 3.0
Original release
3.0.04506.26 (on Windows Vista) and 3.0.04506.30 (on downlevel operating systems)

.NET Framework 3.0
Service pack 1
3.0.04506.648

.NET Framework 3.0
Service pac
0.04506.2152

.NET Framework 3.5
Original release
3.5.21022.8 and 9.0.21022.8

.NET Framework 3.5
Service pack 1
3.5.30729.1 and 9.0.30729.1

其实更简单方法还是有的,在tankaiha的文章中有介绍。可以翻阅他以前的帖子。
vima 2009-6-6 17:52
8
0
.net现在好火哦~~
csdym 2016-1-7 11:38
9
0
mscoree.dll 在哪,在哪
v2.0.50727\mscorwks.dll里找不到StrongNameSignatureVerification,找不到

重要的事情不能说三遍

CLR改0,改0  从NET3.5开始已经修补了
myyzsy 2017-1-10 20:56
10
0
.NET 4.0 的修改那个文件
游客
登录 | 注册 方可回帖
返回