能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不懂的沙发,呵
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
就是补汇编代码,让程序像内存补丁一样修改自身的汇编代码,
不知我说的够不够清楚
|
能力值:
(RANK:410 )
|
-
-
4 楼
pushad
push offset lpszDllName
aall LoadLibrary //取得要修改的Dll的基地址(Call这个函数最好引用这个函数地址,不要直接用硬代码写入,不然该程序只能在你的机器上运行了。
add eax,1266h //加上编移地址
mov Byte ptr [eax],0 //修改
popad
最后要注意的是你必须保证Dll的Code段是可以修改的。
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
最初由 小虾 发布 pushad push offset lpszDllName aall LoadLibrary //取得要修改的Dll的基地址(Call这个函数最好引用这个函数地址,不要直接用硬代码写入,不然该程序只能在你的机器上运行了。 add eax,1266h //加上编移地址 mov Byte ptr [eax],0 //修改 ........
多谢大侠指点呀,呵呵,感谢呀
只是,这一行的push offset lpszDllName
的offset lpszDllName是啥意思
这个aall LoadLibrary又是啥意思,
我不太清楚呀,且也不知用汇编代码如何实现呢,我要把代码写到程序里,让程序自己来修改
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
|
能力值:
(RANK:410 )
|
-
-
7 楼
呵呵,aall是笔误。应该是call LoadLibrary才对。
push offset lpszDllName这一句首先要你先在Exe文件里找一个空地,在那个空地里写入你要修改的Dll名字及扩展名,如:MyDll.dll等。并记下该字符串的地址,如:00401000。
那么你就可以在程序中:
push 00401000 //这个00401000是保存着你加入的MyDll.dll的字符串地址。
call LoadLibrary //就行了。
|
能力值:
(RANK:410 )
|
-
-
8 楼
当然,如果程序里本身有这个Dll名字的字符串,那么你也不用自己再写一个这样的字符串了。直接找到这Dll名字的字符串,在自己的修改的代码里
push 找到的Dll名字地址
call LoadLibrary
这样也可以。这两句主要是取得Dll加载后的基地址(因为Dll有重定位,每一次加载后的基地址都有可能不同,所以用这两句取得该Dll的基地址。)再加上你要修改的代码地址偏移地址就行了,如你提供的上面的要修改的代码偏移地址是1266。
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
push offset lpszDllName这一句首先要你先在Exe文件里找一个空地,在那个空地里写入你要修改的Dll名字及扩展名,如:MyDll.dll等
大侠,这段我看懂了,但我不会写呀,不知和汇编代码,如何描述呀
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
call LoadLibrary
这一句汇编代码会是啥样呢,是不是这样的
例:call dword ptr ds:[6D86D08]
|
能力值:
(RANK:410 )
|
-
-
11 楼
用OllyDBG打开要修改的程序。然后找一段程序没有使用空地(一般在Code段找一块全0的地方),用OD的二进制编辑功能写入要修改的DllName及扩展名(也可以在程序里找一找,看看有没有这个DllName,如果有就不用自己再写了),记下这个地址(假如是00401000)。然后再在程序里找到一个调用LoadLibrary函数的地址(如果没有你只好用PE修改之类的工具添加进去了),并记下这个地址(假如是00402000)。之后用OllyDBG在程序中加入如下汇编代码:
pushad
push 00401000
call 00402000或dword ptr [00402000]
add eax,1266
mov Byte ptr [eax],0
popad
修改这个EXE文件保存好后应该就可以了(当然你还要想办法让程序执行这些代码,如果不执行写了也是白写 )。
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
多谢大侠如此详细的讲解,再次感谢呀
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
用LORDPE可以往里面加函数吗
|
能力值:
( LV3,RANK:20 )
|
-
-
15 楼
看来我是菜的不行了,教了我这么多,晕
我不会用PE工程往文件里加LoadLibrary函数
能否推荐一个PE编辑工具
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
这样的代码我想了好久就不知道怎么写 今天看到了 谢谢这么详细的介绍!!
|
能力值:
( LV3,RANK:20 )
|
-
-
17 楼
再请教一个问题,想修改程序 的代码在什么时候可以修改,是在加载DLL文件时还是在程序运行过程中???
|
能力值:
(RANK:410 )
|
-
-
18 楼
最初由 njzzzzzz 发布 用LORDPE可以往里面加函数吗
可以,不过我也只处在理论上,没有自己亲自实践过,所以也没办法告诉你,论坛上有相关的文章,你可以搜一搜。
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
最后要注意的是你必须保证Dll的Code段是可以修改的。
大侠再请教下,这句是何意思呢我刚才做了下,代码已经写好了,
08CB19D0 /$ 3E:8B1424 mov edx,dword ptr ds:[esp] ; 因我是在DLL文件里做了,先处理下重定位
08CB19D4 |. 66:33D2 xor dx,dx
08CB19D7 |. 8B82 086D0600 mov eax,dword ptr ds:[edx+66D08] ; 到这里重定位处理好了,这个DLL里有我要修改文件的字符串
08CB19DD |. 50 push eax
08CB19DE |. 8BF8 mov edi,eax ; 因下面的CALL返回时EAX为0,不知为何,先保存到EDI
08CB19E0 |. 81C2 38190500 add edx,51938 ; 定义出LoadLibrary函数地址
08CB19E6 |. FFD2 call edx
08CB19E8 |. 8BC7 mov eax,edi ; 把要修改文件的基址给EAX
08CB19EA |. 83E8 B8 sub eax,-48 ; 加上偏移
08CB19ED |. C600 75 mov byte ptr ds:[eax],75 ; 就是在这里出问题,byte ptr ds:[eax]这里的东东就是我想改的,但是在这F8运行时出错,晕
08CB19F0 |. 61 popad
08CB19F1 \. C3 retn
不知出错是不是你说的
"最后要注意的是你必须保证Dll的Code段是可以修改的。"
这个意思,郁闷中ing...........
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
我想问下 这样修改代码是要在 dll加载的时候还是 程序运行的时候
还有
如果我是要改 个跳转呢!比如 JNZ XXXXX改成 NOP应该是怎么改的!
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
|
能力值:
(RANK:410 )
|
-
-
22 楼
Call LoadLibrary之后,eax保存的是Dll的基址,可你却在之后用mov eax,edi将Dll的基础破坏了。
|
能力值:
(RANK:410 )
|
-
-
23 楼
最初由 误入楼台 发布 我想问下 这样修改代码是要在 dll加载的时候还是 程序运行的时候 还有 如果我是要改 个跳转呢!比如 JNZ XXXXX改成 NOP应该是怎么改的!
都可以,因为在你的代码里用了call LoadLibrary。这样可以保证如果程序没有加载则由你来加载,程序已经加载则LoadLibrary返回Dll加载后的基址。
要将jnz xxxxxxxx 改成NOP只需将jnz的代码全部改成为90即可。
|
能力值:
( LV3,RANK:20 )
|
-
-
24 楼
最初由 小虾 发布 Call LoadLibrary之后,eax保存的是Dll的基址,可你却在之后用mov eax,edi将Dll的基础破坏了。
不是呀,Call LoadLibrary之后返回时EAX=0
我用这个函数对不对呀
08C61938 $- FF25 5CDEC708 jmp dword ptr ds:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 我刚看了一下,好像进入CALL LOADLIBRARYA时对EDI寄存器的值也会用到,
|
能力值:
( LV4,RANK:50 )
|
-
-
25 楼
我说的是要将 JNZ XXXX改成 NOP 用内存补丁的形式 那条更改语句的形式应该是什么 谢谢回答下!
|
|
|