- 注册时间
 - 2010-7-27
 
- 最后登录
 - 2017-5-28
 
- 在线时间
 - 5 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 541 
 
 
 
 | 
 
簡單逆下Hs-NtReadProcessMemory   
直接用KD簡單逆的 
 
偽代碼就不上了 歡迎找碴 
- [ebp-C] = ReturnLength 
 
 - [ebp-28] = ProcessInformation 
 
 - [ebp-4] = ProcessHandle 
 
 - [ebp-10] = 返回值(success Or error c)  
 
 - [ebp-8] = Pid 
 
 - [ebp-18] = ??? 
 
 -  
 
 -  
 
 - ----------保護暫存器---------------  
 
 - 0xB31F7C00  mov eax, esp       
 
 - 0xB31F7C02  add eax, 8       
 
 - 0xB31F7C05  pushad       
 
 - 0xB31F7C06  pushfd       
 
 - 0xB31F7C07  push ebp       
 
 - 0xB31F7C08  mov ebp, esp       
 
 - 0xB31F7C0A  sub esp, 40 
 
 -  
 
 -        
 
 - 0xB31F7C0D  mov ecx, dword ptr [eax+8]      
 
 - 0xB31F7C10  mov dword ptr [ebp-4], ecx       
 
 - 0xB31F7C13  mov ecx, B3206968  //B3206968=ProcessInformation     
 
 - 0xB31F7C18  call dword ptr [<&ntkrnlpa.InterlockedIncrement>]  //不讓多執行序共享變量(保護)  
 
 -  
 
 -  
 
 - 0xB31F7C1E  lea eax, dword ptr [ebp-C] //把局部變量ebp-c的地址給eax       
 
 - 0xB31F7C21  push eax //ReturnLength      
 
 - 0xB31F7C22  push 18 //ProcessInformationLength       
 
 - 0xB31F7C24  lea ecx, dword ptr [ebp-28]       
 
 - 0xB31F7C27  push ecx  //ProcessInformation     
 
 - 0xB31F7C28  push 0  //ProcessInformationClass     
 
 - 0xB31F7C2A  mov edx, dword ptr [ebp-4] //保存在局部變量ebp-4=ProcessHandle       
 
 - 0xB31F7C2D  push edx //ProcessHandle       
 
 - 0xB31F7C2E  call dword ptr [<&ntkrnlpa.ZwQueryInformationProcess>] 
 
 -        
 
 -  
 
 - 0xB31F7C34  mov dword ptr [ebp-10], eax  //返回值(success Or error)給局部變量         
 
 - 0xB31F7C37  xor eax, eax   //eax=0    
 
 - 0xB31F7C39  cmp dword ptr [ebp-10], 0       
 
 - 0xB31F7C3D  setge al  //如果ZF=1則,al等於,否則等於      
 
 - 0xB31F7C40  cmp eax, 1    //比較eax是否為         
 
 - 0xB31F7C43  jne B31F7D13   //eax不為  ●跳到 "正確"       
 
 - 0xB31F7C49  call B31FFB66  //PsGetCurrentId 得到目前PID值    
 
 -   
 
 -  
 
 - 0xB31F7C4E  mov dword ptr [ebp0xB31F7C4E  mov dword ptr [ebp--8], eax  //ebp8], eax  //ebp--8 = Pid    8 = Pid      
 
 - 0xB31F7C51  push 1       
 
 - 0xB31F7C53  mov ecx, dword ptr [ebp-8] //ecx = Pid      
 
 - 0xB31F7C56  push ecx //Pid     
 
 - 0xB31F7C57  call B31FD460  //這個Call內部有 KeGetCurrentIrql(得到目前IRQL)  
 
 -                    //和建立快速互斥 and 釋放快速互斥  
 
 - 0xB31F7C5C  movzx edx, al  //返回值給edx      
 
 - 0xB31F7C5F  cmp edx, 1     //edx和做比較  
 
 - 0xB31F7C62  jne short B31F7CB1  //繼續判斷  
 
 -      
 
 -  
 
 - 0xB31F7C64  push 4      0xB31F7C64  push 4        
 
 - 0xB31F7C66  mov eax, dword ptr [ebp-18]       
 
 - 0xB31F7C69  push eax       
 
 - 0xB31F7C6A  push B320F3A0       
 
 - 0xB31F7C6F  call B31F07F0    ●這個Call出現多次 把Pid當參數傳入 回傳值 Or 0  
 
 - 0xB31F7C74  movzx ecx, al   //把回傳值給ecx     
 
 - 0xB31F7C77  cmp ecx, 1      //ecx和比較    
 
 - 0xB31F7C7A  jne short B31F7CAF ●ecx 為"跳到正確"  
 
 -        
 
 -  
 
 - 0xB31F7C7C  push 4       
 
 - 0xB31F7C7E  mov edx, dword ptr [ebp-8]  //edx=Pid 
 
 - 0xB31F7C81  push edx //push Pid      
 
 - 0xB31F7C82  push B320F3A0 
 
 - 0xB31F7C87  call B31F07F0 ●這個Call出現多次 把Pid當參數傳入 回傳值 Or 0  
 
 - 0xB31F7C8C  movzx eax, al       
 
 - 0xB31F7C8F  cmp eax, 1       
 
 - 0xB31F7C92  je short B31F7C99 //如果eax=1 正確就繼續判斷       
 
 - 0xB31F7C94  jmp B31F7D29   ●eax = 0 跳到錯誤  
 
 -  
 
 -     
 
 - 0xB31F7C99  push 1       
 
 - 0xB31F7C9B  call B31FFB6C //PsGetCurrentThreadId 得到目前的Tid值       
 
 - 0xB31F7CA0  push eax  //eax = Tid     
 
 - 0xB31F7CA1  call B31F2680  //這個Call內部有建立快速互斥 and 釋放快速互斥  
 
 -  
 
 -   
 
 - 0xB31F7CA6  mov edx, dword ptr [ebp-8]   edx = Pid    
 
 - 0xB31F7CA9  push edx       
 
 - 0xB31F7CAA  call B31FD3B0  //這個Call內部有 KeGetCurrentIrql(得到目前IRQL)  
 
 -                //和建立快速互斥 and 釋放快速互斥  
 
 -                //Call中又有個Call 呼叫InterlockedPushEntrySlist函數在棧頂添加一個元素     
 
 - 0xB31F7CAF  jmp short B31F7D13 ●"跳到正確"  
 
 -  
 
 -       
 
 - 0xB31F7CB1  push 4      0xB31F7CB1  push 4        
 
 - 0xB31F7CB3  mov eax, dword ptr [ebp-18]        
 
 - 0xB31F7CB6  push eax       
 
 - 0xB31F7CB7  push B320F3A0       
 
 - 0xB31F7CBC  call B31F07F0 ●這個Call出現多次 把Pid當參數傳入 回傳值 Or 0      
 
 - 0xB31F7CC1  movzx ecx, al       
 
 - 0xB31F7CC4  cmp ecx, 1       
 
 - 0xB31F7CC7  jne short B31F7D13 ●ecx = 0 跳到正確  
 
 -  
 
 -       
 
 - 0xB31F7CC9  push 4       
 
 - 0xB31F7CCB  mov edx, dword ptr [ebp-8]  //eax=Pid      
 
 - 0xB31F7CCE  push edx       
 
 - 0xB31F7CCF  push B320F3A0       
 
 - 0xB31F7CD4  call B31F07F0 ●這個Call出現多次 把Pid當參數傳入 回傳值 Or 0      
 
 - 0xB31F7CD9  movzx eax, al       
 
 - 0xB31F7CDC  cmp eax, 1  //比較eax是否=1      
 
 - 0xB31F7CDF  je short B31F7D06  ●如果eax=1 跳到正確    
 
 -  
 
 -   
 
 - 0xB31F7CE1  push 1       
 
 - 0xB31F7CE3  call dword ptr [<&ntkrnlpa.IoGetCurrentProcess>]   //得到一個PEPROCESS結構  
 
 - 0xB31F7CE9  push eax  eax=目前調用的PEPROCESS結構      
 
 - 0xB31F7CEA  call B31FD596 //Hs的判斷CALL 可能是黑名單 or 白名單      
 
 - 0xB31F7CEF  movzx ecx, al       
 
 - 0xB31F7CF2  cmp ecx, 1 //ecx和判斷       
 
 - 0xB31F7CF5  je short B31F7D04  ●如果ecx=1  跳到正確  
 
 -  
 
 -     
 
 - 0xB31F7CF7  push 1      0xB31F7CF7  push 1        
 
 - 0xB31F7CF9  mov edx, dword ptr [ebp-8] //edx=Pid       
 
 - 0xB31F7CFC  push edx //push Pid      
 
 - 0xB31F7CFD  call B31FD230  //這個Call內部有 KeGetCurrentIrql(得到目前TRQL)       
 
 -                //和建立快速互斥 and 釋放快速互斥  
 
 -                //Call中又有個Call 呼叫InterlockedPushEntrySlist函數在棧頂添加一個元素  
 
 - 0xB31F7D02  jmp short B31F7D29 ●跳到錯誤       
 
 - 0xB31F7D04  jmp short B31F7D13 ●跳到正確  
 
 -  
 
 -        
 
 - 0xB31F7D06  push 1       
 
 - 0xB31F7D08  call B31FFB6C   //PsGetCurrentThreadId    
 
 - 0xB31F7D0D  push eax      //eax=Tid        
 
 - 0xB31F7D0E  call B31F2680 //傳入Tid值的Call       
 
 - 0xB31F7D13  mov ecx, B3206968  //ecx=ProcessInformation    
 
 - 0xB31F7D18  call dword ptr [<&ntkrnlpa.InterlockedDecrement>] //在多線程中保護某個變量  
 
 - -------------------還原現場----------------------------       
 
 - 0xB31F7D1E  add esp, 40       
 
 - 0xB31F7D21  pop ebp       
 
 - 0xB31F7D22  popfd       
 
 - 0xB31F7D23  popad       
 
 - 0xB31F7D24  jmp B31F72E0   //這句Jmp  ●(8053CB90) ●原本被Hook前的Call地址 "正確"     
 
 -  
 
 -  
 
 - 0xB31F7D29  mov ecx, B3206968  ●ecx=ProcessInformation 下面接著返回錯誤代碼  "錯誤"    
 
 - 0xB31F7D2E  call dword ptr [<&ntkrnlpa.InterlockedDecrement>]  //在多線程中保護某個變量  
 
 - 0xB31F7D34  add esp, 40       
 
 - 0xB31F7D37  pop ebp       
 
 - 0xB31F7D38  popfd       
 
 - 0xB31F7D39  popad       
 
 - 0xB31F7D3A  pop eax       
 
 - 0xB31F7D3B  pop eax       
 
 - 0xB31F7D3C  pop eax       
 
 - 0xB31F7D3D  mov eax,C0000022  //返回eax = C0000022  錯誤代碼          
 
 - 0xB31F7D42  retn 14       
 
 - 0xB31F7D45  CC  int3       
 
 - 0xB31F7D46  CC  int3       
 
 - 0xB31F7D47  CC  int3       
 
 - 0xB31F7D48  CC  int3   
 
  复制代码 ----------------Hs內核函數調用表------------------------ 
- 0xB31FFB5A    |    FF25 C83620B3    |    jmp dword ptr [<&ntkrnlpa.PsSetCreateProcessNotifyRoutine> 
 
 - 0xB31FFB60    |    FF25 703620B3    |    jmp dword ptr [<&ntkrnlpa.PsGetVersion>]       
 
 - 0xB31FFB66    |    FF25 E83520B3    |    jmp dword ptr [<&ntkrnlpa.PsGetCurrentProcessId>]       
 
 - 0xB31FFB6C    |    FF25 443520B3    |    jmp dword ptr [<&ntkrnlpa.PsGetCurrentThreadId>]         
 
 - 0xB31FFB72    |    FF25 503520B3    |    jmp dword ptr [<&ntkrnlpa.stricmp>]      
 
 - 0xB31FFB78    |    FF25 543520B3    |    jmp dword ptr [<&ntkrnlpa.strrchr>]      
 
 - 0xB31FFB7E    |    FF25 643520B3    |    jmp dword ptr [<&ntkrnlpa.except_handler3>]      
 
 - 0xB31FFB84    |    FF25 7C3520B3    |    jmp dword ptr [<&ntkrnlpa.KeGetCurrentThread>]     
 
 - 0xB31FFB8A    |    FF25 AC3520B3    |    jmp dword ptr [<&ntkrnlpa.allmul>]    
 
 - 0xB31FFB90    |    FF25 B03520B3    |    jmp dword ptr [<&ntkrnlpa.alldiv>]     
 
 - 0xB31FFB96    |    FF25 B43520B3    |    jmp dword ptr [<&ntkrnlpa.wcslen>]     
 
 - 0xB31FFB9C    |    FF25 B83520B3    |    jmp dword ptr [<&ntkrnlpa.wcsrchr>]    
 
 - 0xB31FFBA2    |    FF25 C03520B3    |    jmp dword ptr [<&ntkrnlpa.KeDetachProcess>]    
 
 - 0xB31FFBA8    |    FF25 C43520B3    |    jmp dword ptr [<&ntkrnlpa.KeAttachProcess>]    
 
 - 0xB31FFBAE    |    FF25 C83520B3    |    jmp dword ptr [<&ntkrnlpa.PsLookupProcessByProcessId>]     
 
 - 0xB31FFBB4    |    FF25 DC3520B3    |    jmp dword ptr [<&ntkrnlpa.wcscpy>]    
 
 - 0xB31FFBBA    |    FF25 C43620B3    |    jmp dword ptr [<&ntkrnlpa.ObReferenceObjectByName>]     
 
 - 0xB31FFBC0    |    FF25 1C3620B3    |    jmp dword ptr [<&ntkrnlpa.ObOpenObjectByPointer>]   
 
 - 0xB31FFBC6    |    FF25 303620B3    |    jmp dword ptr [<&ntkrnlpa.wcsnicmp>]   
 
 - 0xB31FFBCC    |    FF25 403620B3    |    jmp dword ptr [<&ntkrnlpa.IoQueueWorkItem>]    
 
 - 0xB31FFBD2    |    FF25 443620B3    |    jmp dword ptr [<&ntkrnlpa.IoAllocateWorkItem>]    
 
 - 0xB31FFBD8    |    FF25 483620B3    |    jmp dword ptr [<&ntkrnlpa.IoFreeWorkItem>]    
 
 - 0xB31FFBDE    |    FF25 543620B3    |    jmp dword ptr [<&ntkrnlpa.PsIsThreadTerminating>]    
 
 - 0xB31FFBE4    |    FF25 583620B3    |    jmp dword ptr [<&ntkrnlpa.PsLookupThreadByThreadId>]  
 
  复制代码 |   
 
 
 
 |