小菜是刚开始学习破解,也学习写写文章,以下是在下学习破解用tmd加密的 Efang_Ru.dll 的过程,希望能给初学者一些帮组,大侠们请飘过。废话不多说开始破解
用peid查壳:Themida/WinLicense V1.8.X-V1.9.X Other -> Oreans Technologies * Sign.By.fly * 20080131 *
OD 载入
10040014 > B8 00000406 mov eax,6040000
10040019 60 pushad
1004001A 0BC0 or eax,eax
1004001C 74 68 je short Efang_Ru.10040086
1004001E E8 00000000 call Efang_Ru.10040023
10040023 58 pop eax
10040024 05 53000000 add eax,53
10040029 8038 E9 cmp byte ptr ds:[eax],0E9
1004002C 75 13 jnz short Efang_Ru.10040041
1004002E 61 popad
1004002F EB 45 jmp short Efang_Ru.10040076
10040031 DB2D 37000410 fld tbyte ptr ds:[10040037]
10040037 FFFF ??? ; 未知命令
10040039 FFFF ??? ; 未知命令
1004003B FFFF ??? ; 未知命令
1004003D FFFF ??? ; 未知命令
alt+m 在Efang_Ru CODE 段下内存写入断点,按shift + F9运行到下面代码断下
1012FD03 F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi] 再按F7+F8运行,如果直接运行将会等比较久的时间
1012FD05 C685 7D315906 5>mov byte ptr ss:[ebp+659317D],56
1012FD0C 68 396D1FD4 push D41F6D39
1012FD11 FFB5 DD055906 push dword ptr ss:[ebp+65905DD]
1012FD17 8D85 16E75D06 lea eax,dword ptr ss:[ebp+65DE716]
1012FD1D FFD0 call eax
1012FD1F 68 00800000 push 8000
1012FD24 6A 00 push 0
1012FD26 52 push edx
1012FD27 FFD0 call eax
1012FD29 8BC0 mov eax,eax
1012FD2B 83BD DD065906 0>cmp dword ptr ss:[ebp+65906DD],0
1012FD32 75 09 jnz short Efang_Ru.1012FD3D
1012FD34 83BD 65065906 0>cmp dword ptr ss:[ebp+6590665],0
1012FD3B 74 19 je short Efang_Ru.1012FD56
1012FD3D 50 push eax
1012FD3E 53 push ebx
1012FD3F 8BC0 mov eax,eax
1012FD41 B8 21040000 mov eax,421
1012FD46 8985 15085906 mov dword ptr ss:[ebp+6590815],eax
1012FD4C 8D9D E7045D06 lea ebx,dword ptr ss:[ebp+65D04E7]
1012FD52 FFD3 call ebx
按shift + F9运行到下面代码断下
1013245B 2933 sub dword ptr ds:[ebx],esi 在这里,取消内存写入断点
1013245D 013B add dword ptr ds:[ebx],edi
1013245F 83C1 02 add ecx,2
10132462 83EA 02 sub edx,2
10132465 ^ 0F85 65FFFFFF jnz Efang_Ru.101323D0
1013246B 83BD 652A5906 0>cmp dword ptr ss:[ebp+6592A65],0
10132472 ^ 0F85 45FFFFFF jnz Efang_Ru.101323BD
10132478 8BBD D9345906 mov edi,dword ptr ss:[ebp+65934D9] 选择这里按F4,跳出上面两个循环
1013247E B9 74240000 mov ecx,2474
10132483 32C0 xor al,al
10132485 F3:AA rep stos byte ptr es:[edi]
10132487 BA 6E026228 mov edx,2862026E
1013248C 8DBD 55385906 lea edi,dword ptr ss:[ebp+6593855]
10132492 B9 78000000 mov ecx,78
10132497 8DB5 EE0C6106 lea esi,dword ptr ss:[ebp+6610CEE]
1013249D F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
再到CODE段下内存写入断点,按shift + F9运行到下面代码断下,这里是解码输入表的地方,把EAX的值10029454记录下来,然后数据窗口跟随
取消内存写入断点
1013E402 8F00 pop dword ptr ds:[eax]
1013E404 8128 BE294465 sub dword ptr ds:[eax],654429BE
1013E40A E9 0E000000 jmp Efang_Ru.1013E41D
1013E40F A3 4C421DC7 mov dword ptr ds:[C71D424C],eax
1013E414 CA 6179 retf 7961
1013E417 68 BDA3508C push 8C50A3BD
1013E41C 80AD E9050000 0>sub byte ptr ss:[ebp+5E9],0
1013E423 94 xchg eax,esp
1013E424 7D 1E jge short Efang_Ru.1013E444
1013E426 9A 555251B9 486>call far 6548:B9515255
1013E42D 2D 0481E1A7 sub eax,A7E18104
1013E432 1C 09 sbb al,9
1013E434 0181 E9000409 add dword ptr ds:[ecx+90400E9],eax
1013E43A 0089 CA598956 add byte ptr ds:[ecx+568959CA],cl
1013E440 FC cld
然后ctrl+g ,输入 ZwFreeVirtualMemory 确定,到达下面代码 的retn 下断点,shift + F9运行
7C92D38E > B8 53000000 mov eax,53
7C92D393 BA 0003FE7F mov edx,7FFE0300
7C92D398 FF12 call dword ptr ds:[edx]
7C92D39A C2 1000 retn 10 这里下断
这时,你会看到原来数据窗口数值全部显示0的,现在已经解码如下,可以确定这里应该是输入表的地方了
地址 数值 注释
10029454 77BD18AA version.VerQueryValueA
10029458 77BD19EF version.GetFileVersionInfoSizeA
1002945C 77BD1A40 version.GetFileVersionInfoA
10029460 00000000
10029464 72F83757 winspool.OpenPrinterA
10029468 72F8665F winspool.DocumentPropertiesA
1002946C 72F74D40 winspool.ClosePrinter
10029470 00000000
10029474 76322563 comdlg32.GetFileTitleA
10029478 00000000
1002947C 76D36051 iphlpapi.GetAdaptersInfo
再次按F9后,注意观察 edi 寄存器,此时为红色, 重复按F9,直到 edi 变为白色,这时便是返回时机,alt+f9返回到下面代码,还没到达oep
1012861A /0F87 08000000 ja Efang_Ru.10128628
10128620 |60 pushad
10128621 |8AD7 mov dl,bh
10128623 |66:B9 BFF4 mov cx,0F4BF
10128627 |61 popad
10128628 \58 pop eax
10128629 0F85 07000000 jnz Efang_Ru.10128636
1012862F 0F89 01000000 jns Efang_Ru.10128636
10128635 F5 cmc
10128636 5A pop edx
10128637 FC cld
10128638 60 pushad
10128639 E8 05000000 call Efang_Ru.10128643
此时 alt+m 在 Efang_Ru 代码段 f2 下断,shift+f9 运行到下面代码断下,查看这里的代码特征像是vc7的入口代码,大功告成,这里便是oep
1001437C . 6A 0C push 0C
1001437E . 68 E8BD0210 push Efang_Ru.1002BDE8
10014383 . E8 B8120000 call Efang_Ru.10015640
10014388 . 33C0 xor eax,eax
1001438A . 40 inc eax
1001438B . 8945 E4 mov dword ptr ss:[ebp-1C],eax
1001438E . 8B75 0C mov esi,dword ptr ss:[ebp+C]
10014391 . 33FF xor edi,edi
10014393 . 3BF7 cmp esi,edi
10014395 . 75 0C jnz short Efang_Ru.100143A3
10014397 . 393D 987C0310 cmp dword ptr ds:[10037C98],edi
1001439D . 0F84 B3000000 je Efang_Ru.10014456
100143A3 > 897D FC mov dword ptr ss:[ebp-4],edi
用lordpe dump unpack.dll,打开ImportREC_fix在进程列表里选择loaddll.exe,载入后再打开efang_ru.dll,选择unpack.dll
在oep处填写 1437C,在od的数据窗口往上翻,知道遇到一大堆 数值全部是零的地方 10029000,往下翻遇到全部为零的地方 1002a028
因为是DLL基地址10000000 所以10029000-10000000 = 29000,在rva处填写 29000, 1002a028 - 10029000 = 1028,在size 处填写1028
然后点击 ‘获取输入表’,找到很多有效的输入表函数,然后点击 ‘显示无效的’,用跟踪级别一,修复了部分,直接把无效的剪切掉
修复转存文件,破解完成,文件能正常使用
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)