首页
论坛
课程
招聘
[原创]PEQueKe0.06花指令壳学习笔记[这壳太猛了]
2011-6-16 12:20 14692

[原创]PEQueKe0.06花指令壳学习笔记[这壳太猛了]

2011-6-16 12:20
14692
这壳好像是一猛壳!
这个壳成功的运用了花指令生成引擎,小弟最终还是没能分析出OEP出来,我就给大家看下学习记录算了。
我分析到得保护技术:花指令,内存访问异常,花指令用的好成熟,好像还有调用堆栈执行代码异常终止。
花指令在于实践,所以大家一定要拿着OD弄一下,
程序以一个CALL 004050AA开始,然后就进行自定位,
004050AA    5D              POP EBP             CALL会压入下条指令的地址保存,以便返回
004050AB    81ED 05000000   SUB EBP,5           定位到程序代码的开始处,以便控制外壳段

接下来就是加载外壳段储存的Kernel32.dll,然后装载,获得VirtualAlloc的地址,再调用VirtualAlloc分配指定大小的内存,用来接收解码后的外壳段代码
004050B1    8D75 3D         LEA ESI,DWORD PTR SS:[EBP+3D]   ; "Kernel32.dll"
004050B4    56              PUSH ESI                        ; Kernel32.dll的偏移地址
004050B5    FF55 31         CALL DWORD PTR SS:[EBP+31]      ; GetModuleHandleA,获得模块基址
004050B8    8DB5 81000000   LEA ESI,DWORD PTR SS:[EBP+81]   ; “VirtualAlloc”
004050BE    56              PUSH ESI                        ; VirtualAlloc的偏移地址
004050BF    50              PUSH EAX                        ; Kernel32.dll的模块基址
004050C0    FF55 2D         CALL DWORD PTR SS:[EBP+2D]      ; GetProcAddress获得函数地址
004050C3    8985 8E000000   MOV DWORD PTR SS:[EBP+8E],EAX   ; VirtualAlloc函数地址保存的地方
004050C9    6A 04           PUSH 4                          ; 保护方式PAGE_READWRITE
004050CB    68 00100000     PUSH 1000                       ; 分配的类型MEM_COMMIT
004050D0    68 28900000     PUSH 9028                       ; 分配的大小
004050D5    6A 00           PUSH 0                          ; 分配大小的起始位置,用来计算
004050D7    FF95 8E000000   CALL DWORD PTR SS:[EBP+8E]      ; CALL VirtualAlloc

分配好虚拟内存后,然后解密外壳段代码拷贝到分配的内存里面,这个过程中随机生成花指令,然后在JMP跳到分配的内存里面去,执行代码
004050DD    50              PUSH EAX                        ; 虚拟内存的地址
004050DE    8B9D 7D000000   MOV EBX,DWORD PTR SS:[EBP+7D]   ; 要解码的偏移,19C
004050E4    03DD            ADD EBX,EBP                     ; 加上程序开始的地址00405000就是0040519C这个地方了
004050E6    50              PUSH EAX                        ; 分配内存的虚拟地址,参数2
004050E7    53              PUSH EBX                        ; 原来的位置,参数一
004050E8    E8 04000000     CALL PECompac.004050F1          ; CALL 解码拷贝
004050ED    5A              POP EDX                         ; 恢复虚拟地址的地址,也就是MOV前面那个push eax
004050EE    55              PUSH EBP                        ; 外壳代码基址
004050EF    FFE2            JMP EDX                         ; JMP虚拟内存
现在开始解密后的内容,这段代码好多花指令,大家要注意:
003D0000   /EB 01           JMP SHORT 003D0003    ; 跳到3D0003
003D0002   |90              NOP                   ; 这里的OF生成的花指令,原指令是RDTSC,我们右键二进制编辑把0x0F NOP掉,保留0x31操作码
003D0003    31F0            XOR EAX,ESI           ; 分配内存大小和储存字符串VirtualAlloc的地址异或
003D0005    EB 0C           JMP SHORT 003D0013    ;跳到下面PUSH ECX那里
003D0007    33C8            XOR ECX,EAX           ;ECX和EAX异或
003D0009    EB 03           JMP SHORT 003D000E    ;跳到花指令,我现在把花指令操作码0x0F NOP掉了,
003D000B    EB 09           JMP SHORT 003D0016     跳到下面XOR EAX,ESI那里,那里原来也是花指令
003D000D    90              NOP                    原来的指令是,003D000D  0F 59 74 05 MULPS XMM6,DQWORD PTR SS:[EBP+EAX+75],把操作码0x0F改为90
003D000E    59              POP ECX                恢复ECX的值
003D000F    74 05           JE SHORT 003D0016      ZF等于1就跳
003D0011  ^ 75 F8           JNZ SHORT 003D000B     ZF等于0就向上跳
003D0013    51              PUSH ECX
003D0014  ^ EB F1           JMP SHORT 003D0007     ;跳到XOR ECX,EAX那里
003D0016    EB 01           JMP SHORT 003D0019
003D0018    90              NOP                     同上,0x0F改为90
003D0019    31F0            XOR EAX,ESI             EAX和ESI异或
003D001B    EB 0C           JMP SHORT 003D0029      跳到下面PUSH ECX那里
003D001D    33C8            XOR ECX,EAX             异或
003D001F    EB 03           JMP SHORT 003D0024      跳到花指令,我们把0x0F改为90
003D0021    EB 09           JMP SHORT 003D002C      跳到XOR ESI,ESI那里ESI,清零
003D0023    90              NOP
003D0024    59              POP ECX                 恢复ECX的值
003D0025    74 05           JE SHORT 003D002C       ZF等于1就跳
003D0027  ^ 75 F8           JNZ SHORT 003D0021      ZF是0就向上跳转,跳到NOP上面那里
003D0029    51              PUSH ECX                保存ECX的值
003D002A  ^ EB F1           JMP SHORT 003D001D      跳到上面XOR ECX,EAX那里
003D002C    33F6            XOR ESI,ESI             ESI清零
003D002E    E8 10000000     CALL 003D0043

现在开始学习大量的花指令了:
指令:
003D002C    33F6            XOR ESI,ESI
003D002E    E8 10000000     CALL 003D0043
{
    003D0041    C783 64FF3500 0>MOV DWORD PTR DS:[EBX+35FF64],64000000
    003D004B    8925 00000000   MOV DWORD PTR DS:[0],ESP
    003D0051    AD              LODS DWORD PTR DS:[ESI]
}
修改后的代码:
003D0041    90              NOP
003D0042    90              NOP
003D0043    64:FF35 0000000>PUSH DWORD PTR FS:[0]
003D004A    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
003D0051    AD              LODS DWORD PTR DS:[ESI]
003D0052    CD 20           INT 20         反跟踪代码
指令:
003D0054    68 9F6F56B6     PUSH B6566F9F
003D0059    50              PUSH EAX
003D005A    E8 5D000000     CALL 003D00BC
{
    003D00BC    58              POP EAX
    003D00BD    EB FF           JMP SHORT 003D00BE
}
修改后:
003D00BC    58              POP EAX
003D00BD    90              NOP
003D00BE    FFF0            PUSH EAX
003D00C0    EB FF           JMP SHORT 003D00C1
指令:
003D00C0   /EB FF           JMP SHORT 003D00C1
003D00C2    C083 E8FDEBFF 3>ROL BYTE PTR DS:[EBX+FFEBFDE8],30            ; 移位常量超出 1..31 的范围
003D00C9    E8 C9000000     CALL 003D0197                             //受到前面指令的影响了
修改后:
003D00C0    90              NOP
003D00C1    FFC0            INC EAX
003D00C3    83E8 FD         SUB EAX,-3
003D00C6    EB FF           JMP SHORT 003D00C7                    大家看出来没,双花指令
003D00C8    30E8            XOR AL,CH
修改后:
003D00C6    90              NOP
003D00C7    FF30            PUSH DWORD PTR DS:[EAX]
代码
003D00C7    FF30            PUSH DWORD PTR DS:[EAX]
003D00C9    E8 C9000000     CALL 003D0197
{
    003D0196  ^\EB 83           JMP SHORT 003D011B                           花指令
    003D0198    C017 EB         RCL BYTE PTR DS:[EDI],0EB                    ; 移位常量超出 1..31 的范
}
003D0196    90              NOP
003D0197    83C0 17         ADD EAX,17       修改后
花指令:
003D019A   /EB FF           JMP SHORT 003D019B          花
003D019C  ^ 70 ED           JO SHORT 003D018B
修改后:
003D019A    90              NOP
003D019B    FF70 ED         PUSH DWORD PTR DS:[EAX-13]
这个地方这里比较厉害,咋改都不对:
003D0081   /75 09           JNZ SHORT 003D008C
003D0083   |81F3 EBFF52BA   XOR EBX,BA52FFEB
003D0089   |0100            ADD DWORD PTR DS:[EAX],EAX
003D008B   |83EB FC         SUB EBX,-4
003D008E    4A              DEC EDX
003D008F    FF71 0F         PUSH DWORD PTR DS:[ECX+F]
哪位高人解释一下

后面这样的代码还很多,现在总结一下心得:
当我们遇到的花指令比较多的时候,一定要按代码执行流程修改,不然看见一个就修改一个得话,会弄乱代码的

【看雪培训】《Adroid高级研修班》2022年夏季班招生中!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (19)
雪    币: 106
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
NiGHter 活跃值 2011-6-16 13:11
2
0
这壳是几年前的forgot发的那个吗,貌似看过.
花指令和堆栈执行代码,还有几处反调试,好像jmp eip就在这壳里吧.
这个壳代码不多,耐心点,还是可以单步跟过去的
雪    币: 527
活跃值: 活跃值 (86)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
Mx¢Xgt 活跃值 7 2011-6-16 13:29
3
0
00401020    55              push    ebp
00401021    89E5            mov     ebp, esp
00401023    6A FF           push    -1
00401025    68 10304000     push    403010
0040102A    68 28114000     push    401128
0040102F    64:FF35 0000000>push    dword ptr fs:[0]
00401036    64:8925 0000000>mov     dword ptr fs:[0], esp
0040103D    83EC 0C         sub     esp, 0C
00401040    53              push    ebx
00401041    56              push    esi
00401042    57              push    edi


这个是吗?
雪    币: 556
活跃值: 活跃值 (72)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 活跃值 1 2011-6-16 13:32
4
0
LZ好勤奋啊,这些花指令习惯就好,没啥的。
雪    币: 527
活跃值: 活跃值 (86)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
Mx¢Xgt 活跃值 7 2011-6-16 13:35
5
0
貌似很牛,有时间研究下
雪    币: 106
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
NiGHter 活跃值 2011-6-16 14:53
6
0
只为给韬哥翻页..

004220AA                       5D              pop ebp                                  ; PEQuake.00422005
004220AB                       81ED 05000000   sub ebp,5
004220B1                       8D75 3D         lea esi,dword ptr ss:[ebp+3D]
004220B4                       56              push esi
004220B5                       FF55 31         call dword ptr ss:[ebp+31]               ; 获取kernel32模块基址
004220B8                       8DB5 81000000   lea esi,dword ptr ss:[ebp+81]
004220BE                       56              push esi
004220BF                       50              push eax
004220C0                       FF55 2D         call dword ptr ss:[ebp+2D]               ; 获取VirtualAlloc地址
004220C3                       8985 8E000000   mov dword ptr ss:[ebp+8E],eax
004220C9                       6A 04           push 4
004220CB                       68 00100000     push 1000
004220D0                       68 0F9C0000     push 9C0F
004220D5                       6A 00           push 0
004220D7                       FF95 8E000000   call dword ptr ss:[ebp+8E]               ; 申请一块buffer
004220DD                       50              push eax
004220DE                       8B9D 7D000000   mov ebx,dword ptr ss:[ebp+7D]
004220E4                       03DD            add ebx,ebp
004220E6                       50              push eax
004220E7                       53              push ebx
004220E8                       E8 04000000     call 004220F1                            ; Aplib解压.解压到刚才申请的buffer
004220ED                       5A              pop edx
004220EE                       55              push ebp
004220EF                       FFE2            jmp edx                                  ; 执行刚才解压出来的代码


00394781                       8D85 62194000   lea eax,dword ptr ss:[ebp+401962]
00394787                       50              push eax
00394788                       6A 00           push 0
0039478A                       FF7424 08       push dword ptr ss:[esp+8]
0039478E                       51              push ecx
0039478F                       6A 00           push 0
00394791                       6A 00           push 0
00394793                       FF95 30644000   call dword ptr ss:[ebp+406430]           ; 创建线程,检测调试器
00394799                       33F6            xor esi,esi
0039479B                       33FF            xor edi,edi


// 查找当前进程  反调试...
00394B33                       5E              pop esi
00394B34                       C706 28010000   mov dword ptr ds:[esi],128
00394B3A                       56              push esi
00394B3B                       53              push ebx
00394B3C                       FF95 1B664000   call dword ptr ss:[ebp+40661B]           ; Process32First
00394B42                       397E 08         cmp dword ptr ds:[esi+8],edi             ; 判断是否是当前进程
00394B45                       0F84 5C010000   je 00394CA7
00394B4B                       56              push esi
00394B4C                       53              push ebx


// 已经找到了当前进程,开始查找父进程
00394CA7                       FF76 18         push dword ptr ds:[esi+18]               ; 找到了当前进程
00394CAA                       5F              pop edi
00394CAB                       56              push esi
00394CAC                       53              push ebx
00394CAD                       FF95 1B664000   call dword ptr ss:[ebp+40661B]
00394CB3                       397E 08         cmp dword ptr ds:[esi+8],edi             ; 这里开始查找当前进程的父进程
00394CB6                       0F84 D5020000   je 00394F91

// 找到父进程了,开始检查父进程
00394F91                       8D76 24         lea esi,dword ptr ds:[esi+24]            ; 找到父进程了
00394F94                       56              push esi                                 ; 开始检查父进程名,不是explorer.exe就挂起
00394F95                       FF95 82644000   call dword ptr ss:[ebp+406482]
00394F9B                       03F0            add esi,eax
00394F9D                       56              push esi
00394F9E                       83EE 07         sub esi,7
00394FA1                       AD              lods dword ptr ds:[esi]
00394FA2                       25 5F5F5F5F     and eax,5F5F5F5F
00394FA7                       3D 434D442E     cmp eax,2E444D43
00394FAC                       0F84 60010000   je 00395112
00394FB2                       5E              pop esi


00395105                       AD              lods dword ptr ds:[esi]
00395106                       25 5F5F5F5F     and eax,5F5F5F5F
0039510B                       3D 4558504C     cmp eax,4C505845                         ; "expl"
00395110                     - 75 FE           jnz short 00395110                       ; 检查到父进程不是explorer就挂起了,jmp eip
00395112                       61              popad
00395113                       BB 46520000     mov ebx,5246
00395118                       833C2B 00       cmp dword ptr ds:[ebx+ebp],0


// 之后开始解压区段了

003996D1  40 AE 80 7C 41 B7 80 7C 7B 1D 80 7C F1 9A 80 7C  @畝|A穩|{€|駳€|
003996E1  00 00 40 00 FC 55 00 00 FA 6A 00 00 F1 20 42 00  ..@.黆..鷍..?B.
003996F1  00 C0 00 00 00 10 00 00 00 2C 00 00 20 4D 01 00  .?.....,.. M.
00399701  E0 D2 00 00 E4 C7 00 00                          嘁..淝....



// 首先这是内存中的一块数据, 从第三行开始,保存的是区段信息


00395122                       53              push ebx
00395123                       6A 04           push 4
00395125                       68 00100000     push 1000
0039512A                       FF342B          push dword ptr ds:[ebx+ebp]
0039512D                       6A 00           push 0
0039512F                       FF95 32520000   call dword ptr ss:[ebp+5232]             ; 申请一块buffer
00395135                       5B              pop ebx


003953DA                       8B78 04         mov edi,dword ptr ds:[eax+4]             ; 取区段RVA,准备解压
003953DD                       03BD 36520000   add edi,dword ptr ss:[ebp+5236]
003953E3                       56              push esi
003953E4                       57              push edi
003953E5                       FF95 42520000   call dword ptr ss:[ebp+5242]             ; Aplib解压区段
003953EB                       8B0C2B          mov ecx,dword ptr ds:[ebx+ebp]
003953EE                       56              push esi
003953EF                       51              push ecx
003953F0                       C1E9 02         shr ecx,2
003953F3                       F3:A5           rep movs dword ptr es:[edi],dword ptr ds>; 将解压出来的数据拷贝回原位置
003953F5                       59              pop ecx
003953F6                       83E1 03         and ecx,3
003953F9                       F3:A4           rep movs byte ptr es:[edi],byte ptr ds:[>
003953FB                       5E              pop esi
003953FC                       53              push ebx
003953FD                       68 00800000     push 8000
00395402                       6A 00           push 0
00395404                       56              push esi
00395405                       FF95 D84D0000   call dword ptr ss:[ebp+4DD8]             ; 释放buffer
0039540B                       5B              pop ebx
0039540C                       83C3 0C         add ebx,0C				; 0xc是下一个区段信息,自定义的结构



// 检查区段是不是都已经解压完了
00395118                       833C2B 00       cmp dword ptr ds:[ebx+ebp],0             ; 判断是不是所有的区段都解压完了
0039511C                       0F84 F2020000   je 00395414				; 没完的话,下面又是重复一轮上面的循环
00395122                       53              push ebx
00395123                       6A 04           push 4
00395125                       68 00100000     push 1000
0039512A                       FF342B          push dword ptr ds:[ebx+ebp]
0039512D                       6A 00           push 0
0039512F                       FF95 32520000   call dword ptr ss:[ebp+5232]             ; 申请一块buffer


00399791  3C B0 00 00 0C 6B 65 72 6E 65 6C 33 32 2E 64 6C  <?..kernel32.dl
003997A1  6C 00 0E 00 00 00 08 52 65 61 64 46 69 6C 65 00  l....ReadFile.
003997B1  1A 57 72 69 74 65 50 72 69 76 61 74 65 50 72 6F  WritePrivatePro
003997C1  66 69 6C 65 53 74 72 69 6E 67 41 00 09 57 72 69  fileStringA..Wri
003997D1  74 65 46 69 6C 65 00 0B 56 69 72 74 75 61 6C 46  teFile.VirtualF
003997E1  72 65 65 00 0C 56 69 72 74 75 61 6C 41 6C 6C 6F  ree..VirtualAllo
003997F1  63 00 0E 53 65 74 46 69 6C 65 50 6F 69 6E 74 65  c.SetFilePointe
00399801  72 00 0D 52 74 6C 5A 65 72 6F 4D 65 6D 6F 72 79  r..RtlZeroMemory
00399811  00 0B 43 6C 6F 73 65 48 61 6E 64 6C 65 00 15 47  .CloseHandle.G
00399821  65 74 50 72 69 76 61 74 65 50 72 6F 66 69 6C 65  etPrivateProfile
00399831  49 6E 74 41 00 09 43 6F 70 79 46 69 6C 65 41 00  IntA..CopyFileA.
00399841  10 47 65 74 4D 6F 64 75 6C 65 48 61 6E 64 6C 65  GetModuleHandle
00399851  41 00 0B 47 65 74 46 69 6C 65 53 69 7A 65 00 0B  A.GetFileSize.
00399861  45 78 69 74 50 72 6F 63 65 73 73 00 0B 43 72 65  ExitProcess.Cre
00399871  61 74 65 46 69 6C 65 41 00 80 B0 00 00 0A 75 73  ateFileA.€?..us
00399881  65 72 33 32 2E 64 6C 6C 00 11 00 00 00 0A 53 68  er32.dll.....Sh

// 内存中有这么一段,导入表结构, 大概结构如下

struct
{
   DWORD dwIAT,
   BYTE  byDllNameLen;
   char *dllname;
   DWORD dwApiNums;   // 从当前DLL中导入的函数个数
   char *apiname;
}

反调试还有个PEB.BeingDebugged..掠了...

IAT处理部分貌似还是PE-Armor哪个版本的, 应该都差不多了,所以不看了


雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-16 18:40
7
0
还是你厉害,膜拜一下,贴个教程上来嘛
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-16 18:40
8
0
再次看见酱油哥的真身
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-16 18:41
9
0
谢谢酱油哥指点
雪    币: 5536
活跃值: 活跃值 (56)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 活跃值 26 2011-6-16 22:20
10
0
‎2004‎年‎10‎月‎1‎日,‏‎15:21:22

快7年了啊
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-17 12:16
11
0
搞不定啊,花指令跟着跟着就没法跟了,太多花指令了
雪    币: 556
活跃值: 活跃值 (72)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 活跃值 1 2011-6-17 13:04
12
0
说明楼下的功夫还不够,建议多花花时间来搞。
雪    币: 241
活跃值: 活跃值 (30)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
skylly 活跃值 4 2011-6-22 11:23
13
0
这么多年了, 还有人在研究你那小P壳, 有自豪感吧。
雪    币: 69
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
wParma 活跃值 1 2011-6-22 15:13
14
0
00393C2C    E8 00000000     call    00393C31
00393C31    5D              pop     ebp
00393C32    81ED 89174000   sub     ebp, 401789
00393C38    8DB5 62194000   lea     esi, dword ptr [ebp+401962]
00393C3E    33C0            xor     eax, eax
00393C40    C706 30000000   mov     dword ptr [esi], 30
00393C46    C746 04 0302000>mov     dword ptr [esi+4], 203
00393C4D    C746 20 0200000>mov     dword ptr [esi+20], 2
00393C54    8946 0C         mov     dword ptr [esi+C], eax
00393C57    8946 10         mov     dword ptr [esi+10], eax
00393C5A    8946 18         mov     dword ptr [esi+18], eax
00393C5D    8946 1C         mov     dword ptr [esi+1C], eax
00393C60    8946 24         mov     dword ptr [esi+24], eax
00393C63    8946 2C         mov     dword ptr [esi+2C], eax
00393C66    50              push    eax
00393C67    FF95 13684000   call    dword ptr [ebp+406813]           ; kernel32.GetModuleHandleA



有的时候运气很重要
雪    币: 409
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
fairynull 活跃值 2011-6-22 17:08
15
0
虚心学习~
求全部教程
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-24 18:27
16
0
想研究很简单,只是发下学习记录而以,兄弟你貌似很厉害啊
雪    币: 409
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
fairynull 活跃值 2011-6-25 10:42
17
0
设置od为停止在自解压真正入口处可到401020处,脱壳后无法行,irc修复提示401020处无可用信息。脱壳失败。
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-6-25 12:57
18
0
,原来这样啊,看来单步对付 花指令+异常 还是不行啊
雪    币: 19
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丹心依旧 活跃值 2011-6-28 12:09
19
0
。。都是高手啊,,支持了,,
雪    币: 244
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小龙人 活跃值 2012-2-16 19:52
20
0
004050B1    8D75 3D         LEA ESI,DWORD PTR SS:[EBP+3D]   ; "Kernel32.dll"
004050B4    56              PUSH ESI                        ; Kernel32.dll的偏移地址
004050B5    FF55 31         CALL DWORD PTR SS:[EBP+31]      ; GetModuleHandleA,获得模块基址
004050B8    8DB5 81000000   LEA ESI,DWORD PTR SS:[EBP+81]   ; “VirtualAlloc”
004050BE    56              PUSH ESI                        ; VirtualAlloc的偏移地址
004050BF    50              PUSH EAX                        ; Kernel32.dll的模块基址
004050C0    FF55 2D         CALL DWORD PTR SS:[EBP+2D]      ; GetProcAddress获得函数地址
004050C3    8985 8E000000   MOV DWORD PTR SS:[EBP+8E],EAX   ; VirtualAlloc函数地址保存的地方
有一问题,就是偏移地址,这儿称为偏移地址是否妥当?它是相对谁的偏移地址?它的基址是多少?我没有看明白,请高人解惑一下.
游客
登录 | 注册 方可回帖
返回