首页
社区
课程
招聘
[求助]本书 P562页 汇编代码是有问题么
发表于: 2019-3-9 20:15 3165

[求助]本书 P562页 汇编代码是有问题么

2019-3-9 20:15
3165
FindApi_loop:
call    FindApi //循环查找API地址
loop FindApi_loop
这里无限循环跳不出去。

然后我看了下FindApi
FindApi:
push    ecx
push    ebp
mov     esi, dword ptr [ebx+3Ch] // e_lfanew
mov     esi, dword ptr [esi+ebx+78h]// EATAddr
add     esi, ebx
push    esi
mov     esi, dword ptr [esi+20h]    //AddressOfNames
add     esi, ebx
xor     ecx, ecx
dec     ecx
Find_Loop:
inc     ecx
lods    dword ptr [esi]
add     eax, ebx
xor     ebp, ebp
//计算hash值
Hash_Loop:
movsx   edx, byte ptr [eax]
cmp     dl, dh
je      hash_OK                      //这里没有跳出
ror     ebp, 7
add     ebp, edx
inc     eax
jmp     Hash_Loop            //这里没有跳出
hash_OK:
//判断hash值是否相等
cmp     ebp, dword ptr [edi]
jnz     Find_Loop                //这里跳到循环头

pop     esi
mov     ebp, dword ptr [esi+24h] //Ordinal Table
add     ebp, ebx
mov     cx, word ptr [ebp+ecx*2]
mov     ebp, dword ptr [esi+1Ch] //Address Table
add     ebp, ebx
mov     eax, dword ptr [ebp+ecx*4]
add     eax, ebx
stos    dword ptr es:[edi]
pop     ebp
pop     ecx
retn

FindApi 函数体里也没有跳出循环的指令 这样不就无限循环了?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
2
感谢您的认真阅读和提问,首先,该处代码没有问题,下面我来详细讲解下该处代码的作用和调试方法:
        这个函数的功能是根据输入的参数(某 DLL基址,某API函数的名称HASH值)来获取该API函数的实际地址。
读者调试时,可以将Sample下面的Shellcode工程中Debug目录下的LoadShellcode.exe使用OD加载来调试具体的shellcode运行过程,详细情况如下图:

2019-3-9 21:45
1
雪    币: 1188
活跃值: (974)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
snowdbg 感谢您的认真阅读和提问,首先,该处代码没有问题,下面我来详细讲解下该处代码的作用和调试方法:        这个函数的功能是根据 ...
非常感谢版主14章作者为我解答,代码确实没有错误,版主的耐心解答让我更加喜爱这本书的内容热情高涨
call    FindApi //循环查找API地址
loop FindApi_loop
是我在理解:loop FindApi_loop
loop上错误理解成为 jmp无限跳,后来仔细一想是根据ecx值跳。
我也按照版主说的做 Shellcode工程中Debug目录下的LoadShellcode.exe使用OD加载调试执行过程
在执行过程中

当找到kernel32.dll 为啥跳到00030106 :CC int3 触发下异常?

2019-3-9 22:38
0
雪    币: 1188
活跃值: (974)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
snowdbg 感谢您的认真阅读和提问,首先,该处代码没有问题,下面我来详细讲解下该处代码的作用和调试方法:        这个函数的功能是根据 ...
看随书源码应该是
jmp                DataArea

DataArea:
               call        backToMain   //这里变成了 int3
不晓得是不是随书的程序问题
2019-3-9 22:49
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
5
program杨 看随书源码应该是 jmp DataArea DataArea: call backToMain //这里变成了 int3 不晓得是不是随书的程序问题
谢谢读者的细心调试分析,此处问题解答如下:
shellcode_bin.bin文件中0x106偏移应该是0xE8,而不是0xCC,如下图:

产生这个原因的可能是:当时为了方便调试,我手动修改成了0xCC(int 3)。
修复方法:(1)重新编译下该工程,将shellcode_bin.bin、shellcode_cpp.cpp、shellcode_unescape.txt、shellcode_unicode.txt等文件删除;
运行shellcode.exe即可生成对应的二进制文件
(2)手动修改0xCC为0xE8
再对这个工程做个说明:
该工程是一个完整的通过vc6内联汇编编写、生成各种格式的shellcode文件的工程,shellcode功能是下载并执行exe文件。
_asm{}内是shellcode的汇编源代码,代码中通过“goto getShellcode;”跳过shellcode到内联汇编末尾,避免shellcode被运行。
其中 通过

jmp DataArea

call backToMain

这两条语句可以获取到追加在shellcode末尾的数据地址,方便后续调用数据。


2019-3-10 09:24
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
膜拜各位大佬们
2019-3-11 13:24
0
游客
登录 | 注册 方可回帖
返回
//