horizon_c 发表于 2008-5-7 17:25:45

练习8(练习3的delphi版)新手重点难点解析

参考:天草中级班第十四课
   armadillo主题贴第一页4楼千里之外的贴
   三人行的五个脱壳贴
   Arm4.xx CopyMeM2 and Debug Blocker

关键字:armadillo copymem2 debugblock

内容:
练习3和练习8都是armadillo copymem2 and debug block保护。
不同的是练习3是VC++练习8是delphi。
下面是我做练习时遇到的问题:
1、为什么bp WaitForDebugEvent bp WriteProcessMemory?
答:在waitfordebugevent数据窗口看到的是引发复制eip值的调用,当断下writeprocessmemory时,父进程开始对子进程的oep进行复制所以我们刚才看到的0047E990就是子进程的OEP。

2、打补丁脱壳的记录要点:
下断点he WaitForDebugEvent,f9运行。
取消所有断点返回到壳的领空

004BBD86   .85C0          TEST EAX,EAX                //停在这里
004BBD88   .0F84 64270000 JE delphip.004BE4F2
004BBD8E   .8B85 FCFDFFFF MOV EAX,DWORD PTR SS:

右键查找所有常量FFFFFFF8。找到9个,我们双击第一个来到这里向上查找

004BC30A   > \83BD CCF5FFFF>CMP DWORD PTR SS:[EBP-A34],0
004BC311   .0F8C A8020000 JL delphip.004BC5BF
004BC317   .8B8D CCF5FFFF MOV ECX,DWORD PTR SS:
004BC31D   .3B0D 88644F00 CMP ECX,DWORD PTR DS:[4F6488]
004BC323   .0F8D 96020000 JGE delphip.004BC5BF
004BC329   .8B95 40F6FFFF MOV EDX,DWORD PTR SS:
004BC32F   .81E2 FF000000 AND EDX,0FF
004BC335   .85D2          TEST EDX,EDX
004BC337   .0F84 AD000000 JE delphip.004BC3EA
004BC33D   .6A 00         PUSH 0
004BC33F   .8BB5 CCF5FFFF MOV ESI,DWORD PTR SS:
004BC345   .C1E6 04       SHL ESI,4
004BC348   .8B85 CCF5FFFF MOV EAX,DWORD PTR SS:
004BC34E   .25 07000080   AND EAX,80000007
004BC353   .79 05         JNS SHORT delphip.004BC35A
004BC355   .48            DEC EAX
004BC356   .83C8 F8       OR EAX,FFFFFFF8                        //停在这里

找到第一个CMP的位置004BC30A,f2下断f9运行取消断点,看信息窗口。

堆栈 SS:[0012ED68]=0000007D
Jumps from 004BC14D, 004BC303
右键点击SS:=0000007D修改数据为0(如果为0不用改)

好了,现在把补丁要用到的信息记录一下:
****************************************************
x=004BC30Ay=EBP-A34=12ED68z=4F6488w=004BC5BF
****************************************************
004BC39A   .83C9 F8       or      ecx, FFFFFFF8   双击这个来到下面

004BC39A   .83C9 F8       OR ECX,FFFFFFF8
004BC39D   .41            INC ECX
004BC39E   >33D2          XOR EDX,EDX
004BC3A0   .8A91 0A3E4F00 MOV DL,BYTE PTR DS:
004BC3A6   .333C95 98F34E>XOR EDI,DWORD PTR DS:
004BC3AD   .8B85 CCF5FFFF MOV EAX,DWORD PTR SS:
004BC3B3   .99            CDQ
004BC3B4   .B9 1C000000   MOV ECX,1C
004BC3B9   .F7F9          IDIV ECX
004BC3BB   .8BCA          MOV ECX,EDX
004BC3BD   .D3EF          SHR EDI,CL
004BC3BF   .83E7 0F       AND EDI,0F
004BC3C2   .03F7          ADD ESI,EDI
004BC3C4   .8B15 6C644F00 MOV EDX,DWORD PTR DS:
004BC3CA   .8D04B2      LEA EAX,DWORD PTR DS:
004BC3CD   .50            PUSH EAX
004BC3CE   .8B8D CCF5FFFF MOV ECX,DWORD PTR SS:
004BC3D4   .51            PUSH ECX
004BC3D5   .E8 68210000   CALL delphip.004BE542
004BC3DA   .83C4 0C       ADD ESP,0C
004BC3DD   .25 FF000000   AND EAX,0FF                //这里打补丁

inc dword ptr ds:   
mov dword ptr ds:,1
jmp x
把字母替换成记录中的值然后写入
inc dword ptr ds:   
mov dword ptr ds:,1
jmp 004BC30A
处理完后来到w记录的地址004BC5BF,也可以回到刚开始的位置004BC30A,跟随下一行绿色的跳转线找到这行。
取消前面所有的断点在这里下断,运行后来到这里。打开lordpe选择第二个进程脱壳。

3、VC++和DELPHI程序IAT特征代码有为什么不同?
答:VC++十六进制代码是FF 15 反汇编代码是 CALL DWORD PTR DS:
   DELPHI十六进制代码是FF 25反汇编代码是jmp dword ptr ds:

4、RAV及大小如何计算?
答:rav=IAT首地址-PE头基址(eg:rav=00482118-00400000=82118)
    大小=IAT末地址-IAT首地址

5、为什么在双转单时新建EIP后运行报错?
答:黑鹰给的二进制代码问题,复制call kernel32.CreateMutexA 和jmp KERNEL32.OpenMutexA。

6、为什么在XP SP2上断不下来?
答:XP SP2 API函数调用上的问题。

7、为什么修复后的文件运行提示0x0047e990指令引用的0x0047e990内存。该内存不能为"written"。
答:在用来修复的子进程OD中查看内存你会发现OEP所在区段的权限是不可写入的,手动设置权限后再用import REC修复解决。

8、为什么OD的地址不是连续的?
答:因为这是一位一条指令不止是一个字节。
01058000    60            PUSHAD
01058001    E8 00000000   CALL sol.01058006
01058006    5D            POP EBP
如:01058001是E8那么01058002就是00

[ 本帖最后由 horizon_c 于 2008-5-7 19:05 编辑 ]

yunfeng 发表于 2008-5-21 14:02:24

这几天学习脱Armadillo壳收获很多,这是我脱第四个练习壳脱壳并优化了一下。

tlcysb 发表于 2008-6-14 09:24:10

原帖由 horizon_c 于 2008-5-7 17:25 发表 https://www.chinapyg.com/images/common/back.gif
参考:天草中级班第十四课
   armadillo主题贴第一页4楼千里之外的贴
   三人行的五个脱壳贴
   Arm4.xx CopyMeM2 and Debug Blocker

关键字:armadillo copymem2 debugblock

内容:
练习3和练习8都 ...
学习了,谢谢!

寂寞的季节 发表于 2008-6-14 23:00:24

整理文章就是一个好的习惯.我要是斑斑就给你加个精华了
页: [1]
查看完整版本: 练习8(练习3的delphi版)新手重点难点解析