|
|
[转帖]Exeinfo PE 0.0.4.9
Exeinfo PE 0.0.5.0
|
|
|
[转帖] VMProtect.3.2 (Build 976) KeyGen by:Xjun
感谢 StriveXjun、sinkay、Alfik |
|
|
[分享]Hidden Start - NTWind Software
还要爆破 hstart.exe 或 hstart64.exe,软件才能用! |
|
|
|
|
|
|
|
|
[求助]如何patch固定机器码呢?
要固定这个机器码,很简单:
1. 将安装文件夹中"acc"和"reg"文件夹里的两个diskno.exe程序改名,或备份后删除;
2. 修改"acc\SYSTEM.INI"文件里disk节serialno的内容为你想固定的机器码;
[disk] serialno=544455379
3. 运行主程序,“注册”,输入你的注册码。
相关信息
主程序和其他功能模块调用kernel32.CreateProcessA带参数运行diskno.exe,获得本机硬盘序列号(写到或从SYSTEM.INI读取):
diskno.exe "C:\Program Files\金禾电子\金禾税务师事务所代理记账软件\acc\system.ini"
它会调用kernel32.GetVolumeInformationA取卷序列号。这里第一个参数:
string drivers if drivers = "C" then drivers = "D" else drivers = "C" end if
代码这样写是有问题的,如果软件安装在C:盘,又没有D:逻辑卷的话,diskno.exe就会失败,报"硬盘系列号没有获得,请和软件供应商联系!"。
所以serialno实际上是逻辑卷的序列号(Volume Serial Number),544455379对应C:盘或D:盘的卷序列号:2073-BAD3。
注册部分,用一个自定义函数计算本机注册码,然后与输入的进行字符串比较:
本机注册码 = 函数(硬盘序列号, 版本, 帐套数, 每帐套户数, 可结帐月份数);
我按此函数用C写出的keygen与它的结果有时不一致,仔细检查发现它这个函数里又有一个错误!
("544455379", 1, 300, 300, 12)对应的注册码应该是:FMKWKBFAMAVD。
PowerBuilder的代码没有秘密可言,估计现在也基本没人用它写程序了,但调试PCODE的程序需要技巧和经验。
最后于 2018-5-25 17:00
被MistHill编辑
,原因: 排版出现多余tag
|
|
|
[原创]vmp3.0.9全保护拆分解析
你这个样本是有点特殊: API调用总是在这个vCall上;通常不应该“固定”在某个vCall上。 我在“一个反调试有特色的CrackMe”里提到看过的两个VMP3的样本v301和v309,外壳部分(vmp1)都各有11个vCall,按入口地址依次标记为vCall1~vCallB。 从壳的入口到第一个vGetHash(v301是一个GetHash函数)之间,所有vCall的记录都为12次,但不是总在同一个vCall上: v301样本 1) vCall6 kernel32.LocalAlloc ; size 0xA4; for anti data! 2) vCallA kernel32.GetCurrentProcess 3) vCall5 kernel32.IsDebuggerPresent 4) vCallB kernel32.CheckRemoteDebuggerPresent 5) vCall2 ntdll.ZwQueryInformationProcess ; ProcessDebugPort 6) vCall8 kernel32.GetCurrentThread 7) vCallB ntdll.ZwSetInformationThread 8) vCall4 ntdll.ZwQuerySystemInformation ; SystemDebuggerInfo 9) vCall5 ntdll.ZwQuerySystemInformation ; SystemModuleInfo, get buffer size 10) vCall8 kernel32.LocalAlloc ; alloc buf 11) vCall4 ntdll.ZwQuerySystemInformation ; SystemModuleInfo, query 12) vCall2 kernel32.LocalFree ; free buf v309样本 1) vCall1 kernel32.LocalAlloc ; size 0xA4; for anti data! 2) vCall3 kernel32.GetCurrentProcess 3) vCall4 kernel32.IsDebuggerPresent 4) vCall7 kernel32.CheckRemoteDebuggerPresent 5) vCall4 ntdll.ZwQueryInformationProcess ; ProcessDebugPort 6) vCall4 kernel32.GetCurrentThread 7) vCall7 ntdll.ZwSetInformationThread 8) vCall8 ntdll.ZwQuerySystemInformation ; SystemDebuggerInfo 9) vCall7 ntdll.ZwQuerySystemInformation ; SystemModuleInfo, get buffer size 10) vCall1 kernel32.LocalAlloc ; alloc buf 11) vCall6 ntdll.ZwQuerySystemInformation ; SystemModuleInfo, query 12) vCallA kernel32.LocalFree ; free buf 这两个样本在vmp0段解密后,它的vCall都各多达110个!即壳代码部分VM的handler数要远远少于用户代码保护部分VM的handler。 我对VMP3研究得还不多,也许您可以把样本放上来大家看看。 |
|
|
[求助]怎样查找VMP加密后程序调用了那些API?
如果那段代码未被VM,还原IAT。 如果代码被VM了,1) VMP2断vRet;2) VMP3断vRet和vCall。
最后于 2018-5-9 10:59
被MistHill编辑
,原因:
|
|
|
[原创]vmp3.0.9全保护拆分解析
Call R32 在vCall里。 VMP3的vCall与VMP2有很大不同,VMP2的vCall只能调用虚拟子程序/函数,VMP3的vCall可以直接调用API,比较方便。感觉VMP3的vCall handler是从Oreans(TMD/WL/CV)“抄”来的! vCall中,解码vEIP一字节为参数个数,然后将vESP(EBP)处的参数依次入栈,最后Call R32完成调用,返回结果EAX保存在[EBP]。 而且VMP3 vCall的入口有好多个,这些vCall handler解码算法也有差异;VMP2时只有一个vCall。 另外,ZwQuerySystemInformation[SystemInformationClass::SystemModuleInformation]取得系统模块列表后,将模块名与解密后的字符串"sice.sys"、"siwvid.sys"、"ntice.sys"、"iceext.sys"和"syser.sys"进行比较,来完成检测。 |
|
|
[转帖]一个反调试有特色的CrackMe
请教就不敢了,大家一起讨论、共同进步。
VMP3出来这么久了,还真没研究过。这两天找了样本来看。
VMP2的时候,有4张CRC校验表,校验顺序依次是:
1. File Check
用API CreateFile, CreateFileMapping, and MapViewOfFile把自身映射到内存,进行校验。
表通常含4条记录,这个表本身不做校验,可随便改。
2. Memory Check #1
表的记录项有几十到数百不等,表自身有校验。如果改了其中的条目,需要修改表的CRC值。
这两个检查发生在用户代码、数据、资源段解密之前。
3. Memory Check #2
含有数百到数千条记录,校验在程序完全解压缩、解密后进行,对用户程序进行校验。这个表自身的CRC是VM中的一个立即数,不好改,通过修补vGetHash/vCheck("VMP分析插件v1.4"的术语)容易一些。
这三个校验位于vmp1中,即壳代码段。按VMProtect官方文档,一个代码段对应一个VM,所以用VMP保护的程序通常有两个VM:vmp1和vmp0。
4. Random Memory Check
如果在保护时,勾选了"VM integrity check",就会有这个检查。
位于vmp0中,表的结构与前三个有所不同,记录格式是{unsigned char *offsetRVA, unsigned char length, unsigned int neghash}。
其中只有offsetRVA是加密的,校验不过不会报“文件损坏”,程序会死掉。因为是:返回地址+hash+neghash,如果hash+neghash不为0,就不知道跑哪里去了。
"Memory Check #1"和"Memory Check #2"中的记录不总是有效的,如果offsetRVA解密后为-0x1,则这是一条结束记录。可利用这个特点,把这条记录放到第一条的位置,整个表就废了。只需要修表自身的CRC。
VMP3看了两个样本,前三个校验是类似的,最后一个没时间看,不知道是怎么个情况。
VMP3的三个表都有的,顺序有所不同:"Memory Check #1"、"File Check"、"Memory Check #2"。
第一个样本:Sound的“VMProtect Ultimate v3.0.1.465 Unpack me”
奇怪的是,它没有vGetHash handler,而是一个GetHash函数,在0x005F5661处。
三张表的位置:
Memory#1 005FC85D File 0060C99D Memory#2 00527D41
三张表的位置: Memory#1 005F2A9A File 00793741 Memory#2 005C8601 VMP2的vGetHash只有一个,算法一直未变。其间可能有多个分支。 v301例子是一个函数,而v309例子有11个vGetHash!(以下的v301和v309仅针对这两个样本。) 这三个hash算法都不同,v309的非常象标准的CRC32算法。 v309的11个vGetHash handler入口: 1) 005D8131 2) 005DADF4 ; for Memory Check #2 #E6+1 3) 005DC448 4) 005DD26C 5) 005DD62E 6) 005DEFF4 7) 005E06BF 8) 005E29FF 9) 005E4B60 ; for File Check #04 10) 005E6771 11) 005E6937 ; for Memory Check#1 #18+1 这11个vGetHash虽然入口不同,有意思的是,在length>1的情况下,都会跳到3)的出口。 VMP3不再像VMP2那样有一张加密的Handler入口表和Dispatcher,VMP3的每个handler前半部分是完成其功能,后半部分是解密下一个handler基于EDI的偏移。EDI在VMP2时是VM_CONTEXT,现在是上一个handler的入口。 这和Oreans的VM handler就非常相似了!handler数不再局限于Handler表265项的限制,通常VMP2合并相同的入口地址后,只剩下几十个hadnler。 Oreans的 Tiger VM 基本上有1000多个handler,相同功能的handler除了入口地址不同,解码算法也有差异。VMP2时,一个程序中VM0和VM1相同功能的handler除了入口地址不同,解码算法是一样的。 另外v309的handler代码是乱序的,跳来跳去,与 Tiger Black 相似。 这些表的offsetRVA、length和hash在VMP2时,解密算法有时会非常复杂、且各不相同,前三种校验需要找出9种算法。 VMP3好像简化了,从看过的这两个例子来讲,hash未加密。offsetRVA和length都是简单地异或一个IMM32常数:v301是0x29F04A81,v309是0x75695A20。 例如,"Memory Check #1" v301(XOR 0x29F04A81):
Table Addr OffsetRVA Lenght Hash Dec. Off Dec. Len
---------- --------- ------ ---- -------- --------
005FC85D 29EF82E8 29F04BF5 1A686282 -> 001FC869 00000174
005FC869 29D118CD 29F04A8D 40D9EDE3 -> 0021524C 0000000C
005FC875 29F04BDD 29F04ABD 8FCCEB28 -> 0000015C 0000003C
...
v309(XOR 0x75695A20):
Table Addr OffsetRVA Lenght Hash Dec. Off Dec. Len
---------- --------- ------ ---- -------- --------
005F2A9A 75767086 75695B00 5AAE2075 -> 001F2AA6 00000120
005F2AA6 75695A04 75695B30 766F7A15 -> 00000024 00000110
005F2AB2 757648F4 75695A2C 5283700C -> 001F12D4 0000000C
...
啰嗦这么多,回到您的问题。附件中"TraceHandlers.txt"记录的是样本v309两次vGetHash("Memory Check #1")之间所有的handler执行过程。 助记符同"VMP分析插件v1.4":pushimm32==vPushIMM4,readmem32==vReadMemDs4。 记录中按列从左至右依次是:序号、vEIP(ESI)、handler入口地址、助记符、关键数据。共4个单元块,由vJmp(vJcc)过渡。 第一个单元进行上一次vGetHash的hash比较,视结果跳不同的地址;接下来是下个vGetHash的数据准备过程。 重点在第三个单元,最初的Table地址005F2AA6这里没记录到出处,应该在前面有个vPushIMM4,保存在vReg中,现在直接从vReg读取。 然后vAdd的偏移04,08都是vPushIMM4,用vReadMemDs4读加密的OffsetRVA和Lenght。 这些应该和VMP2差不多,您说没找到pushimm32和readmem32,也许没找准,或具体情况不一样。 从记录看,这些handler的执行过程基本都是有效指令,VMP2有很多垃圾handler穿插其中。 还可以看到解密OffsetRVA和Lenght的一条汇编指令"XOR"需要4个vNand4 handler来模拟;汇编指令"BSWAP"就需要更多的handler来模拟了! 对这个话题感兴趣的人,如果不熟悉,可参阅我以前回在tuts4you关于VMP2的两个帖子。后来看雪有人问过,不记得回在哪个帖子了。 |
|
|
[转帖]一个反调试有特色的CrackMe
原来这样!不知这个CM谁写的,当时觉得第二次NtQueryInformationProcess Call有创意,学习了! 不过那个DLL被VM了,估计很多人不知道是哪里被检测到。 |
|
|
[分享]Detours Version 3.0 Build_341 支持x64,arm,arm64
Detours 4.0.1
|
|
|
[转帖]Scientific.Toolworks.Understand.v4.0.870.Incl.Keygen-AMPED
Scientific.Toolworks.Understand.V5.0.935.x86/x64.Incl.Keygen-AMPED
或者直接从官网下载安装包,用AMPED's Keygen。
|
|
|
[分享]Hiew 8.63 (31 Jan 2018) Retail
谢谢,@Alfik |
|
|
[原创]如何分析虚拟机(2):进阶篇 VMProtect 2.13.8
不错!符号执行有点意思。 |
|
|
[求助]请教如何跳过程序中的license验证?
从密码学来讲,这个软件的注册验证部分写得还是不错的。
文件license.lic经ECC解密得到与证书对应的机器码字符串"E9-64-1E-5C-A3-5D-62-09"。
然后与函数@Getmachineinfo@GetMachineID$qqrv,(VA 0040647C) 取得的本机机器码字符串比较。
比较相同,进主界面,选择图片、制作开机画面。
否则出“注册对话框”。
取本机机器码那个函数也很有意思,用到了MD5等函数,可以看看。
使用的是TomCrypt库。要计算ECC-521的key是非常困难的,只能替换了。
可是百密一疏,其脆弱在于简单地用字符串比较函数进行机器码比对,可以爆破试试!
00402D4C 8D55 D0 LEA EDX, [EBP-0x30] ; 解密得到的机器码 00402D4F 8D45 E4 LEA EAX, [EBP-0x1C] ; 本机机器码 00402D52 E8 D1FC1000 CALL 00512A28 ; StrCmp 00402D57 50 PUSH EAX ; 0 相同; nozero else 00402D58 8D45 D0 LEA EAX, [EBP-0x30] 00402D5B 836D C4 02 SUB DWORD PTR [EBP-0x3C], 0x2 00402D5F BA 02000000 MOV EDX, 0x2 00402D64 E8 6FEDFFFF CALL 00401AD8 ; FreeStr 00402D69 59 POP ECX 00402D6A 84C9 TEST CL, CL 00402D6C 74 19 JE SHORT 00402D87 ; <- *** 相同,跳过注册对话框
跳过程序license验证的方法:
找个你熟悉的十六进制编辑软件,将程序虚拟地址00402D6C(文件偏移0000236C)处的一字节:74,改为EB。即3楼@厉害了我的谁 的方法。
没仔细看代码的其余部分,不知道程序能否正常运行。
|
|
|
[分享]Source Insight 4.0.0096 Patched
有人问破解方法,简单说下。
一.替换公钥 0063F648 ASCII "-----BEGIN PUBLIC KEY-----...",length: 0x1C3 二.更新信息黑名单检查 程序会自动或手动"Check for Updates...",下载更新信息: 9dbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4G2N6i4u0U0k6h3W2F1M7$3W2Y4K9s2c8Q4x3X3g2U0L8$3#2Q4x3V1k6H3N6h3u0Q4x3V1k6$3y4q4)9J5c8Y4u0W2L8r3g2S2M7$3g2Q4x3V1k6K6K9e0c8#2M7r3c8S2N6r3g2Q4x3X3g2K6K9i4j5`.
重命名为:
Windows XP: "\Documents and Settings\UserName\Local Settings\Application Data\Source Insight\4.0\si4update.dat" Windows 7 and above: "\Users\UserName\AppData\Local\Source Insight\4.0\si4update.dat"这个文件解密后有个BlackList列表,后来我的序列号被加入到这个黑名单中。需要Patch一下,两个地方: 1) 0050E393 85C0 TEST EAX, EAX ==> 0050E393 31C0 XOR EAX, EAX 2) 0050E645 85C0 TEST EAX, EAX ==> 0050E645 31C0 XOR EAX, EAX 三.程序硬编码黑名单检查 后来有同学发现(不记得是谁了,请参阅前面的回复,感谢他们),黑名单还硬编码到程序中进行比对。 这个检查是随机的,以6秒的间隔、10%的概率运行一次。也需要Patch: 0050DF68 76 69 JBE SHORT 0050DFD3 ==> 0050DF68 EB 69 JMP SHORT 0050DFD3
四.在线检查
再后来,它又加入了在线检查。 程序以10分钟的间隔进行连网检查,不过在检查之前它用wininet.InternetGetConnectedState确定是否有网络连接存在。 让它认为网络不可用就行了: 0050F1BB 85C0 TEST EAX, EAX ==> 0050F1BB 31C0 XOR EAX, EAX 除了替换公钥,代码只需要改动4个字节,比较简单。感兴趣的可以对比着自己修改。 |
|
|
|
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值