|
|
[分享]python 版本的 dex 解析器
你是在赞 我的程序,还是 github 上的程序啊? |
|
|
|
|
|
|
|
|
[讨论]调试与反调试技术发展趋势:从冷兵器时代到热兵器时代
把新技术利用到软件中,这是发展趋势, 如果自己做不到这点,就不要去打击别人。 |
|
|
[求助]有msdn上很大的权限,应该怎么下载checked build的windows xp 呢?
这是由于M$ 和 Sun 的一些 Java 版权问题,在 check build 里面有一些 Java 版权问题。所以 不能够提供下载。 同样的问题。 visual studio 6 在 msdn 中也没有提供下载 |
|
|
[求助]能否用暴力搜索的方式找出是从哪个地址跳到这里的?
用 syser debugger, 在 05A8BCFD: FA CLI 指令上设置硬件断点 . bpmb 5a8bcfd x 如果调试器在这条指令上被断住 然后执行 lastbranch 命令就可以知道是那里跳转过来的。 还有一种方法是 使用 syser debugger 的 bpr 命令, bpr your_program_pid 5a8bcfd 1 x . 然后 lastbranch 就可以了 但是 lastbranch 在 vmware 中是不支持的 |
|
|
[求助]driver里如何获取NtReadVirtualMemory的地址?
bool CSysInfo::GetOSKernelName() { ULONG Size; CHAR szFileName[MAX_FN_LEN]; NTSTATUS ntstatus; PSYSTEM_MODULE_INFORMATION pModInfo,p; ntstatus = ZwQuerySystemInformation( SystemModuleInformation,NULL,0,&Size); if(ntstatus != STATUS_INFO_LENGTH_MISMATCH || Size==0) return false; p = (PSYSTEM_MODULE_INFORMATION) new BYTE[Size]; if(p==NULL) return false; ntstatus = ZwQuerySystemInformation( SystemModuleInformation,p,Size,0); if(!NT_SUCCESS(ntstatus)) { delete p; return false; } pModInfo = p; for(ULONG n=0; n<p->dCount; n++) { TStrCpyLimit(szFileName,(PCSTR)pModInfo->aSM[n].abName+pModInfo->aSM[n].wNameOffset,MAX_FN_LEN); for(int i =0 ;m_gNtoskrnlName[i];i++) { if(TStrICmp(szFileName,m_gNtoskrnlName[i])==0) { TStrCpyLimit(szFileName,(PCSTR)pModInfo->aSM[n].abName,MAX_FN_LEN); if(ConvertFileName(szFileName)==false) { TStrCpy(szFileName,"\\??\\"); TStrCpyLimit(szFileName,(PCSTR)pModInfo->aSM[n].abName,MAX_FN_LEN-sizeof("\\??\\")); } m_OSKernlBase = *(DWORD*)&pModInfo->aSM[n].pAddress; TStrCpy(m_OSKernelName,szFileName); ::DbgPrint("Syser : Windows kernel name '%s' base=%08x\n",(PCSTR)pModInfo->aSM[n].abName+pModInfo->aSM[n].wNameOffset,m_OSKernlBase); delete p; return true; } } } delete p; return false; } bool CSysInfo::NtcallInit() { CPEFile PEFile; char FileName[MAX_FN_LEN]; CHAR*Name=NULL; CSymbolModule* pSymbolModule; BYTE CodeBuffer[MAX_INSTR_LEN]; int n; ULONGLONG zwFunc[4]={0,0,0,0}; ULSIZE ReadLen; DWORD ServiceNum; ULONGLONG llData; TNtcallMap::IT Iter; CDbgModule* pDbgModule; TStrCpy(FileName,m_szSystem32A); TStrCat(FileName,"ntdll.dll"); PEFile.m_OpenMode|=PE_OPEN_NO_IMPORT; if(PEFile.Open(FileName)==false) { ::DbgPrint("Syser : Ntcall initialize failed to load PE file symbol %s\n",FileName); return false; } for(n=0;n<PEFile.m_ExportFuncCount;n++) { if(_GET_WORD(PEFile.m_ExportFunc[n].FuncName)=='tN') { ReadLen = PEFile.ReadImageMemory(PEFile.m_ExportFunc[n].Address,CodeBuffer,sizeof(CodeBuffer)); if(ReadLen!=sizeof(CodeBuffer))continue; if((CodeBuffer[0]==0xb8&&CodeBuffer[5]==0x8d&&CodeBuffer[0x9]==0xcd)||//2k (CodeBuffer[0]==0xb8&&CodeBuffer[5]==0xba&&CodeBuffer[0xa]==0xff&&CodeBuffer[0xb]==0x12)||//xp vista windows7 (CodeBuffer[0]==0xb8&&CodeBuffer[5]==0xba&&CodeBuffer[0xa]==0xff&&CodeBuffer[0xb]==0xd2)//2003 ) { ServiceNum = *(DWORD*)&CodeBuffer[1]; llData = PEFile.m_ExportFunc[n].Address-PEFile.m_ImageBase; llData <<= 32; llData |= ServiceNum; Iter = m_NtcallMap.InsertUnique(PEFile.m_ExportFunc[n].FuncName,llData); if(Iter==m_NtcallMap.End())continue; } } } Iter = m_NtcallMap.Find("NtQueryVirtualMemory"); if(Iter!=m_NtcallMap.End()) zwFunc[3]=*Iter; PEFile.Close(); if(m_OSKernelName[0]) Name = m_OSKernelName; if(Name==NULL) { if(gpSyser->m_pSysDebugger==NULL) return true; pDbgModule = gpSyser->m_pSysDebugger->GetModule((ULPOS)KeSetEvent); if(pDbgModule==NULL) return true; Name = (char*)pDbgModule->m_ModuleFullName; } PEFile.m_OpenMode|=PE_OPEN_NO_IMPORT; if(PEFile.Open(Name)==false) { ::DbgPrint("Syser : Ntcall initialize failed to load PE file symbol %s\n",(char*)Name); return true; } for(n=0;n<PEFile.m_ExportFuncCount;n++) { if(_GET_WORD(PEFile.m_ExportFunc[n].FuncName)=='wZ') { ReadLen = PEFile.ReadImageMemory(PEFile.m_ExportFunc[n].Address,CodeBuffer,sizeof(CodeBuffer)); if(ReadLen==sizeof(CodeBuffer)) { if(CodeBuffer[0]==0xb8||CodeBuffer[5]==0x8d||CodeBuffer[0x9]==0x9c||CodeBuffer[0xa]==0x6a) { ServiceNum = *(DWORD*)&CodeBuffer[1]; llData = PEFile.m_ExportFunc[n].Address-PEFile.m_ImageBase; llData <<= 32; llData |= ServiceNum; Iter = m_NtcallMap.InsertUnique(PEFile.m_ExportFunc[n].FuncName,llData); if(zwFunc[0]==0) zwFunc[0]=llData; else if(zwFunc[1]==0) zwFunc[1]=llData; else if(zwFunc[2]==0) zwFunc[2]=llData; } } } } if(zwFunc[0] && zwFunc[1]&&zwFunc[2]&&zwFunc[3]) { ULONGLONG first,second,addr1,addr2,len1,len2,len3; if((zwFunc[0] & 0xffffffff)>(zwFunc[1] & 0xffffffff)) { first = zwFunc[0] & 0xffffffff; addr1 = (zwFunc[0]>>32) & 0xffffffff; second = zwFunc[1] & 0xffffffff; addr2 = (zwFunc[1]>>32) & 0xffffffff; } else { first=zwFunc[1] & 0xffffffff; addr1 = (zwFunc[1]>>32) & 0xffffffff; second=zwFunc[0] & 0xffffffff; addr2 = (zwFunc[0]>>32) & 0xffffffff; } len1= (addr1-addr2) / (first-second); if((zwFunc[1] & 0xffffffff)>(zwFunc[2] & 0xffffffff)) { first = zwFunc[1] & 0xffffffff; addr1 = (zwFunc[1]>>32) & 0xffffffff; second = zwFunc[2] & 0xffffffff; addr2 = (zwFunc[2]>>32) & 0xffffffff; } else { first=zwFunc[2] & 0xffffffff; addr1 = (zwFunc[2]>>32) & 0xffffffff; second=zwFunc[1] & 0xffffffff; addr2 = (zwFunc[1]>>32) & 0xffffffff; } len2= (addr1-addr2) / (first-second); if((zwFunc[0] & 0xffffffff)>(zwFunc[2] & 0xffffffff)) { first = zwFunc[0] & 0xffffffff; addr1 = (zwFunc[0]>>32) & 0xffffffff; second = zwFunc[2] & 0xffffffff; addr2 = (zwFunc[2]>>32) & 0xffffffff; } else { first=zwFunc[2] & 0xffffffff; addr1 = (zwFunc[2]>>32) & 0xffffffff; second=zwFunc[0] & 0xffffffff; addr2 = (zwFunc[0]>>32) & 0xffffffff; } len3= (addr1-addr2) / (first-second); addr2=0; if(len2 == len1 || len2 == len3) { if((zwFunc[0] & 0xffffffff)>(zwFunc[3] & 0xffffffff)) { first = zwFunc[0] & 0xffffffff; second = zwFunc[3] & 0xffffffff; addr1 = (zwFunc[0] >> 32) & 0xffffffff; addr2 = addr1 -(first - second)*len1; } else { first = zwFunc[3] & 0xffffffff; second = zwFunc[0] & 0xffffffff; addr1 = (zwFunc[0] >> 32) & 0xffffffff; addr2 = addr1 + (first - second)*len1; } } if(m_OSKernlBase) { addr2+=m_OSKernlBase; m_pZwQueryVirtualMemory = *(ZWQUERYVIRTUALMEMORY*)&addr2; DbgPrint("Syser : Find ZwQueryVirtualMemory address %08x\n",m_pZwQueryVirtualMemory); } } PEFile.Close(); return true; } |
|
|
[求助]能否用暴力搜索的方式找出是从哪个地址跳到这里的?
先设置一个硬件断点,然后使用最后分支指令可以知道是哪里跳转过来的。 |
|
|
[求助]如何用WINDBG中断于DriverEntry
用 syserdebugger 调试, 直接使用 bpload xxxxx.sys 就可以了。 当加载的时候就断在 DriverEntry 了简单的很 |
|
|
[求助]Microsoft Office Web Components. CVE-2009-1136
首先我们修改 var b = pingfan("%u0b0cଌ"); 到 var b = pingfan("쳌쳌"); 修改这个语句的目的是 把 shellcode 的指令都改成 int3 指令 这样改成 int3 以后能保证shellcode 的被执行的第一条指令是 int3. 这样你就可以在 syserdebugger 里面使用 i3here on 命令当遇到 int3 指令的时候 弹出 syser debugger. 修改完这个 shellcode 以后我们可以用 ie 打开这个网页。如果shellcode 被正常执行的话。Syser debugger 会在执行第一条 shellcode 执行的时候弹出。 在 SyserDebugger 被激活的时候 EIP 是停在第一个被执行的 shellcode 的下一条执行。 因为我们把绝大多数的执行都变成了 int3 所以在 syserdebugger 弹出的时候你看到的都是 int3 指令。 在我的机器上 这个 EIP == 11cf6a4b ;这个值可能是不同的在不同的时候。 正常情况下 只有几种情况跳转到 shellcode . 从指令上来说可能就几种情况。 1 Jmp xxxxxx 2 Jmp [xxxxx] 3 call xxxxx 4 call [xxxxx] 5 ret 6 Jcc xxxxxxx 这个时候我们可以看 stack 窗口。 在 ESP 所指的地址中保存了的内容为 75c62e79 (我的系统是 英文版本的 xp + sp2 。我们用 u 75c62e79 看反汇编代码。 发现这地址的上一条指令是 75c62e76 ff511c call [ecx+1c] ; 我们发现了最终跳转到 shellcode 的代码是在 75c62e76 这个call 执行之后的某个指令跳转到shellcode 的 . 同时我们发现当前的 ECX 寄存器是 11cf6a4a , 前面我已经提到过 eip 是停在第一个 被执行的执行之后,就是 EIP == 11cf6a4b ,我们可以看到 ecx 和 eip 正好是差一个字节。 恰好 int3 指令是 一个字节,这个时候我们可以猜测 跳转到第一个 shellcode 的指令可能是 jmp ecx , 可能有人会问,我们为什么不猜测是 call 指令呢。 如果是call 执行一定会把返回地址先压入到堆栈。 我们可以通过 stack 命令看一下函数调用栈。我们发现堆栈里面最后一个地址对应的汇编是 75c62e76 call [ecx+1c] 就是上面提到的指令。 同时我们发现 [ecx+1c] 里面的值不等于 11cf6a4a 所以我们可以断定 最后跳转到shellcode 的执行不是 call. 所以我们可以把断点下在 75c62e76 这个地址。 例如 bpmb 75c62e76 x . 我们可以先结束本次的设置硬件断点后重新启动 IE 进行调试。 在我的机器上 当 用 IE 去浏览包含 shellcode 的网页时这个断点 会在第14 次以后跳转到 shellcode 上执行。 我们可以再一次重新调试这个 shellcode , 在第14次的时候,我们要单步更进 call [ecx+1c] 这条指令。 在我的机器上 ecx 的值是 7d73c270 ,[ecx+1c] 里面的值是 715a138 >cv 7D51A138 8B442404 MOV EAX,[ESP+04] 7D51A13C 50 PUSH EAX 7D51A13D F7401C80000000 TEST [EAX+1C],00000080 7D51A144 0F85ABA60800 JNZ 7D5A47F5 7D51A14A 83C00C ADD EAX,+0C 7D51A14D 8B08 MOV ECX,[EAX] 7D51A14F 894C2408 MOV [ESP+08],ECX 7D51A153 8B4804 MOV ECX,[EAX+04] 7D51A156 8B491C MOV ECX,[ECX+1C] 7D51A159 58 POP EAX 7D51A15A C7402007000000 MOV [EAX+20],00000007 7D51A161 FFE1 JMP ECX 7D51A163 90 NOP 在这里我们发现了正好有一个 jmp ecx . 正好和我们的猜测是吻合的。 我们可以把断点设置在 7D51A161 FFE1 JMP ECX 上面 然后我们就发现 跳转到 shellcode 的执行就是 7D51A161 FFE1 JMP ECX |
|
|
[注意]有长春的朋友吗?
我是长春的。 |
|
|
|
|
|
[求助]动态库输出函数名是编号该如何让其恢复成有意义的名称?
第3方的就没法搞了,没有PDB也没有 def 这个就没法搞了。只能自己分析代码了 |
|
|
[求助]动态库输出函数名是编号该如何让其恢复成有意义的名称?
一个只用 序号导出 的 dll 的例子 关键是 def 文件 LIBRARY ; For Win32 DLLs, only EXPORTs really required. EXPORTS ??0Ctestdll@@QAE@XZ @ 2 NONAME ?fntestdll@@YAHXZ @ 3 NONAME ?ntestdll@@3HA @ 4 NONAME DATA ??4Ctestdll@@QAEAAV0@ABV0@@Z @ 1 NONAME |
|
|
[求助]动态库输出函数名是编号该如何让其恢复成有意义的名称?
是微软的 dll 吗?把文件名告诉我, |
|
|
[求助]动态库输出函数名是编号该如何让其恢复成有意义的名称?
你的动态库的名字? 可以帮你看看 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值