|
看雪论坛访问速度调查
很慢, 勉强可以接受 |
|
[求助]为什么我的ollyDBG和教程里不一样?
你要执行jnz这条指令后才可以. 按一下F7吧! |
|
[求助]初学脱壳求助
文件变大的问题, 可看精华8中CCDebuger写的"浅谈程序脱壳后的优化", 写的非常好! 手工找大小如下, OD载入 notepad.exe (W2KSP4) 1.) 起始地址 :01000000 01000000 开始的1C bytes 为 DOS EXE header, 不用管; 0100003C 中的DD 为 Offset to PE signature, 本例中为 000000D8, 所以PE header 从 010000D8 开始 2.) PE header: 010000D8 ... PE+0050 为 SizeOfImage, 本例中为 01000128 DD 00010000 ; SizeOfImage = 10000 (65536.) 3.) \winnt\system32\notepad.exe (on W2KSP4) ====================== Memory map ========================== Address Size Owner Section Contains Type Access Initial Mapped as ...... 01000000 00001000 notepad 0100 PE header Imag R RWE <======= 01001000 00007000 notepad 0100 .text code,imports Imag R RWE 01008000 00002000 notepad 0100 .data data Imag R RWE 0100A000 00006000 notepad 0100 .rsrc resources Imag R RWE ...... ============ Dump - notepad 01000000..01000FFF ================ 01000000 4D 5A ASCII "MZ" ; DOS EXE Signature 01000002 9000 DW 0090 ; DOS_PartPag = 90 (144.) 01000004 0300 DW 0003 ; DOS_PageCnt = 3 01000006 0000 DW 0000 ; DOS_ReloCnt = 0 01000008 0400 DW 0004 ; DOS_HdrSize = 4 0100000A 0000 DW 0000 ; DOS_MinMem = 0 0100000C FFFF DW FFFF ; DOS_MaxMem = FFFF (65535.) 0100000E 0000 DW 0000 ; DOS_ReloSS = 0 01000010 B800 DW 00B8 ; DOS_ExeSP = B8 01000012 0000 DW 0000 ; DOS_ChkSum = 0 01000014 0000 DW 0000 ; DOS_ExeIP = 0 01000016 0000 DW 0000 ; DOS_ReloCS = 0 01000018 4000 DW 0040 ; DOS_TablOff = 40 0100001A 0000 DW 0000 ; DOS_Overlay = 0 . . . 0100003C D8000000 DD 000000D8 ; Offset to PE signature <======= . . . 010000D8 50 45 00 00>ASCII "PE" ; PE signature (PE) 010000DC 4C01 DW 014C ; Machine = IMAGE_FILE_MACHINE_I386 010000DE 0300 DW 0003 ; NumberOfSections = 3 010000E0 7C65F637 DD 37F6657C ; TimeDateStamp = 37F6657C 010000E4 00000000 DD 00000000 ; PointerToSymbolTable = 0 010000E8 00000000 DD 00000000 ; NumberOfSymbols = 0 010000EC E000 DW 00E0 ; SizeOfOptionalHeader = E0 (224.) 010000EE 0F03 DW 030F ; Characteristics = EXECUTABLE_IMAGE|32BIT_MACHINE|RELOCS_STRIPPED|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED|DEBUG_STRIPPED 010000F0 0B01 DW 010B ; MagicNumber = PE32 010000F2 05 DB 05 ; MajorLinkerVersion = 5 010000F3 0C DB 0C ; MinorLinkerVersion = C (12.) 010000F4 00660000 DD 00006600 ; SizeOfCode = 6600 (26112.) 010000F8 006E0000 DD 00006E00 ; SizeOfInitializedData = 6E00 (28160.) 010000FC 00000000 DD 00000000 ; SizeOfUninitializedData = 0 01000100 20640000 DD 00006420 ; AddressOfEntryPoint = 6420 01000104 00100000 DD 00001000 ; BaseOfCode = 1000 01000108 00800000 DD 00008000 ; BaseOfData = 8000 0100010C 00000001 DD 01000000 ; ImageBase = 1000000 01000110 00100000 DD 00001000 ; SectionAlignment = 1000 01000114 00020000 DD 00000200 ; FileAlignment = 200 01000118 0500 DW 0005 ; MajorOSVersion = 5 0100011A 0000 DW 0000 ; MinorOSVersion = 0 0100011C 0500 DW 0005 ; MajorImageVersion = 5 0100011E 0000 DW 0000 ; MinorImageVersion = 0 01000120 0400 DW 0004 ; MajorSubsystemVersion = 4 01000122 0000 DW 0000 ; MinorSubsystemVersion = 0 01000124 00000000 DD 00000000 ; Reserved 01000128 00000100 DD 00010000 ; SizeOfImage = 10000 (65536.) <======= 0100012C 00060000 DD 00000600 ; SizeOfHeaders = 600 (1536.) 01000130 B4E80000 DD 0000E8B4 ; CheckSum = E8B4 01000134 0200 DW 0002 ; Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI 01000136 0080 DW 8000 ; DLLCharacteristics = 8000 01000138 00000400 DD 00040000 ; SizeOfStackReserve = 40000 (262144.) 0100013C 00100000 DD 00001000 ; SizeOfStackCommit = 1000 (4096.) 01000140 00001000 DD 00100000 ; SizeOfHeapReserve = 100000 (1048576.) 01000144 00100000 DD 00001000 ; SizeOfHeapCommit = 1000 (4096.) 01000148 00000000 DD 00000000 ; LoaderFlags = 0 . . . |
|
|
|
[求助]爆破后显示成功实际上仍不行!
005B29A5 处后有两条路, 每条路碰到 _mbscmp, 如果 s1, s2不一样, 就gameover 爆破点应选在 _mbscmp 处; 可改 push s2 push s1 call _mbscmp 为 push s1 push s1 call _mbscmp 追注册码要看是否有明码, 否则只能跟 s1, s2 都是怎么来的 |
|
[求助]实在是看不出这是个啥壳!(一个简单虚拟机保护)
一简单的虚拟机, 虚拟机入口为0041E164, 带一参数, 为 虚拟指令的起始地址. 0041E16B 8B7424 28 mov esi, dword ptr [esp+28] // 取参数, 虚拟指令的起始地址 0041E16F FC cld 0041E170 BF 86DF4100 mov edi, 0041DF86 0041E175 033424 add esi, dword ptr [esp] 0041E178 AC lods byte ptr [esi] // 取一条指令 0041E179 0FB6C0 movzx eax, al 0041E17C FF3485 00904200 push dword ptr [eax*4+429000] ; // 每条指令对应的地址 0041E183 C3 retn // 跳去执行指令 共 256 条 虚拟指令, 对应的执行代码地址表在429000-4293FF中, 共 256 组代码. 其中, 虚拟指令3F 相当于 retn, 比较关键 脱壳很简单, bp GetVersion 就可找到OEP: 00406A79, 与upx难度一样 把它的虚拟机全搞明白, 可不是一时三刻的功夫可搞定的. |
|
[求助]Skype新版本脱壳(3.0)问题,请教fly版主和blackeyes达人。
Skype 应该说没壳, 但有它自己的保护. 可以做出无解码的可执行文件. 但很麻烦. 《Silver Needle in the Skype》我早看过. 说的都对, 但没有太多的细节. 最讨厌的是, 即使是变成明文的skype中, 仍然有非常多的小片段的自解码的代码, 至少有100多处, 每处运行时都要靠附近的正确的内存校验值解码才能正确运行. 其二, Skype的可执行文件很大. 反编译特费时间, 调试也特慢 其三, Skype升级很快, 你的一个版本还没弄好, 它就要升级, 否则就运行的不对. 其四, Skype是免费的, 和它较劲不值. 据说Skype的开发人员中, 有一团队是专门做anti-crack的, 个人玩这个, 要以一抵十才行, 太累. |
|
[结束][第二阶段◇第三题]看雪论坛.珠海金山2007逆向分析挑战赛
越来越费时间了. |
|
|
|
[原创]第二阶段第一题的答案
只加说明, 不重传附件: 1. 溢出是在下面的CODE中: 004002EE |. F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] // ESI = VirtualAlloc() 返回的动态地址, 设为XXXXXXXX 当 ECX >= 0x0D 时, 上面的操作会使返回地址被覆盖, 004002F0 |> \5F pop edi 004002F1 |. 33C0 xor eax, eax 004002F3 |. 5E pop esi 004002F4 |. C9 leave 004002F5 \. C3 retn // 正常返回0x00400383 2. DWORD 个数(ECX) 由下面计算得到: ECX = (0x1A-EAX) * EAX - 0x9C 只有当EAX=0x0D时, ECX将等于0x0D, 满足条件. 而当EAX为其它值时, ECX要么太小; 要么太大, 会使 rep movs 越界; 或者是负数. 都不满足条件 3. 问题变为, 文件的前两个DWORD, 设为D1, D2. 要满足下面的条件 64 bit 无符号运算: ( ((D2<<0x20)|D1) * 0x4847464569948F1B % 0x5BE6FF82A5164785 ) & 0xFFFFFFFF == 0x0000000D // (等式1) 设 T2:T1 = (D2:D1) * 0x4847464569948F1B // (a) U2:U1 = (T2:T1) % 0x5BE6FF82A5164785 // (b) 其中T2, D2, U2 为高32bit, T1, D1, U1为低32bit, 则U1=0x0000000D 由 (b) 可得 T1 = 0x0000000D, T2: from 0x00000000 to 0x5BE6FF82 (d) T1 = 0x0000001A, T2: from 0x5BE6FF82 to 0xB7CDFF04 (e) T1 = 0x00000027, T2: from 0xB7CDFF04 to 0xFFFFFFFF (f) 由 (a) 可得 T1 = D1 * 0x69948F1B (g) 由 (d),(e),(f) 和(g) , 把 D1 from 0x0000000 to 0xffffffff 验证一遍. 只有三个值 满足条件: 0x8AD397F7, .. ,.. 其中只有第一个值0x8AD397F7最好(自己验证, 在此略过), 按下面的变化 004002CC |> /8031 1C /xor byte ptr [ecx], 1C 004002CF |. |8A11 |mov dl, byte ptr [ecx] 004002D1 |. |3051 01 |xor byte ptr [ecx+1], dl 004002D4 |. |41 |inc ecx 004002D5 |. |41 |inc ecx 004002D6 |. |4F |dec edi 004002D7 |.^\75 F3 \jnz short 004002CC 0x8AD397F7 ==> EB, 7C, CF, 45 EB, 7C ==> jmp short $+0x80 这时候 D2==0x00000001 就能使等式1 成立. 4. 所以问题就成在 004002F5 时能返回ESI中的地址XXXXXXXX就好了. XXXXXXXX 在栈中, 与正常返回地址的关系如下: [ESP+...]: 00400383 XXXXXXXX 如果将返回地址覆盖成0x004002F5, 将使得 004002F5 \. C3 retn 被执行, 这样一来, 就会到xxxxxxxx处去运行 5. 下面就是写CODE, call MessageBox, 然后返回0x00400397继续执行, 只要ESP, EBP 恢复正确就行. |
|
|
|
[求助]感觉它的加密方式非常有特点,解了一半的软件,解不下去了。
限制应该是在这里: \HKEY_CURRENT_USER\Software\JGsoft\RegexBuddy3\Demo\Date \HKEY_CURRENT_USER\Software\JGsoft\RegexBuddy3\Demo\Days \HKEY_CURRENT_USER\Software\JGsoft\RegexBuddy3\Demo\Msg 判断应该是: mov eax, dword ptr [007511BC] cmp dword ptr [eax], 00000007 jle ... 共四处 |
|
|
|
|
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值