如何修改ntdll.dll中的代码

ybdesire 2011-03-23 03:08:14
我用OD发现一个程序A(关键代码见后)在执行完语句“73D3451B E8 D4E0FFFF call <j mp.&msvcrt.memcpy>”后,通过eax返回了一个我比较感兴趣的值,关键代码如下
73D34518 03C8 add ecx, eax
73D3451A 51 push ecx
73D3451B E8 D4E0FFFF call <jmp.&msvcrt.memcpy>
73D34520 8B06 mov eax, dword ptr [esi]
73D34522 83C4 0C add esp, 0C

为了获得这个eax的值,我用OD直接编写了一个函数,实现了将eax的值送到我自己编写的软件B中。也就是说,只要在73D34520处插入一个call语句调用我写的函数,就能将这个值送给软件B了。
但现在的问题是,这个call语句是插不进去的,因为73D34520处的代码在系统ntdll.dll中,修改这个dll是无效的,我试验过。甚至用内存补丁工具dUP编写内存补丁,都行不通.....
《加密与解密》第3版18.2.4 dll劫持技术第三自然段也提到了kernel32.dll, ntdll.dll等核心系统库是不能用dll劫持技术修改的,而我期望得到的数据仅在ntdll.dll中的某个eax指向的数据,跳出ntdll.dll后就再也找不到这个数据了,我必须在ntdll.dll中加入一条call语句来实现对这个数据进行操作,请问大家该怎么办??直接修改系统dll,会带来很多不确定的问题.....不知道各位高人还有没有什么方法来解决这个问题??
...全文
484 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
所以在函数中涉及到与esp相关的操作均要改为esp+2?
不是esp+4吗
ybdesire 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lactoferrin 的回复:]
可以使其正常运行,B开始运行时DebugActiveProcess就可以捕获A的断点,完了后脱离即可
[/Quote]
非常感谢!我在编程试试,Lactoferrin给我的启示太大了!
我还有一个关于代码注入的帖子,如果Lactoferrin方便,请帮我看看,先谢谢你了
http://bbs.pediy.com/showthread.php?t=131424
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
可以使其正常运行,B开始运行时DebugActiveProcess就可以捕获A的断点,完了后脱离即可
ybdesire 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lactoferrin 的回复:]
这个不需要知道a的源代码,你既然能找到mov eax,xxx,就知道这个指令的内存地址,在a运行后修改这个指令后的指令为int 3即可
[/Quote]
还有个前提,A必须要正常运行。就是A自己做自己的工作,不得人为去干扰他的工作
B只是在合适的时机(比如A执行到这条mov指令)去把A中的数据取出来
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
这个不需要知道a的源代码,你既然能找到mov eax,xxx,就知道这个指令的内存地址,在a运行后修改这个指令后的指令为int 3即可
ybdesire 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lactoferrin 的回复:]
在这个指令后安插一个int 3,运行到这里就会触发断点,然后附加上调试器即可看到
[/Quote]
谢谢Lactoferrin还能在回复我:)
我不是用调试器看它的
我的目的是不知道软件A源代码的情况下,通过反编译来查找A中那些我需要的数据
然后编写另一个软件B,B去把A中这些数据读出来
ybdesire 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lactoferrin 的回复:]
00401523 原来是什么
[/Quote]
是一片空白区域,有很多db 0组成的
我用jmp代替call这个问题就消失了,目前还没有遇到其他问题,等我用汇编将代码写完在测试测试
这问题挺诡异的,呵呵
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
00401523 原来是什么
qiqi030303 2011-03-27
  • 打赏
  • 举报
回复
什么意思啊
ybdesire 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]
所以在函数中涉及到与esp相关的操作均要改为esp+2?
不是esp+4吗
[/Quote]
是的,加4,
笔误,代码上是对的,执行后通用寄存器的数值也没错。但还是报错
Lactoferrin 2011-03-26
  • 打赏
  • 举报
回复
在这个指令后安插一个int 3,运行到这里就会触发断点,然后附加上调试器即可看到
ybdesire 2011-03-26
  • 打赏
  • 举报
回复
如果我只知道程序执行到ntdll中的“mov eax,xxx”时,eax中有一个我感兴趣的数据,这个过程没有调用API,这个数据也只是在这条mov语句里出现(关键是其他地方找不到了)。
自己编程去读取这个eax里的数值,怎么才能实现呢?
ybdesire 2011-03-24
  • 打赏
  • 举报
回复
谢谢Lactoferrin,我在查查API hook相关的资料,谢谢你的提示

[Quote=引用 7 楼 lactoferrin 的回复:]
引用 5 楼 ybdesire 的回复:

hook是需要有WM产生的,调用msvcrt.memcpy能产生什么消息?
引用 3 楼 delphiguy 的回复:
你可以hook msvcrt.memcpy,判断调用是否来自NTDLL的某一位置...
这个hook不是指消息钩子,是api hook
这个宏用于修改当前进程ntdll.dll中的程序来防止当前进程被注入dll,连接时需要n……
[/Quote]
Lactoferrin 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ybdesire 的回复:]

hook是需要有WM产生的,调用msvcrt.memcpy能产生什么消息?
引用 3 楼 delphiguy 的回复:
你可以hook msvcrt.memcpy,判断调用是否来自NTDLL的某一位置...
[/Quote]这个hook不是指消息钩子,是api hook
这个宏用于修改当前进程ntdll.dll中的程序来防止当前进程被注入dll,连接时需要ntdll.lib


#define xx __declspec(dllimport)ULONG_PTR __stdcall
xx LdrLoadDll(wchar_t*PathToFile,long Flags,PUNICODE_STRING ModuleName,void**BaseAddess);
xx NtProtectVirtualMemory(HANDLE ProcessHandle,void**BaseAddress,PULONG_PTR ProtectSize,ULONG NewProtect,PULONG OldProtect);
#define DisableLdrLoadDll \
{\
void*p=LdrLoadDll;ULONG_PTR Size=32;ULONG OldProtect;\
if(NtProtectVirtualMemory((HANDLE)-1,&p,&Size,PAGE_EXECUTE_READWRITE,&OldProtect)==0)\
{\
*(unsigned long long*)LdrLoadDll=0xFC2444C7;\
*(unsigned long long*)((ULONG_PTR)LdrLoadDll+8)=0xF82444C7;\
*(unsigned char*)((ULONG_PTR)LdrLoadDll+16)=0xE9;\
*(unsigned int*)((ULONG_PTR)LdrLoadDll+17)=(ULONG_PTR)LdrGetDllHandle-(ULONG_PTR)LdrLoadDll-22;\
NtProtectVirtualMemory((HANDLE)-1,&p,&Size,OldProtect,&OldProtect);\
}\
}
ybdesire 2011-03-23
  • 打赏
  • 举报
回复
谢谢,请问你说的方法是修改内存中的dll吗?
NtProtectVirtualMemory的资料不好找啊,大哥能给我提供点源代码吗?
[Quote=引用 2 楼 lactoferrin 的回复:]
引用楼主 ybdesire 的回复:
我用OD发现一个程序A(关键代码见后)在执行完语句“73D3451B E8 D4E0FFFF call <j mp.&amp;msvcrt.memcpy>”后,通过eax返回了一个我比较感兴趣的值,关键代码如下
73D34518 03C8 add ecx, eax
73D3451A 51 push ecx
73D3451B E8 D4E0FFF……
[/Quote]
ybdesire 2011-03-23
  • 打赏
  • 举报
回复
hook是需要有WM产生的,调用msvcrt.memcpy能产生什么消息?
[Quote=引用 3 楼 delphiguy 的回复:]
你可以hook msvcrt.memcpy,判断调用是否来自NTDLL的某一位置...
[/Quote]
ybdesire 2011-03-23
  • 打赏
  • 举报
回复
谢谢你的回复,请问书名是什么,“寒江独钓”这个关键词搜不到什么信息啊。。。

[Quote=引用 1 楼 yemeishenme 的回复:]
这个你需要过驱动保护, 我想是这样的

用前正研究做WG,第一关是过驱动保护。

我正在看寒江独钧 那本书,你也看看吧
[/Quote]
  • 打赏
  • 举报
回复
你可以hook msvcrt.memcpy,判断调用是否来自NTDLL的某一位置...
Lactoferrin 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 ybdesire 的回复:]
我用OD发现一个程序A(关键代码见后)在执行完语句“73D3451B E8 D4E0FFFF call <j mp.&msvcrt.memcpy>”后,通过eax返回了一个我比较感兴趣的值,关键代码如下
73D34518 03C8 add ecx, eax
73D3451A 51 push ecx
73D3451B E8 D4E0FFFF call <jmp.&msvc……
[/Quote]
修改某个进程的ntdll.dll无需驱动程序,先用NtProtectVirtualMemory修改保护方式,再写入。
永磁体呵呵哒 2011-03-23
  • 打赏
  • 举报
回复
这个你需要过驱动保护, 我想是这样的

用前正研究做WG,第一关是过驱动保护。

我正在看寒江独钧 那本书,你也看看吧

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧