|
IdaOlly Plugin
Great!but slowly. |
|
[注意]邀请码发放公布(01.13~01.22)
问一下,邀请码有什么用处啊? |
|
[求助]这段汇编是啥意思?
好贴,汇编和c对应的代码 |
|
[转帖]idasdk 5.5,5.6
感谢!感谢!真好,想啥来啥。 |
|
[注意]加密与解密新年礼包2010整理中
期待,希望列出目录 |
|
后天就要回家了,近期怕是不能上论坛了,把前些日子写的一个 VC6 汇编向导提供给大家,方便写汇编程序
赞一个!让VC6发挥余热。 |
|
[分享]中秋好礼相送,电子杂志《软件安全》01期
支持!也只有实力雄厚的论坛才有这个水平。 |
|
[分享]自己解决了!AspectC++ Add-In for Microsoft® Visual C++® 的破解过程
vs 2005我估计应该去patch那个CPPAddin80.dll 看名字就知道 |
|
[原创]被资料助你深入c++编译与调试底层
如果是在Windows下,你可以用用UnDName工具 http://www.cppblog.com/jans2002/archive/2009/08/14/93353.html |
|
[分享]IDA 5.5 中文语言文件
谢谢CCDebuger!! |
|
[原创]ProbeBypass攻击技术
呵呵,矛与盾的比试。 |
|
[分享]自己解决了!AspectC++ Add-In for Microsoft® Visual C++® 的破解过程
有了这个licence文件,把它放到 C:\Program Files\pure-systems\AspectC++ Add-In\etc\目录下 一切问题就变得简单了,顺利执行完了0x10017930,一路杀到0x10017730 int __thiscall sub_10017730(int this, int a2) { int v2; // esi@1 signed int v3; // eax@4 int v4; // ST14_4@6 int v5; // eax@20 int v7; // eax@4 int r; // [sp+4Ch] [bp+0h]@1 int v9; // [sp+3Ch] [bp-10h]@1 signed int v10; // [sp+48h] [bp-4h]@3 char v11; // [sp+20h] [bp-2Ch]@4 char v12; // [sp+4h] [bp-48h]@4 int v13; // [sp+8h] [bp-44h]@20 unsigned int v14; // [sp+1Ch] [bp-30h]@20 int v15; // [sp+18h] [bp-34h]@22 v2 = this; v9 = r ^ dword_100242D0; std__basic_string_char_std__char_traits_char__std__allocator_char____operator_(a2, "Invalid licence file found."); if ( *(_BYTE *)(v2 + 5) && !*(_BYTE *)(v2 + 4) ) { sub_10017B20(); v10 = 0; if ( !(unsigned __int8)sub_1001A050() ) { LABEL_23: v10 = -1; sub_1001A060(); return sub_1001A7B0(); } v7 = std__operator_(&v11, v2 + 12, v2 + 40); LOBYTE(v10) = 1; std__operator_(&v12, v7, v2 + 68); LOBYTE(v10) = 3; std__basic_string_char_std__char_traits_char__std__allocator_char_____basic_string_char_std__char_traits_char__std__allocator_char__(&v11); v3 = *(_DWORD *)(v2 + 8); if ( v3 || !*(_DWORD *)(v2 + 96) ) { if ( v3 == 1 && *(_DWORD *)(v2 + 96) && *(_DWORD *)(v2 + 100) && *(_DWORD *)(v2 + 104) && *(_DWORD *)(v2 + 108) ) { std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, "evaluation"); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 96)); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 100)); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 104)); v4 = *(_DWORD *)(v2 + 108); } else { if ( v3 != 2 || !*(_DWORD *)(v2 + 96) || !*(_DWORD *)(v2 + 100) || !*(_DWORD *)(v2 + 104) || !*(_DWORD *)(v2 + 108) ) goto LABEL_20; std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, "user"); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 96)); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 100)); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, *(_DWORD *)(v2 + 104)); v4 = *(_DWORD *)(v2 + 108); } } else { std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, "beta"); v4 = *(_DWORD *)(v2 + 96); } std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v12, v4); LABEL_20: v5 = v13; if ( v14 < 0x10 ) v5 = (int)&v13; *(_BYTE *)(v2 + 4) = [COLOR="Red"]sub_10019E30[/COLOR](v2 + 112, v5, v15, (int)&a2); LOBYTE(v10) = 0; std__basic_string_char_std__char_traits_char__std__allocator_char_____basic_string_char_std__char_traits_char__std__allocator_char__(&v12); goto LABEL_23; } return sub_1001A7B0(); } 由于有了正确格式的licence,前面执行的都很顺利,一直到了sub_10019E30,跟进去一看,一切了然了: bool __thiscall sub_10019E30(int this, int a2, int a3, int a4) { int v5; // esi@1 int v6; // eax@1 int v7; // eax@1 char v8; // [sp+4h] [bp-10h]@1 v5 = this; v6 = EVP_sha1(); EVP_DigestInit(&v8, v6); EVP_DigestUpdate(&v8, a2, a3); v7 = sub_1001A030(); [COLOR="Black"][B] return EVP_VerifyFinal(&v8, v5, *(_DWORD *)(v5 + 4096), v7) == 1;[/B][/COLOR]} 前面一定都是加密验证的,但是函数最后来了一句: EVP_VerifyFinal(&v8, v5, *(_DWORD *)(v5 + 4096), v7) == 1; 嘿嘿,看名字估计就是这个了,看看这个函数的返回值,1表示成功,其他表示失败,那就是只要让此函数永远返回1,就大功告成了,该到汇编代码了: 004066F0 /$ 83EC 10 sub esp, 10 ; 数字签名验证部分 004066F3 |. 56 push esi 004066F4 |. 8BF1 mov esi, ecx 004066F6 |. E8 81270000 call <jmp.&LIBEAY32.#333> 004066FB |. 50 push eax 004066FC |. 8D4424 08 lea eax, dword ptr [esp+8] 00406700 |. 50 push eax 00406701 |. E8 70270000 call <jmp.&LIBEAY32.#268> 00406706 |. 8B4C24 24 mov ecx, dword ptr [esp+24] 0040670A |. 8B5424 20 mov edx, dword ptr [esp+20] 0040670E |. 51 push ecx 0040670F |. 52 push edx 00406710 |. 8D4424 14 lea eax, dword ptr [esp+14] 00406714 |. 50 push eax 00406715 |. E8 56270000 call <jmp.&LIBEAY32.#269> 0040671A |. 8B4C24 34 mov ecx, dword ptr [esp+34] 0040671E |. 83C4 14 add esp, 14 00406721 |. E8 2A100000 call 00407750 00406726 |. 8B8E 00100000 mov ecx, dword ptr [esi+1000] 0040672C |. 50 push eax 0040672D |. 51 push ecx 0040672E |. 8D5424 0C lea edx, dword ptr [esp+C] 00406732 |. 56 push esi 00406733 |. 52 push edx 00406734 |. E8 49270000 call <jmp.&LIBEAY32.#290> 00406739 |. 83C4 10 add esp, 10 0040673C |. 48 dec eax 0040673D |. F7D8 neg eax 0040673F 1BC0 sbb eax, eax 00406741 90 [B][Color="Red"]inc eax[/COLOR][/B] 00406742 5E pop esi 00406743 83C4 10 add esp, 10 00406746 \. C2 0C00 retn 0C 一般来讲,函数返回值都会用EAX,不管三七二十一了,先吧eax做了在说,把上面那个黑体的 inc eax 改成nop(呵呵,nop是大家的最爱,别看机器码是90了,这是我改好的了) 保存到文件。 大功告成哈!! 身为菜鸟,真是无比荣幸,谢谢各位大大阅读,因为是菜鸟,好多地方都不知道,如果能有更好的方法和窍门,还请各位大大不吝赐教。 |
|
[分享]自己解决了!AspectC++ Add-In for Microsoft® Visual C++® 的破解过程
看来各位大大都很忙,帖子发了半天也没人理。只好自己动手,丰衣足食了。 其实,昨天我自己调试的时候也犯了一个错误,就是调试CppAddin.dll很痛苦,浪费不少时间和分散很多的精力,中间老是受到Va_X.dll的干扰,而且msdev.exe在CppAddin没加载时没法直接下断点,必须得在OD中设置一个新模块加载的断点(选项->调试选项->事件->中断于新模块),这样下来,每次调试失败后重启的过程很是漫长,浪费了不少时间,发帖子的求助的时候,我为了大大们给我能方便的解决问题,尽量把非技术问题都试验了一下,以免大大们被这些问题困住了,一怒之下不给我管我了。但是这样一来,也为我自己解决和发现问题加快了速度。 总结一下: 1.解决问题要东方不亮,西方亮,不要将自己精力消耗在远离问题本身的地方 2.坚持就是胜利,哪怕是菜鸟,不懂多少汇编(看代码还得靠伟大、光荣、正确的F5),也能取得成绩 下面写写分析过程: 其实昨天已经找到了关键的过程,那就是0x10017a20,这里面就是分析xml格式的许可文件 这里面有两个调用,sub_10017930()和 sub_10017730() 大概可以看得出来,sub_10017930参与了xml格式的许可数据的解析过程,它调用成功之后,才调用10017730对数据进行验证,要分析许可数据格式,必须研究10017930 char __stdcall sub_10017930(int a1) { int v1; // ebp@1 int v2; // esi@1 int v3; // esi@3 char result; // al@7 int v5; // eax@1 int v6; // eax@2 char v7; // bl@2 char v8; // [sp+Ch] [bp-28h]@2 signed int v9; // [sp+30h] [bp-4h]@2 v1 = a1; v5 = xmlGetProp(a1, "version"); v2 = v5; if ( v5 && (v6 = std__basic_string_char_std__char_traits_char__std__allocator_char____basic_string_char_std__char_traits_char__std__allocator_char__( &v8, L"1"), v9 = 0, v7 = std__operator__(v6, v2), v9 = -1, std__basic_string_char_std__char_traits_char__std__allocator_char_____basic_string_char_std__char_traits_char__std__allocator_char__(&v8), v7) ) { v3 = *(_DWORD *)(v1 + 12); result = (unsigned __int8)sub_10016D60(*(_DWORD *)(v1 + 12)) && (unsigned __int8)sub_10016E70(v3) && (unsigned __int8)sub_10017570(v3) && (unsigned __int8)sub_100172C0(v3); } else { result = 0; } return result; } 在这里面取了xml的一个属性值version,并且还有四个都不能失败的过程: 10016d60 取product 元素 10016e70 取creation 元素 10017570 取type元素 100172c0 取signature元素 为了熟悉libxml,我特意编写了一段典型libxml用法,并分析了其反向工程后的代码, xmlDocPtr doc = NULL; xmlNodePtr cur = NULL; string filename("test.xml"); doc = xmlParseFile(filename.c_str()); cur = xmlDocGetRootElement(doc); if (xmlStrcmp(cur->name, BAD_CAST "licence")) { fprintf(stderr,"document of the wrong type, root node != mail"); xmlFreeDoc(doc); /*return -1; */ } cur = cur->xmlChildrenNode; xmlNodePtr propNodePtr = cur; while(cur != NULL) { //取出节点中的内容 if ((!xmlStrcmp(cur->name, (const xmlChar *)"product"))) { string name; string version; xmlChar* szAttr = xmlGetProp(cur,BAD_CAST "name"); name=(char*)szAttr; szAttr=xmlGetProp(cur,BAD_CAST "version"); version=(const char *)szAttr; cout<<"Name:"<<name<<" Version:"<<version<<endl; xmlFree(szAttr); } cur=cur->next; } xmlFreeDoc(doc); /*return 0;*/ 得出的结论是,凡是属性值的获取,都会调用xmlGetProp,而子元素的获取则是通过直接访问内存结构或者类似c++的函数访问,不会看到函数名称的引用,根据这一结论和具体的调试,大致推出来licence文件的结构如下: <?xml version="1.0" encoding="UTF-8"?> <licence version="1"> <product name="aspect" version="1.0"/> <product name="pointcut" version="1.0" /> <product name="advice" version="1.0" /> <product name="slice" version="1.0" /> <creation date="2009-8-13"/> <type name="user"> <data code="xxxx" name="jans2002" email="jans2002@gmail.com" regnr="ccccc"/> </type> <signature sign="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /> </licence> |
|
[分享]自己解决了!AspectC++ Add-In for Microsoft® Visual C++® 的破解过程
这是0x10017730的过程 void __userpurge sub_10017730(int this<ecx>, int ebp0<ebp>, int a2) { int ST18_4_0; // ST18_4@0 int ST1C_4_0; // ST1C_4@0 int v5; // esi@1 signed int v6; // eax@4 int v7; // ST18_4@6 int v8; // eax@20 int v9; // eax@4 int v10; // ST1C_4@12 int v11; // ST1C_4@18 int r; // [sp+60h] [bp+0h]@1 int v13; // [sp+50h] [bp-10h]@1 signed int v14; // [sp+5Ch] [bp-4h]@3 char v15; // [sp+34h] [bp-2Ch]@4 char v16; // [sp+18h] [bp-48h]@4 int v17; // [sp+1Ch] [bp-44h]@12 unsigned int v18; // [sp+30h] [bp-30h]@20 int v19; // [sp+2Ch] [bp-34h]@22 v5 = this; v13 = r ^ dword_100242D0; std__basic_string_char_std__char_traits_char__std__allocator_char____operator_(a2, "Invalid licence file found."); if ( *(_BYTE *)(v5 + 5) && !*(_BYTE *)(v5 + 4) ) { sub_10017B20((int)&a2, ebp0); v14 = 0; if ( !sub_1001A050((int)&a2) ) { LABEL_23: v14 = -1; sub_1001A060(&a2); goto LABEL_24; } v9 = std__operator_(&v15, v5 + 12, v5 + 40); LOBYTE(v14) = 1; std__operator_(&v16, v9, v5 + 68); LOBYTE(v14) = 3; std__basic_string_char_std__char_traits_char__std__allocator_char_____basic_string_char_std__char_traits_char__std__allocator_char__(&v15); v6 = *(_DWORD *)(v5 + 8); if ( v6 || !*(_DWORD *)(v5 + 96) ) { if ( v6 == 1 && *(_DWORD *)(v5 + 96) && *(_DWORD *)(v5 + 100) && *(_DWORD *)(v5 + 104) && *(_DWORD *)(v5 + 108) ) { std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v16, "evaluation", ST18_4_0); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 96), ST1C_4_0); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 100), v10); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 104), ST1C_4_0); v7 = *(_DWORD *)(v5 + 108); } else { if ( v6 != 2 || !*(_DWORD *)(v5 + 96) || !*(_DWORD *)(v5 + 100) || !*(_DWORD *)(v5 + 104) || !*(_DWORD *)(v5 + 108) ) goto LABEL_20; std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v16, "user", ST18_4_0); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 96), ST1C_4_0); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 100), v11); std__basic_string_char_std__char_traits_char__std__allocator_char____operator__( &v17, *(_DWORD *)(v5 + 104), ST1C_4_0); v7 = *(_DWORD *)(v5 + 108); } } else { std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v16, "beta", ST18_4_0); v7 = *(_DWORD *)(v5 + 96); } std__basic_string_char_std__char_traits_char__std__allocator_char____operator__(&v17, v7, ST1C_4_0); LABEL_20: v8 = v17; if ( v18 < 0x10 ) v8 = (int)&v17; *(_BYTE *)(v5 + 4) = sub_10019E30(v5 + 112, v8, v19, (int)&a2); LOBYTE(v14) = 0; std__basic_string_char_std__char_traits_char__std__allocator_char_____basic_string_char_std__char_traits_char__std__allocator_char__(&v16); goto LABEL_23; } LABEL_24: sub_1001A7B0( r ^ v13, ebp0); } 小弟是初学菜鸟,看了各位大大的很多教程,刚刚能使OD和IDA,分析的水平有限,虽然C语言自我感觉还比较熟悉。但是看上面的算法还是比较吃力,希望各位大大不吝赐教。 这个软件是作为VS2003的一个插件运行的,如果没有许可,好像菜单就是灰色的,菜单灰色不像按钮灰色可以用工具改亮。如果破解的话,思路又该如何?? 如果没有VS2003,不方便调试CPPAddin.dll,也可以调试 C:\Program Files\pure-systems\AspectC++ Add-In\bin目录下,cl.exe 或GenImport.exe。 这里面都有检查许可文件的代码。 谢谢各位大大! |
|
|
操作理由
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 }}
勋章
兑换勋章
证书
证书查询 >
能力值