xor edx, edx ; 清零 edx mov ax, word ptr [ebp] ; 将页数大小传送到ax sub ax, 8 ; 减去下一页的8位地址 mov cx, 2 ; 赋予cx为2 div cx ; 将本页页字节除以2,获得重定位代码个数 mov ecx, eax ; 讲结果传送到ecx,做循环用 add ebp, 4 ; 指向第一个重定位代码 xor esi, esi ; 清零esi mov si, word ptr [ebp] ; 将重定位地址传送到si cmp esi, 0 ; 对比是否是0 je short 10018092 ; 如果是0则跳出解密 sub si, 3000 ; 去除 3000,获得确切地址的后三位地址 add esi, dword ptr [esp] ; 加上这页的基址 add esi, dword ptr [esp+4] ; 加上文件基址 mov ebx, dword ptr [esi] ; 获取被重定位的数据 mov edx, 55 ; 赋予edx一个 key,这个key 可以随便 写,55=key xor ebx, edx ; 将被重定位的代码解密 add ebx, dword ptr [esp+8] ; 重定位被解密的数据 mov dword ptr [esi], ebx ; 恢复加密数据 add ebp, 2 ; 解密下一个重定位代码 loopd short 1001806C ; 循环解密,到 ecx为 0 pop eax ; 平衡堆栈 cmp dword ptr [ebp], 0 ; 查看是否全部解密完毕 jnz short 1001804C ; 如果没解密完毕继续解密 pop eax ; 平衡堆栈 pop eax ; 平衡堆栈 popad ; 恢复现场 retn ; 退出解密函数返回 下面是二进制代码(方便大家实战时直接复制使用): 60 E8 00 00 00 00 58 2D 11 11 11 11 50 B8 22 22 22 22 03 04 24 83 38 01 74 6B C7 00 01 00 00 00 BA 33 33 33 33 03 14 24 52 BD 44 44 44 44 03 6C 24 04 FF 75 00 83 C5 04 33 C0 |