首页
社区
课程
招聘
罗老师的Chapter13\RemoteThread目录下的源码问题
发表于: 2009-12-30 15:55 3756

罗老师的Chapter13\RemoteThread目录下的源码问题

2009-12-30 15:55
3756
今天学到罗老师的WIN32汇编里的497页..就是讲远程线程的内容..我在看RemoteCode.asm里的内容中看到
_RemoteThread        proc        uses ebx edi esi lParam
                local        @hModule

                call        @F
                @@:
                pop        ebx
                sub        ebx,offset @B
                _invoke        [ebx + _lpGetModuleHandle],NULL
                mov        [ebx + _hInstance],eax
                lea        eax,[ebx + offset _szDllUser]
                _invoke        [ebx + _lpGetModuleHandle],eax
                mov        @hModule,eax
                lea        esi,[ebx + offset _szDestroyWindow]
                lea        edi,[ebx + offset _lpDestroyWindow]
                .while        TRUE
                        _invoke        [ebx + _lpGetProcAddress],@hModule,esi
                        mov        [edi],eax
                        add        edi,4
                        @@:
                        lodsb
                        or        al,al
                        jnz        @B
                        .break        .if ! byte ptr [esi]
                .endw
                call        _WinMain
                ret

_RemoteThread        endp

这样一个子程序 .. 头四句是重定位  但是
_invoke        [ebx + _lpGetModuleHandle],NULL  这句在OllyDBG里查看竟然变成
CALL DWORD PTR DS:[EBX+401008]   而401008地址下的是GetProcAddress的函数地址
不知道这是为什么。
下面是我自己的理解:
_invoke        [ebx + _lpGetModuleHandle],NULL
;获取动态链接库模块句柄
mov        [ebx + _hInstance],eax ;句柄送给变量
lea        eax,[ebx + offset _szDllUser] ;EAX=_szDllUser的偏移地址
_invoke        [ebx + _lpGetModuleHandle],eax;获取User32.dll模块句柄
mov        @hModule,eax                  ;句柄送给@hModule局部变量
lea        esi,[ebx + offset _szDestroyWindow] ;偏移送给ESI
lea        edi,[ebx + offset _lpDestroyWindow] ;偏移送给EDI

上面几句能看懂 但下面是个循环 就怎么样都看不懂了
@@:
lodsb
or        al,al
jnz        @B
.break        .if ! byte ptr [esi]  

上面这五句完全不理解什么意思   lodsb应该是SI地址下的内容送给AL  但这里AL是函数地址的低八位 然后位或操作  按理来说两个同样的值位或后值是不变的。  我知道这段指令的意思是获取所有函数的地址, 但不知道具体操作。。对不起 我这人喜欢打破沙锅问到底 。希望知道的人帮我解释下。。

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
jnz是不等于0跳转到标号    难道or是为了判断标号的?     .if ! byte ptr [esi]  又是怎么意思呢 !是取反操作   难道这里是 查看esi里的一个字节是否为0 如果为0就跳出循环?
2009-12-30 15:59
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
@@:
lodsb
or  al,al ;or的话,表示al为0时zf位置1
jnz  @B ;是的,不等于0时跳回去
.break  .if ! byte ptr [esi]  ;表示 esi指向地址的8位内存存的不为0时退出.while
2009-12-30 17:01
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
呵呵,其实这5句很简单
@@:
lodsb
or  al,al
jnz  @B
.break  .if ! byte ptr [esi]
最后一句我不解释
前面4句是,不断将[esi]中的数据加载到AL,然后判断AL是否为0,不为0继续跳到@@
@B就是跳到前面一个@@
2009-12-30 17:19
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
_invoke  [ebx + _lpGetModuleHandle],NULL  
变成CALL DWORD PTR DS:[EBX+401008]
它是在编译时替换的,那涉及到导入表(iat),你可以看看相关资料
2009-12-30 17:23
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
导入地址表(iat)三言两语讲不清,只有看资料,记得给我加分
2009-12-30 17:26
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
他的过程我知道是这样  我不知道的是为什么他要这样  目的是什么    这个循环里ESI都没有变 只获取了DestroyWindow函数的地址 那其他的呢?  又是怎么获取的
2009-12-30 17:26
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
lodsb会递增或递减ESI
2009-12-30 17:32
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
增还是减,看标志寄存器
2009-12-30 17:33
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
主要是那个标志寄存器
2009-12-30 17:36
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
额,就是主标志寄存器,就是pushf操作的那个寄存器
2009-12-30 17:37
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
额。。。谢谢你了哈。。我刚学2星期  现在这两段代码的思路基本清晰了
2009-12-30 18:03
0
游客
登录 | 注册 方可回帖
返回
//