首页
社区
课程
招聘
[原创]一个菜鸟看ZPROTECT普通函数加密
2008-6-8 23:25 17213

[原创]一个菜鸟看ZPROTECT普通函数加密

2008-6-8 23:25
17213
已经有脚本出来了 汗

大家好,我是lunglungyu
用DEMO版加的 强度比较低 只是说说自己的思路________________________________
搞了下簡單ZPROTECT脱壳 找回 己加密输入表 (低强度)
其他選項去掉 方便我菜鸟搞

只GETMODULEHANDLEA 加密
文章写的不好 别见怪

0040DACB yh_pac>^\E9 4BFBFFFF          jmp 0040D61B                               ; yh_packe.0040D61B
0040DAD0        ^ 0F85 76FBFFFF        jnz 0040D64C                               ; yh_packe.0040D64C
0040DAD6          E9 BA010000          jmp 0040DC95                               ; yh_packe.0040DC95
0040DADB          8BF7                 mov esi,edi                                ; ntdll.7C930738
0040DADD        ^ E9 A7FDFFFF          jmp 0040D889                               ; yh_packe.0040D889
0040DAE2          C9                   leave
0040DAE3          06                   push es
0040DAE4        ^ 0F84 A2FEFFFF        je 0040D98C                                ; yh_packe.0040D98C
0040DAEA          E9 D7000000          jmp 0040DBC6                               ; yh_packe.0040DBC6
0040DAEF          C2 0400              retn 4
0040DAF2        ^ E9 0FFDFFFF          jmp 0040D806                               ; yh_packe.0040D806
0040DAF7          894424 10            mov dword ptr ss:[esp+10],eax
0040DAFB        ^ E9 20FDFFFF          jmp 0040D820                               ; yh_packe.0040D820
0040DB00          4E                   dec esi

开始的EP是如上这样的
F8 下
0040D61B          E8 01000000          call 0040D621                              ; yh_packe.0040D621
看见上面的CALL,跟(F7)
F8 4下
看见PUSHAD
用ESP定律
hr esp
F9 运行
断下后去掉硬件断点
F8到RETN
便是OEP
这个是其他文件記载的 @@
------------------------------------
sto
sti
sto
sto
sto
sto
sto
BPHWS esp,"r"
run

bc esp
sto
sto
msg "reach oep"

ret
-----------------------------
就是这角本 到oep
偶写的不好 也加不上IAT修复

00402317          6A 00                push 0
00402319          E8 F2000000          call 00402410                              ; yh_packe.00402410
0040231E          A3 24404000          mov dword ptr ds:[404024],eax
00402323          6A 00                push 0
00402325          68 75224000          push 402275
0040232A          6A 00                push 0
0040232C          68 E8030000          push 3E8
00402331          FF35 24404000        push dword ptr ds:[404024]
00402337          E8 26000000          call 00402362                              ; jmp 到 USER32.DialogBoxParamA
0040233C          50                   push eax
0040233D          E8 B6000000          call 004023F8                              ; jmp 到 kernel32.ExitProcess
00402342          C3                   retn
00402343          CC                   int3
00402344        - FF25 EC304000        jmp dword ptr ds:[4030EC]                  ; USER32.wsprintfA
0040234A        - FF25 E8304000        jmp dword ptr ds:[4030E8]                  ; USER32.AppendMenuA
00402350        - FF25 E4304000        jmp dword ptr ds:[4030E4]                  ; USER32.CallWindowProcA
00402356        - FF25 E0304000        jmp dword ptr ds:[4030E0]                  ; USER32.CloseClipboard
0040235C        - FF25 DC304000        jmp dword ptr ds:[4030DC]                  ; USER32.CreatePopupMenu
00402362        - FF25 D8304000        jmp dword ptr ds:[4030D8]                  ; USER32.DialogBoxParamA
00402368        - FF25 D4304000        jmp dword ptr ds:[4030D4]                  ; USER32.EnableWindow
0040236E        - FF25 D0304000        jmp dword ptr ds:[4030D0]                  ; USER32.EndDialog
00402374        - FF25 CC304000        jmp dword ptr ds:[4030CC]                  ; USER32.EnumChildWindows
0040237A        - FF25 C8304000        jmp dword ptr ds:[4030C8]                  ; USER32.GetAsyncKeyState
00402380        - FF25 C4304000        jmp dword ptr ds:[4030C4]                  ; USER32.GetClassNameA
00402386        - FF25 C0304000        jmp dword ptr ds:[4030C0]                  ; USER32.GetClipboardData
0040238C        - FF25 BC304000        jmp dword ptr ds:[4030BC]                  ; USER32.GetDlgItem
00402392        - FF25 B8304000        jmp dword ptr ds:[4030B8]                  ; USER32.GetWindowLongA
00402398        - FF25 B4304000        jmp dword ptr ds:[4030B4]                  ; USER32.GetWindowRect
0040239E        - FF25 B0304000        jmp dword ptr ds:[4030B0]                  ; USER32.GetWindowTextA
004023A4        - FF25 AC304000        jmp dword ptr ds:[4030AC]                  ; USER32.IsClipboardFormatAvailable
004023AA        - FF25 A8304000        jmp dword ptr ds:[4030A8]                  ; USER32.LoadIconA
004023B0        - FF25 A4304000        jmp dword ptr ds:[4030A4]                  ; USER32.MessageBoxA
004023B6        - FF25 A0304000        jmp dword ptr ds:[4030A0]                  ; USER32.MoveWindow
004023BC        - FF25 9C304000        jmp dword ptr ds:[40309C]                  ; USER32.OpenClipboard
004023C2        - FF25 98304000        jmp dword ptr ds:[403098]                  ; USER32.ScreenToClient
004023C8        - FF25 94304000        jmp dword ptr ds:[403094]                  ; USER32.SendDlgItemMessageA
004023CE        - FF25 90304000        jmp dword ptr ds:[403090]                  ; USER32.SendMessageA
004023D4        - FF25 8C304000        jmp dword ptr ds:[40308C]                  ; USER32.SetWindowLongA
004023DA        - FF25 88304000        jmp dword ptr ds:[403088]                  ; USER32.SetWindowTextA
004023E0        - FF25 84304000        jmp dword ptr ds:[403084]                  ; USER32.TrackPopupMenu
004023E6        - FF25 6C304000        jmp dword ptr ds:[40306C]                  ; kernel32.CloseHandle
004023EC        - FF25 70304000        jmp dword ptr ds:[403070]                  ; kernel32.CreateFileA
004023F2        - FF25 28304000        jmp dword ptr ds:[403028]                  ; kernel32.DeviceIoControl
004023F8        - FF25 2C304000        jmp dword ptr ds:[40302C]                  ; kernel32.ExitProcess
004023FE        - FF25 74304000        jmp dword ptr ds:[403074]                  ; kernel32.FormatMessageA
00402404        - FF25 68304000        jmp dword ptr ds:[403068]                  ; kernel32.GetCurrentDirectoryA
0040240A        - FF25 64304000        jmp dword ptr ds:[403064]                  ; ntdll.RtlGetLastWin32Error
00402410        - FF25 60304000        jmp dword ptr ds:[403060]
00402416        - FF25 5C304000        jmp dword ptr ds:[40305C]                  ; kernel32.GetProcAddress
0040241C        - FF25 58304000        jmp dword ptr ds:[403058]                  ; kernel32.GetProcessHeap
00402422        - FF25 54304000        jmp dword ptr ds:[403054]                  ; kernel32.GetVersion
00402428        - FF25 50304000        jmp dword ptr ds:[403050]                  ; kernel32.GlobalLock
0040242E        - FF25 4C304000        jmp dword ptr ds:[40304C]                  ; kernel32.GlobalUnlock
00402434        - FF25 48304000        jmp dword ptr ds:[403048]                  ; ntdll.RtlAllocateHeap
0040243A        - FF25 44304000        jmp dword ptr ds:[403044]                  ; ntdll.RtlFreeHeap
00402440        - FF25 40304000        jmp dword ptr ds:[403040]                  ; ntdll.RtlZeroMemory
00402446        - FF25 3C304000        jmp dword ptr ds:[40303C]                  ; kernel32.SetCurrentDirectoryA
0040244C        - FF25 38304000        jmp dword ptr ds:[403038]                  ; kernel32.lstrcmpiA
00402452        - FF25 34304000        jmp dword ptr ds:[403034]                  ; kernel32.lstrcpyA
00402458        - FF25 30304000        jmp dword ptr ds:[403030]                  ; kernel32.lstrlenA
0040245E        - FF25 14304000        jmp dword ptr ds:[403014]                  ; ADVAPI32.CloseServiceHandle
00402464        - FF25 04304000        jmp dword ptr ds:[403004]                  ; ADVAPI32.ControlService
0040246A        - FF25 08304000        jmp dword ptr ds:[403008]                  ; ADVAPI32.CreateServiceA
00402470        - FF25 0C304000        jmp dword ptr ds:[40300C]                  ; ADVAPI32.DeleteService
00402476        - FF25 18304000        jmp dword ptr ds:[403018]                  ; ADVAPI32.OpenSCManagerA
0040247C        - FF25 00304000        jmp dword ptr ds:[403000]                  ; ADVAPI32.OpenServiceA
00402482        - FF25 10304000        jmp dword ptr ds:[403010]                  ; ADVAPI32.StartServiceA
00402488        - FF25 20304000        jmp dword ptr ds:[403020]                  ; comdlg32.GetOpenFileNameA
0040248E        - FF25 7C304000        jmp dword ptr ds:[40307C]                  ; SHELL32.DragQueryFileA
00402494          0000                 add byte ptr ds:[eax],al
00402496          0000                 add byte ptr ds:[eax],al

好 。看见了

这里注意下
我给加密的部分
00402410        - FF25 60304000        jmp dword ptr ds:[403060]
因为上面有调用
要PROGRAM运行一定要修复好 所以用GETMODULEHANDLEA这个 . 而不是那些运行到特定时候才调用的

跟进
call 00402410
就是给加密的GETMODULEHANDLEA

00EC0000          50                   push eax
00EC0001          60                   pushad
00EC0002          68 92D455AA          push AA55D492
00EC0007          E8 9404ECFF          call 00D804A0
00EC000C          61                   popad
00EC000D          C3                   retn

call 00D804A0 这句是重点 我们进去
里面一堆JMP 混淆

先探口风
00D9E8AB          8B0CB1               mov ecx,dword ptr ds:[ecx+esi*4]           ; kernel32.GetModuleHandleA

这句 由OD的分析看见了是 getmodulehandleA
ds:[00DA42AC]=7C80B6A1 (kernel32.GetModuleHandleA)
ecx=00DA4250
其实这里可以直接把它的位址放到ptr ds:[403060]
便弄成修复 。。但是这是最简单的
我们看看他是如何搞出这地址的

mov ecx,dword ptr ds:[ecx+esi*4]

换言之 我们要知道D9E8AB时(在我的电脑上)的ECX 和ESI 哪里来的
Ctrl + F2 重载 在重复STEPS  到00EC0007          E8 9404ECFF          call 00D804A0这CALL
留意堆棧的变化

我略過了当中那些混淆的JMP

因此代码不是跟次序的
從程序執行的先後
mov eax,dword ptr ss:[esp+4] 当时的ESP 12FF90
Eax 变成AA55D492
push esi
FFFFFFFF
push eax
刚才的AA55D492 進棧了

后来有一个CALL
call dword ptr ds:[D8C514]
我们先跳过
但注意堆棧變化

EAX AA55D492
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD5000
ESP 0012FF88
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00D9B19F


EAX 00000017
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD5000
ESP 0012FF8C
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00D9B1A5

EIP ESP变化是正常的
经历这CALL
eax 变了
看回头  是中间
mov eax,dword ptr ss:[esp+24]
sub eax,17B415D1
xor eax,24DB7550
xchg edx,esi
lea eax,dword ptr ds:[eax+F792273]
等等
作的

这里我们不理
我们看见
00D94C12          8B0D 28CCD800        mov ecx,dword ptr ds:[D8CC28]
是ECX !!!!
ecx 变了00DA4250
test ecx,ecx

mov esi,eax 原来这里ESI跟EAX有关
EAX 经过运算的值搬到了ESI
mov eax,dword ptr ds:[D8CC2C]
sub eax,ecx
sar eax,2
cmp esi,eax

最后 我们又到了mov ecx,dword ptr ds:[ecx+esi*4]
ds:[00DA42AC]=7C80B6A1 (kernel32.GetModuleHandleA)

因为偶ASSEMBLY 不好
所以 中间不能说个明白
就是zprotect 加壳是 把API 的位址拆解  然后用算法湊合回來
当中主要用到EAX 运算
然后最后再把不同的需要值放到ECX 和ESI 算回API 位址

在来
mov dword ptr ss:[esp+2C],ecx  这里是吧GETMODULEHANDLEA这个的地址 记录
POP ESI 恢复FFFFFFFF原來的值
return出CALL 
在return
就到了GETMODULEHANDLE的地址。
API執行後回到程序代碼段 大概就是这样
就是由EP附近的
mov dword ptr ds:[404024],eax繼續執行下去
每個都是这样.
这就是zprotect 导入函数加密選項 中 普通加密的部分

下面我们在来写清楚一下

其实

当我们到达OEP时

00402317          6A 00                push 0
00402319          E8 F2000000          call 00402410                    

          ; yh_packe.00402410
这个就是跳往加密API 的
即00402410        - FF25 60304000        jmp dword ptr ds:[403060]

因为我只加密这个 所以 很容易改回
跟进去
00EC0000          50                   push eax
00EC0001          60                   pushad
00EC0002          68 92D455AA          push AA55D492
00EC0007          E8 9404ECFF          call 00D804A0
00EC000C          61                   popad
00EC000D          C3                   retn
00EC000E          0000                 add byte ptr ds:[eax],al

可以知道call 00D804A0后API会给弹进堆棧
/在FPU中
F4到00EC000C          61                   popad
其实已经可以看见给加密的函数
EAX 00000037
ECX 7C80B6A1 kernel32.GetModuleHandleA 就是这里
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD9000
ESP 0012FF98
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 00EC000C

或是。在
0012FF98   7C930738  8..|  ntdll.7C930738
0012FF9C   FFFFFFFF  ....
0012FFA0   0012FFF0  ....
0012FFA4   0012FFB8  ....
0012FFA8   7FFD9000  ....
0012FFAC   7C92EB94  ...|  ntdll.KiFastSystemCallRet
0012FFB0   0012FFB0  ....
0012FFB4   00000000  ....
0012FFB8   7C80B6A1  ...|  kernel32.GetModuleHandleA
0012FFBC   0040231E  .#@.  返回到 yh_packe.0040231E 来自

yh_packe.00402410
0012FFC0   00000000  ....
0012FFC4   7C816FD7  .o.|  返回到 kernel32.7C816FD7
0012FFC8   7C930738  8..|  ntdll.7C930738
0012FFCC   FFFFFFFF  ....
0012FFD0   7FFD9000  ....
0012FFD4   80873B38  8;..
0012FFD8   0012FFC8  ....
0012FFDC   82793528  (5y.
0012FFE0   FFFFFFFF  ....  SEH 链尾部
0012FFE4   7C839AA8  ...|  SE 处理器
也可以看见
但我不会写角本 恢复IAT..汗
我们再F8一下
就会由OD的分析看见 RETN 会到GETMODULEHANDLEA 了
執行後 就会返回程序的原本流程

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (31)
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-8 23:36
2
0
写的太烂。

升中四很要緊。有一陣子不能上

修复就是吧 jmp dword ptr ds:[403060] 的改成7C80B6A1 即getmodulthandleA 地址
DUMP 哦

ok
可以优化下
这里不说了

放上没壳,加好 ,脱了 ,跟 优化的文件
上传的附件:
雪    币: 28404
活跃值: (6821)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 19 2008-6-8 23:41
3
0
学习一下。。。
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-9 11:58
4
0
这次 。我们来看看ZPROTECT的加密调用代码 一項
我们先在加密导入表設置中去掉所有加密 (就是把所有函数加密改为不加密)

选上加密调用代码
再次加壳
看看是怎么回事
对比下两者

未加壳
00402317 yh.<模块>  6A 00                push 0
00402319          E8 F2000000          call 00402410                              ; <jmp.&kernel32.GetModuleHandleA>
0040231E          A3 24404000          mov dword ptr ds:[404024],eax
00402323          6A 00                push 0
00402325          68 75224000          push 402275
0040232A          6A 00                push 0
0040232C          68 E8030000          push 3E8
00402331          FF35 24404000        push dword ptr ds:[404024]
00402337          E8 26000000          call 00402362                              ; <jmp.&user32.DialogBoxParamA>
0040233C          50                   push eax
0040233D          E8 B6000000          call 004023F8                              ; <jmp.&kernel32.ExitProcess>
00402342          C3                   retn
00402343          CC                   int3
00402344        - FF25 EC304000        jmp dword ptr ds:[4030EC]                  ; USER32.wsprintfA
0040234A        - FF25 E8304000        jmp dword ptr ds:[4030E8]                  ; USER32.AppendMenuA
00402350        - FF25 E4304000        jmp dword ptr ds:[4030E4]                  ; USER32.CallWindowProcA
00402356        - FF25 E0304000        jmp dword ptr ds:[4030E0]                  ; USER32.CloseClipboard
0040235C        - FF25 DC304000        jmp dword ptr ds:[4030DC]                  ; USER32.CreatePopupMenu

加了壳的
00402317          6A 00                push 0
00402319          E8 F2000000          call 00402410                              ; yh_packe.00402410
0040231E          A3 24404000          mov dword ptr ds:[404024],eax
00402323          6A 00                push 0
00402325          68 75224000          push 402275
0040232A          6A 00                push 0
0040232C          68 E8030000          push 3E8
00402331          FF35 24404000        push dword ptr ds:[404024]
00402337          E8 26000000          call 00402362                              ; yh_packe.00402362
0040233C          50                   push eax
0040233D          E8 B6000000          call 004023F8                              ; yh_packe.004023F8
00402342          C3                   retn
00402343          CC                   int3
00402344        - E9 4BBF0000          jmp 0040E294                               ; yh_packe.0040E294
00402349          90                   nop
0040234A        - E9 C9BC0000          jmp 0040E018                               ; yh_packe.0040E018
0040234F          90                   nop
00402350        - E9 A3BE0000          jmp 0040E1F8                               ; yh_packe.0040E1F8
00402355          90                   nop
00402356        - E9 41BD0000          jmp 0040E09C                               ; yh_packe.0040E09C
0040235B          90                   nop
0040235C        - E9 A3BE0000          jmp 0040E204                               ; yh_packe.0040E204
00402361          90                   nop

很明显就是把
FF25 加指針位置的地方改成一个JUMP 把多余的地方NOP掉

进CALL
0040E258          68 A7B93C15          push 153CB9A7
0040E25D        ^ E9 52FEFFFF          jmp 0040E0B4                               ; yh_packe.0040E0B4
0040E262          D310                 rcl dword ptr ds:[eax],cl
0040E264          68 8BB93C15          push 153CB98B
0040E269        ^ E9 46FEFFFF          jmp 0040E0B4                               ; yh_packe.0040E0B4
0040E26E          E6 57                out 57,al
0040E270          68 B4B93C15          push 153CB9B4
0040E275        ^ E9 3AFEFFFF          jmp 0040E0B4                               ; yh_packe.0040E0B4
0040E27A          1968 68              sbb dword ptr ds:[eax+68],ebp
0040E27D          8EB9 3C15E92E        mov seg?,word ptr ds:[ecx+2EE9153C]        ; 未定义的段寄存器
0040E283          FE                   ???                                        ; 未知命令
0040E284          FFFF                 ???                                        ; 未知命令

怎么不一样?!
F8一下 发现了CALL
00D80BA0         /E9 98FC0000          jmp 00D9083D
00D80BA5         |CC                   int3
00D80BA6         |CC                   int3
00D80BA7         |CC                   int3

是把解密的部分放在壳申請的区段进行。对比上一篇  这里是一样的 跟进去
00D9083D          60                   pushad
00D9083E          E9 9D3B0000          jmp 00D943E0
00D90843          238B 1D28C6D8        and ecx,dword ptr ds:[ebx+D8C6281D]
00D90849          00E9                 add cl,ch
00D9084B          19B7 0000F205        sbb dword ptr ds:[edi+5F20000],esi
00D90851          6B8F 5DE9CFC6 00     imul ecx,dword ptr ds:[edi+C6CFE95D],0

进去以后 以PUSHAD 开头
ESP定律能恢复好,跳到该函数的地方
F8 后 hr esp

F9到了POPAD 和一个JUMP  JUMP下去
发现了RETN 要到的地方 正是加密的getmodulehandleA
壳本身已经处理好代码

这时我们可以回到给加密出

00402410        - E9 43BE0000          jmp 0040E258                               ; yh_packe.0040E258
00402415          90                   nop
改回
FF25  XXXXXXXXX

得找回那ptr [XXXXXX]的位址
已经找到函数了 就易辦了.

d 401000 代码段
7C80B6A1
记住要從低至高位A1 B6 80 7C
search 二進制字串
找到是403060就OK了
我们把

00402410        - E9 43BE0000          jmp 0040E258                               ; yh_packe.0040E258
00402415          90                   nop
改回
00402410        - FF25 60304000        jmp dword ptr ds:[403060]                  ; kernel32.GetModuleHandleA

就成了
其实绝对可以写角本完成

強化加密和这也差不多
跟跟就知道

有很多特征码可以搜索。。

现在角本都出来了

主要我自己用比较笨的方法
exec +ende写角本。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liqunsheng 2008-6-9 14:11
5
0
楼主这么多精华??
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
q3 watcher 2008-6-9 14:49
6
0
存个档,膜拜强大的LZ
上传的附件:
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-9 14:50
7
0
是BUG 吧?!
查了下
FFFFFFFF ->4294967295?
BUG已经给报告了
应该很快会正常
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
baby2008 28 2008-6-9 14:51
8
0
膜拜

lunglungyu

初级会员

资 料:
注册日期: Jan 2008
帖子: 81
精华: 4294967295
声望: 10
雪    币: 702
活跃值: (327)
能力值: (RANK:380 )
在线值:
发帖
回帖
粉丝
kvllz 8 2008-6-9 15:02
9
0
精华数目很强大 好几个群都发了 过来望望
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2008-6-9 15:27
10
0
过来留个念!
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
petnt 12 2008-6-9 15:39
11
0
拍照,合影,留念
雪    币: 623
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
啊CR 3 2008-6-9 15:39
12
0
截图留念
上传的附件:
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-9 15:44
13
0
整理了一份  除去所有混亂jmp外的 壳用来恢复API位址+執行的代碼
调试带很多花
体力活

这里只是看一下格式

进CALL前

EAX 00000000
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFDE000
ESP 0012FFBC
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 0040E258 yh_packe.0040E258

push 153CB9A7
pushad
push dword ptr ss:[esp+20]          ZPROTECT 利用了ESP協助加密
call 00D94483 - 以下开始是CALL 中的
xchg dword ptr ss:[esp],edx              ptr 疊ptr
lea edx,dword ptr ds:[edx+4138]
xchg dword ptr ss:[esp],edx      
mov eax,dword ptr ds:[D8C628]      交换回
cmp byte ptr ds:[eax+17E],0          以上代码 每次加密大多格式一样/但FPU 和數值不同
je 00D8F8D2                                    以下的每次加密动态生成 利用这一堆带码算出api地址
-------------------------------------------------------------------
mov eax,dword ptr ss:[esp+4]   
push esi
push eax
call dword ptr ds:[D8C514] call中
pushad                                开始动作?!
mov edx,dword ptr ss:[esp+24]
xchg ebp,esi
mov esi,esi
xchg esi,esi
neg edx
neg edx
xchg eax,ebp
xor edx,56AB3560         这些数据更加不同
mov eax,6EA50155
push ecx
pop ebp
mov ebp,26841A9
mov ebp,ecx
push edx
pop edi
add edi,427D094C
neg edi
xor edi,79EB69E2
xchg edx,eax
mov esi,edi
mov ebx,esi
mov edi,115E6AAB
mov esi,ecx
mov dword ptr ss:[esp+1C],ebx
popad
retn 4
mov ecx,dword ptr ds:[D8CC28]
test ecx,ecx
mov esi,eax
je 00D992C1 这里不跳
jmp 00D91DA4
mov eax,dword ptr ds:[D8CC2C]
sub eax,ecx
sar eax,2
cmp esi,eax
jb 00D94F31 跳

这时

EAX 00000037
ECX 00DA4258
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFDE000
ESP 0012FF8C
EBP 0012FFF0
ESI 0000000F
EDI 7C930738 ntdll.7C930738
EIP 00D94F31

mov ecx,dword ptr ds:[ecx+esi*4]       这时ds:[00DA4294]=7C80B6A1 (kernel32.GetModuleHandleA)

ecx是该API地址

后部处理 (过渡到API的所以是一样的)
mov dword ptr ss:[esp+2C],ecx
pop esi
retn 4
popad                      堆棧平衡
retn                          RETN 到API

之后会到正常流程
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
壹只老虎 7 2008-6-9 16:07
14
0
签名留恋@~~~~~
雪    币: 1382
活跃值: (723)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hmilywen 2008-6-11 21:33
15
0
强烈学习!!!!!!!!!
雪    币: 191
活跃值: (335)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
RegKiller 10 2008-6-11 21:55
16
0
支持一下。楼主辛苦了。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
山上红塔 2008-6-14 04:09
17
0
只看懂一点点
雪    币: 217
活跃值: (68)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
千里之外 5 2008-6-14 15:52
18
0
支持下楼主 留个名 ZP现在比较流行
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
clerkie 2008-6-16 17:29
19
0
  楼主还看这贴吗?我也碰上了一个用ZP的软件,它的加密貌似比较强,我按楼主说的到PushAD后,用ESP定律来给它下硬件断点,但是断不下来,不知道楼主是不是做了特殊的设置才能断下来???
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-16 18:58
20
0
如果需要注册的話 程序运行前会先经过壳的流程 确定注册后才会返回
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乱无休 2008-6-16 19:06
21
0
我想学习 这个 但不知道怎么学 有那位高手 告诉一下
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fulee 2008-6-17 10:13
22
0
楼主是强人一个!!
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
要学会编 2008-6-17 20:46
23
0
中四是什么? 中学4年级?
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lunglungyu 1 2008-6-17 21:20
24
0
就是中学第四年的意思
应该是高1的吧
悄悄地灌水
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
随行 2008-6-27 22:21
25
0
看不懂!不过支持一下。
游客
登录 | 注册 方可回帖
返回