首页
社区
课程
招聘
OD修改代码的一个问题,请教高手
发表于: 2009-12-17 01:12 4687

OD修改代码的一个问题,请教高手

2009-12-17 01:12
4687
我有一个dll里面有如下代码
1000A205  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)
1000A20A  |.  56            push    esi                              ; |PathBuffer => 复件_Reg.10025D04
1000A20B  |.  53            push    ebx                              ; |hModule
1000A20C  |.  FF15 E4A10110 call    dword ptr [<&KERNEL32.GetModuleF>; \GetModuleFileNameA
1000A212  |.  A1 98770210   mov     eax, dword ptr [10027798]
1000A217  |.  8935 0C5C0210 mov     dword ptr [10025C0C], esi
1000A21D  |.  8BFE          mov     edi, esi
1000A21F  |.  3818          cmp     byte ptr [eax], bl
1000A221  |.  74 02         je      short 1000A225

我将1000A20C处改为 call     10019801
显示为
1000A205   .  68 04010000                    push    104
1000A20A   .  56                             push    esi
1000A20B   .  53                             push    ebx
1000A20C      E8 F0F50000                    call    10019801                         ;  mymodulename
1000A211      90                             nop
1000A212      A1 98770210                    mov     eax, dword ptr [10027798]
1000A217      8935 0C5C0210                  mov     dword ptr [10025C0C], esi
1000A21D      8BFE                           mov     edi, esi
1000A21F      3818                           cmp     byte ptr [eax], bl
1000A221      74 02                          je      short 1000A225

但是运行起来OD却识别为
01A9A205   .  68 04010000                    push    104
01A9A20A   .  56                             push    esi
01A9A20B   .  53                             push    ebx
01A9A20C    - E9 F0F500A9                    jmp     AAAA9801                         ;  mymodulename
01A9A211      81A1 9877AB01 89350C5C         and     dword ptr [ecx+1AB7798], 5C0C358>
01A9A21B      AB                             stos    dword ptr es:[edi]
01A9A21C      018B FE381874                  add     dword ptr [ebx+741838FE], ecx
01A9A222      028B F88D45F8                  add     cl, byte ptr [ebx+F8458DF8]

将call    10019801变成了 jmp     AAAA9801 后面也完全混乱了,请教各位高手

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
E8 F0F50000  和 E9 F0F500A9明显不同,看看是不是在运行的时候修改了其中的值,下个内存写断点~
2009-12-17 10:45
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是重定位啊!!!
2009-12-17 10:55
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
改成call     dword ptr [10019801]
2009-12-17 11:23
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcr
5
没有人遇到过这个问题吗?
01A9A20C    - E9 F0F500A9                    jmp     AAAA9801                         ;  mymodulename
这里应该是
01A9A20C    - E8 F0F500A9                    call     AAAA9801                         ;  mymodulename
2009-12-17 14:39
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
说了,重定位问题

把需要的文件给全,我看看。
2009-12-17 15:04
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主,你需要重定位。你这个就直接是写壳时用到的 简单级别CodeReplace 技术。方式有你这种和4楼所说的2种,不过本质一样的。另,如果你不想增加复杂度,推荐4楼这种方法,如果其他地方想换个方法,看下我以前回复的一个帖子就明白了。

http://bbs.pediy.com/showthread.php?t=101475

同6楼,LZ最后详细解释下,至少说下你想做什么啊。

引用“我将1000A20C处改为 call     10019801”
你这个是OD里直接改的吧。我想问下你  这个操作,你如何用代码实现的  。如果是代码实现出错,应该就是上面的问题吧。
2009-12-18 16:27
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcr
8
我是在OD里面改的,我是想写个函数代替getmodulefilename功能,取得我自己的字符串。
但是我call 10019801就是不行,跳转也不行,OD直接加载dll时显示正常,但是用个EXE一加载这个dll,在OD里面看到这个地址就变了。所以想请教。
上面的贴子也看了,在OD里面直接修改照理说应该没有问题
2009-12-19 01:18
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主,给你个建议:
1000A20C E8 F0F50000 call 10019801 ; mymodulename
1000A211 90 nop
改为
1000A20C      E8 F0F50000            nop        
1000A211      90                             call    10019801                         ;  mymodulename

有一次,我使用上面的通不过,使用下面的就没问题了,是偶然事件还是一般情况我也不知道,你先这样改试试。

还要提醒下楼主注意:
1000A20B   .  53                             push    ebx
PUSH的是DLL的句柄而不是EXE的句柄,所以是使用GetMoudleHandleEx函数取句柄。
2009-12-19 11:12
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
晕了,终于发现楼主说的关键点了:
OD直接加载dll时显示正常,但是用个EXE一加载这个dll,在OD里面看到这个地址就变了。所以想请教。

1000A205  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)
1000A20A  |.  56            push    esi                              ; |PathBuffer => 复件_Reg.10025D04
1000A20B  |.  53            push    ebx                              ; |hModule
1000A20C  |.  FF15 E4A10110 call    dword ptr [<&KERNEL32.GetModuleF>; \GetModuleFileNameA
楼主你得把这三个参数如何获取的代码贴下。中间哪个参数push    esi。ESI里你是通过直接赋值这样的硬编码方式?
如果是的话, 6楼早就说的非常清楚了。     

还有,楼主你需要贴出你如何
将call 10019801变成了 jmp AAAA9801
的代码。我们不看结果,看你怎么做的,如何用代码改写的。
2009-12-19 11:40
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主:没遇过。怎会这样。如果给整个exe文件我看,可以帮你看。
2009-12-19 11:51
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcr
12
感谢楼上的朋友热心帮忙,前面的代码
1000A205  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)
1000A20A  |.  56            push    esi                              ; |PathBuffer => 复件_Reg.10025D04
1000A20B  |.  53            push    ebx                              ; |hModule
这些是原来有的,值不会错,我只是想用自己的函数替换getmodulefilename。但是我将1000A20C  |.  FF15 E4A10110 call    dword ptr [<&KERNEL32.GetModuleF>; \GetModuleFileNameA
改为(100197CF是我自己的函数的入口)
1000A20C   .  90            nop
1000A20D      E8 BDF50000   call    100197CF
但是EXE加载这个dll后,OD运行到这里代码却变成了
0158A20C   .  90            nop
0158A20D      E8 BDF558F1   call    F2B197CF
百思不得其解,不知道怎么传附件,不然把程序传上来给大家看下。
2009-12-19 23:09
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcr
13
确实是重定位问题,把重定位表改了就行了,谢谢楼上的朋友。
2009-12-22 23:02
0
游客
登录 | 注册 方可回帖
返回
//