首页
社区
课程
招聘
[求助]如何在程序中补汇编代码,让程序修改自身的代码(火热讨论中......)
发表于: 2006-5-8 12:09 10456

[求助]如何在程序中补汇编代码,让程序修改自身的代码(火热讨论中......)

2006-5-8 12:09
10456
例如想把程序中和一行汇编代码
401265 8b01000000  mov eax,1
改成
401265 8b00000000  mov eax,0
这是一个DLL里的一行汇编代码,但DLL文件加了ACP1.4的壳,且还加了狗壳,脱壳难度太大
但他的主程序(EXE文件)没有加壳,

我想在EXE文件里补一段代理,让DLL文件加载时,让EXE文件来修改DLL文件的那一行代码,就像刘键英写的那个内存补丁一样,来修改程序,只是我想把内存补丁的代码写入程序文件,

不知如何实现呀,望高手指点呀

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (48)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂的沙发,呵
2006-5-8 12:13
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
就是补汇编代码,让程序像内存补丁一样修改自身的汇编代码,
不知我说的够不够清楚
2006-5-8 12:19
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
pushad
push offset lpszDllName
aall LoadLibrary  //取得要修改的Dll的基地址(Call这个函数最好引用这个函数地址,不要直接用硬代码写入,不然该程序只能在你的机器上运行了。
add eax,1266h //加上编移地址
mov Byte ptr [eax],0 //修改
popad
最后要注意的是你必须保证Dll的Code段是可以修改的。
2006-5-8 12:32
0
雪    币: 207
活跃值: (41)
能力值: ( 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又是啥意思,
我不太清楚呀,且也不知用汇编代码如何实现呢,我要把代码写到程序里,让程序自己来修改
2006-5-8 12:39
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
也不是看不懂你发的东东,只是不知如何用汇编代码实现,大侠能否写个简单的例子
2006-5-8 12:42
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
呵呵,aall是笔误。应该是call LoadLibrary才对。
push offset lpszDllName这一句首先要你先在Exe文件里找一个空地,在那个空地里写入你要修改的Dll名字及扩展名,如:MyDll.dll等。并记下该字符串的地址,如:00401000。
那么你就可以在程序中:
push 00401000 //这个00401000是保存着你加入的MyDll.dll的字符串地址。
call LoadLibrary //就行了。
2006-5-8 12:44
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
当然,如果程序里本身有这个Dll名字的字符串,那么你也不用自己再写一个这样的字符串了。直接找到这Dll名字的字符串,在自己的修改的代码里
push 找到的Dll名字地址
call LoadLibrary
这样也可以。这两句主要是取得Dll加载后的基地址(因为Dll有重定位,每一次加载后的基地址都有可能不同,所以用这两句取得该Dll的基地址。)再加上你要修改的代码地址偏移地址就行了,如你提供的上面的要修改的代码偏移地址是1266。
2006-5-8 12:48
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
push offset lpszDllName这一句首先要你先在Exe文件里找一个空地,在那个空地里写入你要修改的Dll名字及扩展名,如:MyDll.dll等
大侠,这段我看懂了,但我不会写呀,不知和汇编代码,如何描述呀
2006-5-8 12:54
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
call LoadLibrary
这一句汇编代码会是啥样呢,是不是这样的
例:call dword ptr ds:[6D86D08]
2006-5-8 13:00
0
雪    币: 2384
活跃值: (766)
能力值: (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文件保存好后应该就可以了(当然你还要想办法让程序执行这些代码,如果不执行写了也是白写 )。
2006-5-8 13:08
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
多谢大侠如此详细的讲解,再次感谢呀
2006-5-8 13:10
0
雪    币: 280
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 njzzzzzz 发布
push offset lpszDllName这一句首先要你先在Exe文件里找一个空地,在那个空地里写入你要修改的Dll名字及扩展名,如:MyDll.dll等
大侠,这段我看懂了,但我不会写呀,不知和汇编代码,如何描述呀


PUSH xxxxxxxx
2006-5-8 13:13
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
用LORDPE可以往里面加函数吗
2006-5-8 13:14
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15

看来我是菜的不行了,教了我这么多,晕
我不会用PE工程往文件里加LoadLibrary函数
能否推荐一个PE编辑工具
2006-5-8 13:18
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
这样的代码我想了好久就不知道怎么写 今天看到了  谢谢这么详细的介绍!!
2006-5-8 13:50
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
再请教一个问题,想修改程序 的代码在什么时候可以修改,是在加载DLL文件时还是在程序运行过程中???
2006-5-8 14:08
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
18
最初由 njzzzzzz 发布
用LORDPE可以往里面加函数吗

可以,不过我也只处在理论上,没有自己亲自实践过,所以也没办法告诉你,论坛上有相关的文章,你可以搜一搜。
2006-5-8 14:09
0
雪    币: 207
活跃值: (41)
能力值: ( 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...........
2006-5-8 14:18
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
我想问下 这样修改代码是要在 dll加载的时候还是 程序运行的时候
还有
如果我是要改 个跳转呢!比如 JNZ XXXXX改成 NOP应该是怎么改的!
2006-5-8 14:27
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
最初由 误入楼台 发布
我想问下 这样修改代码是要在 dll加载的时候还是 程序运行的时候
还有
如果我是要改 个跳转呢!比如 JNZ XXXXX改成 NOP应该是怎么改的!

看来兄弟也遇到和我相同的问题呀,这些都是关键呀,还是就是我的代码已经编好了,但改的时候出错了,我晕
2006-5-8 14:29
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
22
Call LoadLibrary之后,eax保存的是Dll的基址,可你却在之后用mov eax,edi将Dll的基础破坏了。
2006-5-8 14:33
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
23
最初由 误入楼台 发布
我想问下 这样修改代码是要在 dll加载的时候还是 程序运行的时候
还有
如果我是要改 个跳转呢!比如 JNZ XXXXX改成 NOP应该是怎么改的!

都可以,因为在你的代码里用了call LoadLibrary。这样可以保证如果程序没有加载则由你来加载,程序已经加载则LoadLibrary返回Dll加载后的基址。
要将jnz xxxxxxxx 改成NOP只需将jnz的代码全部改成为90即可。
2006-5-8 14:35
0
雪    币: 207
活跃值: (41)
能力值: ( 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寄存器的值也会用到,
2006-5-8 14:40
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
我说的是要将 JNZ XXXX改成 NOP 用内存补丁的形式 那条更改语句的形式应该是什么  谢谢回答下!
2006-5-8 14:40
0
游客
登录 | 注册 方可回帖
返回
//