DLL注入 之线程劫持

来源:互联网 发布:淘宝网店培训课程 编辑:程序博客网 时间:2024/05/14 11:21

  大家好,我是FISH ,以下代码只是属于思路,都是我自己KEY进去的,有错误很抱歉,我尽量注意,

 内容来自Greg hoglund 的<<exploiting online games>> .

    给应用程序注入新的代码,最常用的技巧是DLL注入,使用这个方法,可以让远线程加载到你自己

设计的DLL. DLL本身的功能可以是挂钩函数,修改目标程序的内存空间,DLL注入是很隐藏,很方便的

注入手段,(实际上,该方法很容易被发现,有不少常规方法可以发现注入的DLL).
 
   DLL注入的技巧是让目标进程中已存在的一个线程跳到某个代码片段,该代码片段调用

Loadlibiary 来加载模块,这样的思路有很多种实现方法. 比如:使用CreateRemoteThread创建

新的远程线程,这里介绍的技巧没有创建新线程,而是劫持现有的线程进行加载操作.

   首先,需要将加载的DLL代码写到远程进程.定义代码如下:

 char InjectedcodePage[4096]=
 { 0xb8 ,00,00,00,00
 //mov EAX,0h | Pointer to LoadlibraryA() (DWORD)
 0xBB,00,00,00,00
 //mov EBX,0h | DLLname to inject(DWORD)
 0x53,   //push EBX
 0xff, 0xD0, //call EAX
 0x5b,  //pop ebx
 0xcc    /int 3h
 //dll name string will be placed here
 };
 int length_of_injection_code=15;

  上述代码有一些占位字节用来填充LoadlibraryA()和需要加载的DLL名指针地址.

对于LoadLibraryA的地址,代码简单的假设被注入远程的LoadLibraryA地址和现在的进程地址相同

作者没有遇到过不同的情况,所以假设这样做是安全的.[评: 实际上,目前对不少游戏这样操作不

能得到正确的地址,原因是KERNEL32.dll]位置被移动了.]

 farproc loadlibproc=getprocaddress(
 getmodulehandle("kernel32.dll"),
 LoadLibraryA};

  对于dll名称,可以将DLL名直接写在上述的代码段之后,即代码中偏移为15的地方.下面要计算所有

要用到的偏移.

 char *Dllname;
 Dword *EAX, *EBX;
 
 DLLname=((char*)((dword)injectedcodepage
 +length_of_inject_code);
 Eax=(dowrd)(injectedcodepage+1);
 ebx=(dword)(injectedcodepage+6);

这样就得到了两处占位字节序列的地址和将要填写的dll名地址. 需要将代码写到远端进程才能

填写这几个地址,因为代码将要在远端执行,而不是本地.

 内嵌在代码段中的INT3指令用于和调试器交互,内嵌断点通知调试器,注入代码执行完毕

现在不管这些,先了解一下如何查找dll代码位置.

  下面的代码,假设已经打开调试器并发送初始调试信号,如果该操作为附加操作,将会为初始

断点事件创建线程.代码将劫持该线程并利用该线程运行注入的代码片段,在调试时间循环中,使用

如下代码获取线程句柄.

 Hthread=fopenthread(
 thread_all_access,
 false,
 dbg_ent.dwthreadtd);

记得使用句柄后关闭句柄

 dll名称为dll文件的全路径, hprocess为被调试的团段进程,hmodulebase可以从调试事件循环中

获取,或者可以假定为0x400000 为基地址,(绝大多数情况都是这样).从调试时间循环获取的方法为:

 if (dbg_evt.dwdebugEventcode==create_process_debug_event)
 {
  Hmodulebase=dng_evt.u.createprocessinfo.lpbaseofimage;
 }
 
 注入的下一不走为定位远程进程的有效的可执行代码段. 这需要解析pe文件头,查找DOS头:

 res=readprocessmemory(
 hprocess,
 hmodulebase,
 &dosdhr,
 sizeof(doshdr),
 &read);
 if ((!res)||(read!=sizeof(doshdr)))
 {
 printf("could not get dos header/n");
 return false;
 }
 
 现在通过mz字符串检查文件是否为DOS头.

 if (doshdr.e_magic(!=image_dos_signature)
 {
 printf("could not find mz for dos header/n")'
 return false;
 }

 通过dos头信息查找nt头信息
 
 //get nt header
 res=readprocessmemory(
 hprocess,
 (void*)((dword)hmodulebase+
 &NThdr,
 sizeof(nthdr),
 &read);
 if (!res)||(READ!=sizeof(nyhdr)))
 printf("could not get nt header/n")'

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网盘手机找回被别人关了怎么办 把朋友微信号弄没了怎么办 小米顶配版手机无线网速度慢怎么办 刺激战场用过模拟器后用手机怎么办 百度网盘分享文件有违禁内容怎么办 百度网盘好友发的分享不存在怎么办 4g手机的下载速度很慢怎么办 为什么打开百度网盘的速度慢怎么办 百度网盘限制了我的宽带速度怎么办 联通信号很好但网速特别慢怎么办 苹果手机版本低下载不了软件怎么办 国内的手机要上推特和油管要怎么办 推特注册了卡在手机号怎么办 腾讯微信登录的账号密码忘了怎么办 打开手机浏览器自动跳到网页怎么办 游戏包解压后找不到启动的怎么办? 每次都要解压一次才能运行怎么办 误冲了王者荣耀点劵怎么办 机顶盒上开通的vip手机上怎么办 王者荣耀以前玩的区找不到了怎么办 电脑分辨率调高了游戏进不去怎么办 键盘语言更改后进不去系统怎么办 高尔夫旅行款 被锁在车内怎么办 在天猫买东西垫付的运费不退怎么办 天猫店一口价定价定低了怎么办 服务器开机账号改了密码忘了怎么办 小米儿童电话手表开不开机怎么办? 上海拍牌超过5次违章怎么办 拍拍贷不能更新还不了款怎么办 起诉网贷平台不知道地址怎么办 网贷不知道在哪个平台借的怎么办 车过户后出现问题车主不承认怎么办 卖了车买家一直不过户怎么办 我的车卖了但是买家不过户怎么办 如果买家拍了赠品但联系不上怎么办 淘宝产品处罚下架顾客退货怎么办 生源地贷款续贷密码忘了怎么办 助学贷款续贷密码忘了怎么办 京东上回收东西如果是坏的怎么办 58.同城找的工作被骗了怎么办 京东第三方买了二手机怎么办