目标:破解.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了。是不是很方便呢。
- 标 题:请求加精!绕过.Net 2.0强名称验证,解决混合代码无法反编译的问题。
- 作 者:shiylcn
- 时 间:2008-06-11 22:32
- 链 接:http://bbs.pediy.com/showthread.php?t=66392