- UID
- 40339
注册时间2007-12-6
阅读权限20
最后登录1970-1-1
以武会友
TA的每日心情 | 开心 2020-12-31 08:08 |
---|
签到天数: 7 天 [LV.3]偶尔看看II
|
Themida/WinLicense Delphi 6.0 寻找Stolen Code!
【文章标题】: Themida/WinLicense Delphi 6.0 寻找Stolen Code!
【文章作者】: lal978112
【作者邮箱】: [email protected]
【软件名称】: Project1.exe
【加壳方式】: Themida/WinLicense
【保护方式】: 代码变形 iat加密 oep偷取
【编写语言】: Delphi 6.0
【使用工具】: OllyICE(Hideod 0.17) LordPE ImportREC
【操作平台】: XP SP2
【作者声明】: 我是一只小菜鸟,偶得一点心得,愿与大家分享
【详细过程】:
首先OD 载入 ,忽略所有异常,用Hideod 插件隐藏OD!
目标程序是:Project1.exe
PEID查得是:Themida|WinLicense V1.9.2.0 -> Oreans Technologies *
我这里用另一种思路,查找程序编写的语言:
运行Project1.exe,然后DUMP出来,再用PEID核心扫描为:Borland Delphi 6.0 - 7.0
知道是什么语言的就好办了,现在我们就开始脱壳
运行脚本:THEMIDA脚本(for IAT restore).txt
运行完脚本,OD停在这里:
00405C60 53 PUSH EBX 记位这个地址,同时记住 EAX=00453A1C (1)
00405C61 8BD8 MOV EBX,EAX
00405C63 33C0 XOR EAX,EAX
00405C65 A3 9C404500 MOV DWORD PTR DS:[45409C],EAX
00405C6A 6A 00 PUSH 0
00405C6C E8 2BFFFFFF CALL Project1.00405B9C ; JMP 到 kernel32.GetModuleHandleA
00405C71 A3 64664500 MOV DWORD PTR DS:[456664],EAX
00405C76 A1 64664500 MOV EAX,DWORD PTR DS:[456664]
00405C7B A3 A8404500 MOV DWORD PTR DS:[4540A8],EAX
00405C80 33C0 XOR EAX,EAX
00405C82 A3 AC404500 MOV DWORD PTR DS:[4540AC],EAX
00405C87 33C0 XOR EAX,EAX
00405C89 A3 B0404500 MOV DWORD PTR DS:[4540B0],EAX
00405C8E E8 C1FFFFFF CALL Project1.00405C54
00405C93 BA A4404500 MOV EDX,Project1.004540A4
00405C98 8BC3 MOV EAX,EBX
00405C9A E8 F5DEFFFF CALL Project1.00403B94
00405C9F 5B POP EBX
00405CA0 C3 RETN //在这里F4 F8跟进
来到这里:到VM里面了
006AF013 68 107C3A6C PUSH 6C3A7C10
006AF018 ^ E9 16C4FFFF JMP Project1.006AB433
006AF01D 07 POP ES ; 段寄存器修饰
006AF01E 42 INC EDX
006AF01F 56 PUSH ESI
006AF020 DBF4 FCOMI ST,ST(4)
006AF022 15 4672686C ADC EAX,6C687246
现在我们Alt+M,在代码段下F2断点 到这里了
00C2004F FF33 PUSH DWORD PTR DS:[EBX] ;在这里断下 EBX=00455058 (2)
00C20051 8B1C24 MOV EBX,DWORD PTR SS:[ESP]
00C20054 81EC 04000000 SUB ESP,4
00C2005A 890424 MOV DWORD PTR SS:[ESP],EAX
此时停在:00C2004F PUSH DWORD PTR DS:[EBX]上,注意代码中用到了EBX,那么我们
就记下EBX的值:00455058 数据窗口跟随,可以看到该处的值为:00456BDC
好了,继续F8一次,再在代码段下F2断点,来到这里:
004039EC 8B4424 04 mov eax, dword ptr [esp+4] ;在这里断下 单步向下
004039F0 F740 04 0600000>test dword ptr [eax+4], 6 ;这里实际上是一个反调试的地方
004039F7 0F85 89000000 jnz 00403A86 ;在这里改跳转,不让程序执行下面代码
004039FD 803D 28404500 0>cmp byte ptr [454028], 0
00403A04 77 0F ja short 00403A15
00403A06 8D4424 04 lea eax, dword ptr [esp+4]
00403A0A 50 push eax
00403A0B E8 FCD7FFFF call 0040120C ; jmp 到 kernel32.UnhandledExceptionFilter
00403A10 83F8 00 cmp eax, 0
00403A13 74 71 je short 00403A86
00403A15 8B4424 04 mov eax, dword ptr [esp+4]
改完跳转后程序来到这里:
7C9237BF 64:8B25 0000000>mov esp, dword ptr fs:[0]
7C9237C6 64:8F05 0000000>pop dword ptr fs:[0]
7C9237CD 8BE5 mov esp, ebp
7C9237CF 5D pop ebp
7C9237D0 C2 1400 retn 14
在代码段下F2断点 到这里了
00C4C574 FF33 push dword ptr [ebx] ;在这里断下
00C4C576 FF3424 push dword ptr [esp]
00C4C579 E9 3C920600 jmp 00CB57BA
程序在取地址00456BDC中的值,可以不管它
继续F8一次,再在代码段下F2断点,来到这里:
0045207C 53 push ebx ;在这里断下,记住这个地址 (3)
0045207D A1 B44F4500 mov eax, dword ptr [454FB4>
00452082 8338 00 cmp dword ptr [eax], 0
00452085 74 0A je short 00452091
00452087 8B1D B44F4500 mov ebx, dword ptr [454FB4>; Project1.00456040
0045208D 8B1B mov ebx, dword ptr [ebx]
0045208F FFD3 call ebx
00452091 5B pop ebx
00452092 C3 retn //在这里F4 F8跟进
又来到VM里面了
006AF025 68 6C23E169 push 69E1236C
006AF02A ^ E9 04C4FFFF jmp 006AB433
006AF02F 91 xchg eax, ecx
006AF030 AC lods byte ptr [esi]
继续在代码段下F2断点 到这里了
00C4C574 FF33 push dword ptr [ebx] ;在这里断下 EBX=00455138 (4)
00C4C576 FF3424 push dword ptr [esp]
00C4C579 E9 3C920600 jmp 00CB57BA
记下EBX的值:00455138 这里有一个技巧,如果:push dword ptr [ebx]是用的哪个寄存器,就记下那个
寄存器的地址
继续F8一次,再在代码段下F2断点,来到这里:
00C24A6D FF32 PUSH DWORD PTR DS:[EDX] ;在这里断下 EDX=00455058 (5)
00C24A6F 812C24 64103460 SUB DWORD PTR SS:[ESP],60341064
00C24A76 E9 9E580000 JMP 00C2A319
00C24A7B BA 20000000 MOV EDX,20
00C24A80 01FA ADD EDX,EDI
记下EDX的值:00455058
继续F8一次,再在代码段下F2断点,又来到反调试的这里,继续改跳转:
004039EC 8B4424 04 mov eax, dword ptr [esp+4] ;在这里断下 单步向下
004039F0 F740 04 0600000>test dword ptr [eax+4], 6
004039F7 0F85 89000000 jnz 00403A86 ;在这里改跳转,不让程序执行下面代码
004039FD 803D 28404500 0>cmp byte ptr [454028], 0
00403A04 77 0F ja short 00403A15
00403A06 8D4424 04 lea eax, dword ptr [esp+4]
00403A0A 50 push eax
00403A0B E8 FCD7FFFF call 0040120C ; jmp 到 kernel32.UnhandledExceptionFilter
00403A10 83F8 00 cmp eax, 0
00403A13 74 71 je short 00403A86
改完跳转后程序来到这里:
7C9237BF 64:8B25 0000000>mov esp, dword ptr fs:[0]
7C9237C6 64:8F05 0000000>pop dword ptr fs:[0]
7C9237CD 8BE5 mov esp, ebp
7C9237CF 5D pop ebp
7C9237D0 C2 1400 retn 14
在代码段下F2断点 到这里了
00C0004F FF33 push dword ptr [ebx] ;在这里断下
00C00051 8B1C24 mov ebx, dword ptr [esp]
00C00054 81EC 04000000 sub esp, 4
程序在取地址00456BDC中的值,可以不管它
继续F8一次,再在代码段下F2断点,来到这里:
00C4C574 FF33 push dword ptr [ebx] ;在这里断下 EBX=00453700 (6)
00C4C576 FF3424 push dword ptr [esp]
00C4C579 E9 3C920600 jmp 00CB57BA
00C4C57E 51 push ecx
记下EBX的值:00453700
继续F8一次,再在代码段下F2断点:
00452094 55 push ebp ;在这里断下,有点象OEP,可是它不是,记住这个地址 (7)
00452095 8BEC mov ebp, esp
00452097 51 push ecx
00452098 53 push ebx
00452099 56 push esi
0045209A 57 push edi
0045209B 894D FC mov dword ptr [ebp-4], ecx
0045209E 8BDA mov ebx, edx
F8单步向下一直走
来到这里
00452108 897E 44 mov dword ptr [esi+44], edi
0045210B 5F pop edi
0045210C 5E pop esi
0045210D 5B pop ebx
0045210E 59 pop ecx
0045210F 5D pop ebp
00452110 C3 retn //在这里F4 F8跟进
又来到VM里面了
006AF032 68 634D1A64 push 641A4D63 ;在这里断下
006AF037 ^ E9 F7C3FFFF jmp 006AB433
006AF03C 3B59 2D cmp ebx, dword ptr [ecx+2D]
006AF03F 52 push edx
006AF040 0E push cs
再在代码段下F2断点:
00C04A6D FF32 push dword ptr [edx] ;在这里断下 EDX=00455058 (8)
00C04A6F 812C24 64103460 sub dword ptr [esp], 60341064
00C04A76 E9 9E580000 jmp 00C0A319
记下EDX的值:00455058
继续F8一次,再在代码段下F2断点:
00C4C574 FF33 push dword ptr [ebx] ;在这里断下
00C4C576 FF3424 push dword ptr [esp]
00C4C579 E9 3C920600 jmp 00CB57BA
00C4C57E 51 push ecx
程序仍然在取地址00456BDC中的值,可以不管它
继续F8一次,再在代码段下F2断点:
00453C3F E8 D0E4FFFF call 00452114 ;在这里断下,这里就OEP了,不过需要补代码
00453C44 E8 1301FBFF call 00403D5C ;从这里大家就能看出来这是Delphi 6.0 的程序吧
00453C49 8D40 00 lea eax, dword ptr [eax]
00453C4C 0000 add byte ptr [eax], al
00453C4E 0000 add byte ptr [eax], al
00453C50 0000 add byte ptr [eax], al
00453C52 0000 add byte ptr [eax], al
00453C54 0000 add byte ptr [eax], al
00453C56 0000 add byte ptr [eax], al
00453C58 0000 add byte ptr [eax], al
00453C5A 0000 add byte ptr [eax], al
00453C5C 0000 add byte ptr [eax], al
00453C5E 0000 add byte ptr [eax], al
00453C60 0000 add byte ptr [eax], al
00453C62 0000 add byte ptr [eax], al
00453C64 0000 add byte ptr [eax], al
好,找一个Delphi 6.0 的程序
push ebp
mov ebp, esp
add esp, -10
mov eax,00453A1C 上面(1)的EAX值
call 00405C60 (1)
mov eax, dword ptr [455058] (2)
mov eax, dword ptr [eax]
call 0045207C (3)
mov ecx, dword ptr [455138] (4)
mov eax, dword ptr [455058] (5)
mov eax, dword ptr [eax]
mov edx, dword ptr [453700] (6)
call 00452094 (7)
mov eax, dword ptr [455058] (8)
mov eax, dword ptr [eax]
call 00452114
call 00403D5C
lea eax, dword ptr [eax]
add byte ptr [eax], al
add byte ptr [eax], al
补代码地址如下:
00453C04 55 push ebp
00453C05 8BEC mov ebp, esp
00453C07 83C4 F0 add esp, -10
00453C0A B8 1C3A4500 mov eax, 00453A1C
00453C0F E8 4C20FBFF call 00405C60
00453C14 A1 58504500 mov eax, dword ptr [455058]
00453C19 8B00 mov eax, dword ptr [eax]
00453C1B E8 5CE4FFFF call 0045207C
00453C20 8B0D 38514500 mov ecx, dword ptr [455138] ; Project1.00456C00
00453C26 A1 58504500 mov eax, dword ptr [455058]
00453C2B 8B00 mov eax, dword ptr [eax]
00453C2D 8B15 00374500 mov edx, dword ptr [453700] ; Project1.0045374C
00453C33 E8 5CE4FFFF call 00452094
00453C38 A1 58504500 mov eax, dword ptr [455058]
00453C3D 8B00 mov eax, dword ptr [eax]
在00453C04处新建EIP 然后DUMP出来,修复都没有问题,可是运行不了,后来一跟踪才知道有VM,请教高手
是不是还需要补区段? |
评分
-
查看全部评分
|