搜索
查看: 1799|回复: 0

破解某挂的一段HOOK代码

[复制链接]

6

主题

13

帖子

116

积分

一级会员

Rank: 2

积分
116
发表于 2018-5-7 09:33:28 | 显示全部楼层 |阅读模式
  1. hook=function(){
  2.         var prcs=process("C:\Users\Administrator\Desktop\ABC.exe",,{suspended=true})       
  3.         oep=0xa0791b
  4.         oepnum=prcs.readNumber(oep,"INT") //读OEP头
  5.         prcs.writeNumber(oep,0xfeeb,"WORD")//硬断点
  6.         prcs.resume()
  7.         sleep(10)
  8.         prcs.suspend()
  9.         prcs.writeNumber(oep,oepnum,"INT")//eip已停在OEP 把OEP头还原
  10.         while(true){
  11.                 prcs.resume()
  12.                 sleep(1)
  13.                 prcs.suspend()
  14.                 ker32=prcs.getModuleBaseAddress("kernel32.dll")//等系统加载再取基址
  15.                         if ker32 != null {                               
  16.                                 ker32=ker32+0x1165c
  17.                                 advapi=prcs.getModuleBaseAddress("advapi32.dll")
  18.                                 ws2_32=prcs.getModuleBaseAddress("ws2_32.dll")
  19.                                 if ws2_32 != null {
  20.                                         prcs.writeNumber(ker32,0xfeeb,"WORD")//硬断       
  21.                                         break ;       
  22.                                 }                                                                               
  23.                         }
  24.         }       
  25.         prcs.resume()               
  26.         sleep(10)
  27.         prcs.suspend()
  28.         //关掉VMP3.X反调试和保护开关
  29.         injectCode1=               
  30.                 '\x81\x3c\x24\x65\xa5\xae\x00'//cmp dword[esp],0xaea565
  31.                 ++'\x75\x0B'//jne 0b
  32.                 //++'\x60'        //pushad
  33.                 ++'\xc7\x84\x24\x8c\x04\x00\x00\x00\x00\x00\x00' //mov dword [esp+48c],0 //关闭VMP功能标志位
  34.                 //++'\x61'//popad
  35.                 //++'\xeb\xfe'               
  36.                 ++'\x81\x3c\x24\xe5\xed\xcc\x76'//cmp dword[esp], advapi32.dll+2dde5
  37.                 ++'\x75\x0E'//jne 0E
  38.                 ++'\x8b\x1d\x11\xde\x50\x00' //mov ebx,dword[50de11] 读取标志位地址
  39.                 ++'\xc7\x03\x01\x00\x00\x00' //mov dword [ebx],0x1       
  40.                 ++'\x33\xdb' //xor ebx,ebx
  41.                 ++'\x8b\xff' //mov edi,edi
  42.                 ++'\x55'//push ebp
  43.                 ++'\x8b\xec' //mov ebp,esp
  44.                 ++'\x5d' //pop ebp               
  45.                 ++'\xff\x25\xdc\x0b\x0e\x76' //jmp dword [760E0BDC]
  46.         //hook send明文位置1
  47.         injectCode2 =               
  48.                 '\x8b\x3f'//mov edi,dword[edi]       
  49.                 ++'\x81\x3f\x7b\x22\x73\x74'//cmp dwrod [edi],0x7473227b 判断明文包是不是取随机码
  50.                 ++'\x74\x0d'//je 0d
  51.                 ++'\x6a\x1c'//push 1c
  52.                 ++'\x68\xe1\xdd\x50\x00'//push 50dde1
  53.                 ++'\xff\x25\xdd\xdd\x50\x00' //jmp 返回
  54.                 ++'\x50' //push eax 长度
  55.                 ++'\x57' //push edi 明文包指针       
  56.                 ++'\x8b\xcb' //mov ecx,ebx
  57.                 ++'\xff\x25\xdd\xdd\x50\x00'//jmp [50dddd]
  58.                                
  59.         //hook connect 修改Ip地址                               
  60.                 injectCode3=                       
  61.                         '\x36\xc7\x40\x04\x0a\x00\xa8\xc0' //mov dword [eax+4],ip 修改ip地址 192.168.0.10        '\xeb\xfe'       
  62.                 ++'\x8b\xff'
  63.                 ++'\x55'
  64.                 ++'\x8b\xec'
  65.                 ++'\x60' //pushad
  66.                 ++'\x8b\x1d\x15\xde\x50\x00' //mov ebx,dword[50de15] 读取标志位地址
  67.                 ++'\xc7\x03\x01\x00\x00\x00' //mov dword [ebx],0x1        写标志位2
  68.                 ++'\x33\xdb' //xor ebx,ebx
  69.                 ++'\x61'//popad               
  70.                 ++'\xff\x25\x0d\xde\x50\x00'  //jmp [50de0d]
  71.                
  72.         //固定随机码
  73.                 injectCode4=       
  74.                         '\x8B\x44\x24\x04' //mov eax,dword[esp+4] 数据指针
  75.                 ++'\x8B\x5C\x24\x08'        //mov ebx,dword[esp+8] 长度
  76.                 ++'\xB9\x00\x00\x00\x00' //mov ecx,0
  77.                 ++'\x3B\xD9' //cmp ebx,ecx
  78.                 ++'\x74\x07'        //je 07               
  79.                 ++'\xC6\x04\x08\x11' //mov byte,[eax+ecx],0x11
  80.                 ++'\x41' //inc ecx
  81.                 ++'\xEB\xF5'//jmp f5
  82.                 ++'\xC2\x08\x00'//retn 0x8
  83.        
  84.         addrInject=prcs.malloc(0x1000)
  85.         thread.command.print(tostring(addrInject,16),"区段基址")
  86.         addDate1=addrInject
  87.         addDate2=addrInject+(#injectCode1)
  88.         addDate3=addrInject+(#injectCode1)+(#injectCode2)
  89.         addDate4=addrInject+(#injectCode1)+(#injectCode2)+(#injectCode3)
  90.         addrHook1=ker32                                                                                //Localalloc       
  91.         addrHook2=0x0041e8b5                                                                        //send明文位
  92.         addrHook3=ws2_32+0x68f5                                                                //connect
  93.         addrHook4=advapi+0x192d                                                                //systemfunction036       
  94.         offsetJmpBack1 = addrInject - (addrHook1 + 5)                                        /计算HOOK1的偏移值
  95.         offsetJmpBack2 = addDate2 - (addrHook2 + 5)                                        //计算HOOK2的偏移值
  96.         offsetJmpBack3 = addDate3 - (addrHook3 + 5)                                        //计算HOOK3的偏移值
  97.         //offsetJmpBack4 = addDate4 - (addrHook4 + 5)       
  98.         //thread.command.print(#injectCode1,"代码1长度")
  99.         //thread.command.print(offsetJmpBack2,"代码1")
  100.         //offsetJmpBack2 = addrInject + #injectCode1 -(addrHook2 + 5)       
  101.        
  102.         prcs.writeString(addDate1,injectCode1)                                         //写入HOOK内容
  103.         prcs.writeString(addDate2,injectCode2)                                                       
  104.         prcs.writeString(addDate3,injectCode3)
  105.         prcs.writeString(addDate4,injectCode4)               
  106.         prcs.writeString(addrHook1,'\xE9')                                                //写入目标进程HOOK1位置JMP
  107.         prcs.writeNumber(addrHook1 + 1,offsetJmpBack1,"INT")                //写入HOOK1后4位地址跳到修改的代码       
  108.         prcs.writeString(addrHook3,'\xE9')                                                       
  109.         prcs.writeNumber(addrHook3 + 1,offsetJmpBack3,"INT")                                               
  110.                
  111.         //-------------------------数据区--------------------
  112.         //在目标进程找块空的地方用来存放数据
  113.         prcs.writeString(0x50dde1,'{"stype":3,"rand":522574520,"r":10}')                //写入明文包
  114.         prcs.writeNumber(0x50dddd,0x41e8bb,"INT")                                //写入HOOK2返回数据 这样方式就不用计算返回地址那么麻烦               
  115.         prcs.writeNumber(0x50de0d,ws2_32+0x68fa,"INT")                         //connect 返回地址       
  116.         prcs.writeNumber(0x50de11,addrInject+0xffc,"INT")                        //写入标志位1地址
  117.         prcs.writeNumber(0x50de15,addrInject+0xff8,"INT")                        //写入connect标志位地址       
  118.         prcs.writeString(0x50de19,"192.168.0.10")               
  119.        
  120.         while(true){
  121.                 prcs.resume()                       
  122.                 sleep(1)
  123.                 prcs.suspend()                               
  124.                 var str=prcs.readNumber(addrInject+0xffc,"BYTE")//判断标志位1
  125.                 if  str == 0x1 {
  126.                         thread.command.print("找到第一个标志位")                       
  127.                         prcs.writeString(addrHook2,'\xE9')                                                //写入HOOK2位置E9
  128.                         prcs.writeNumber(addrHook2 + 1,offsetJmpBack2,"INT")                //写入HOOK2后4位地址                       
  129.                         break ;                       
  130.                 }
  131.         }
  132.         while(true){
  133.                 prcs.resume()                       
  134.                 sleep(1)
  135.                 prcs.suspend()
  136.                 var str1=prcs.readNumber(addrInject+0xff8,"BYTE")//判断标志位2
  137.                 if  str1 == 0x1 {
  138.                         thread.command.print("找到第二个标志位")                       
  139.                         prcs.writeString(addrHook4,injectCode4) //connect后才改随机码 太早改会遇到CRC校验
  140.                         break ;                       
  141.                 }       
  142.         }
  143.                  
  144.        
  145.        
  146.         prcs.resume()
  147.        
  148.        
  149. }
复制代码


挂是VMP3.X加密的 把通信包加密钥和发到服务器取随机码固定后就可做服务端
关于修改VMP那个偏移值 是不同环境不同的 具体要看调试环境并不通用
计算返回地址那太烦人 如果HOOK位很多 还是写DLL好一点
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-16 19:22 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表