啊青 发表于 2007-12-27 10:00:51

[破文]MyPTC 破解+内存补丁

引言:前几天网友叫我破这个软件,之前也碰过这个,不过都浅尝辄止,那天刚好是把SuperClick1.57破了,很有股冲劲,想把这个搞定,于是苦战两天终于告捷!破解后精力几乎耗尽,不过有幸见识软件狡猾的伎俩,收获还是颇多。本来网友叫我做补丁来卖钱,我也考虑了一阵子,最终我不想沦为破解界的垃圾(破了软件拿来卖钱,还没有这样搞过呢!),凭着网络知识共享的原则,我公布破文。由此引发一系列后果,与我无关!希望软件作者早些升级。
本来不想公布,但是我越保留就说明我所存的东西越少,也就是说明没有进步,所以我要记录在这里,毫无保留!
不过真要写起破文,感觉有点无从下手,一是写破文的经验少,二是对这个软件不知从哪儿说起,还是略略论述然后张贴一些记录吧。

程序启动,解密部分字符,对字符下断点很容易找到解密字符的程序段,不过这还不是主要的,加密的字符如:"MyPTCForm","TMyPTC","MyPTC.ini","正在登录","正在登陆","update.exe","登陆成功"……主要防止很轻易的找到重要字符下断点。

登录发送的数据好像是:用户ID,程序名+版本号,以及一些特别的数字。

程序启动的时候读取了8个地址,不知道干什么,原本以为是发送给服务器的,但是后拉发现并没有多大作用。算是程序比较多余的一处,代码如下:
005BBD0C   .A1 08A55C00            mov eax,dword ptr ds:
005BBD11   .8B80 74040000            mov eax,dword ptr ds:
005BBD17   .33D2                     xor edx,edx
005BBD19   .E8 82EBFBFF            call dumped_.0057A8A0
005BBD1E   .85C0                     test eax,eax
005BBD20   .7E 48                  jle short dumped_.005BBD6A
005BBD22   .8D8D 4CFFFFFF            lea ecx,dword ptr ss:
005BBD28   .A1 08A55C00            mov eax,dword ptr ds:
005BBD2D   .8B80 74040000            mov eax,dword ptr ds:
005BBD33   .BA E8CA5B00            mov edx,dumped_.005BCAE8                ;ASCII "website"
后面7个都是带"website"的。

登录成功后才开始读取8个网址,并显示在列表中,代码片段:
005BAD38|.8B45 FC             mov eax,
005BAD3B|.8B80 74040000       mov eax,dword ptr ds:
005BAD41|.33D2                xor edx,edx
005BAD43|.E8 58FBFBFF         call dumped_1.0057A8A0
005BAD48|.85C0                test eax,eax
005BAD4A|.7E 35               jle short dumped_1.005BAD81
005BAD4C|.8D4D F4             lea ecx,
005BAD4F|.8B45 FC             mov eax,
005BAD52|.8B80 74040000       mov eax,dword ptr ds:
005BAD58|.BA 8CB45B00         mov edx,dumped_1.005BB48C            ;ASCII "sitetype"
005BAD5D|.E8 86F5FBFF         call dumped_1.0057A2E8
005BAD62|.33D2                xor edx,edx
005BAD64|.8B45 F4             mov eax,
005BAD67|.E8 ECEDE4FF         call dumped_1.00409B58
005BAD6C|.8B55 FC             mov edx,
005BAD6F|.FF8482 78040000   inc dword ptr ds:
005BAD76|.55                  push ebp
005BAD77|.8BD0                mov edx,eax
005BAD79|.33C0                xor eax,eax
005BAD7B|.E8 40F7FFFF         call dumped_1.005BA4C0               ;加载网址!
005BAD80|.59                  pop ecx                              ;0012FDE8
后面有7个都是带"sitetype"字符的程序段,很明显是读取8个网址。这段程序的功能完全可以模拟,后面破解的时候就是patch了的。

登录成功后,根据服务器返回的一些数据运算得出8个网址的加密网址,以及间隔符。举例如下:
01187E7C"104116116112058047047119119119046097045099108105099107115104097114105110103045116101097109046099111109036104116116112058047047119119119046098101108103105117109109111110101121046105110102111036104116116112058047047119119119046098105108108"...//加密的网址
01187E780121A904ASCII "050036042048038094051057050033055" //分隔符,用于后面判断网址是否在前8个当中的时候用。加密的代码好像在程序中就有,而且加密不是很难,每3个数字对应一个字符如"104116116112"就是http            (crack essay by lynn on lynn百度空间)

这段加密数字用于判断前面读取的8个网址是否在前面8个中。有一段判断的代码片段:
005AC8BF    E8 CC4BF4FF         call crack_pr.004F1490             ; 取8个网址,每个网址加间隔符间隔
005AC8C4    8D55 F0               lea edx,dword ptr ss:
005AC8C7    8BC7                  mov eax,edi
005AC8C9    E8 EEFAFFFF         call crack_pr.005AC3BC
005AC8CE    8D45 E8               lea eax,dword ptr ss:
005AC8D1    50                  push eax
005AC8D2    B9 01000000         mov ecx,1
005AC8D7    BA 01000000         mov edx,1
005AC8DC    8B45 F0               mov eax,dword ptr ss:
005AC8DF    E8 F485E5FF         call crack_pr.00404ED8
005AC8E4    8B45 E8               mov eax,dword ptr ss:
005AC8E7    E8 30D2E5FF         call crack_pr.00409B1C
005AC8EC    8BF0                  mov esi,eax
005AC8EE    8D45 EC               lea eax,dword ptr ss:
005AC8F1    8B55 F0               mov edx,dword ptr ss:
005AC8F4    8A1432                mov dl,byte ptr ds:
005AC8F7    E8 A482E5FF         call crack_pr.00404BA0
005AC8FC    8D45 E0               lea eax,dword ptr ss:
005AC8FF    8B4D EC               mov ecx,dword ptr ss:
005AC902    8B55 F8               mov edx,dword ptr ss:
005AC905    E8 BA83E5FF         call crack_pr.00404CC4             ; 网址后加间隔符,看是不是在8个网址中!
005AC90A    8B55 E0               mov edx,dword ptr ss:   ;edx为当前网址
005AC90D    8D4D E4               lea ecx,dword ptr ss:
005AC910    8B45 F4               mov eax,dword ptr ss:   ;eax为8网址
005AC913    E8 604AF4FF         call crack_pr.004F1378             ; 判断是不是在8个网址中
005AC918    8B55 E4               mov edx,dword ptr ss:      
005AC91B    8D45 F8               lea eax,dword ptr ss:
005AC91E    E8 2D81E5FF         call crack_pr.00404A50
005AC923    B9 01000000         mov ecx,1
005AC928    8B55 F8               mov edx,dword ptr ss:
005AC92B    8B45 EC               mov eax,dword ptr ss:
005AC92E    E8 7149F4FF         call crack_pr.004F12A4
005AC933    8BF0                  mov esi,eax
005AC935    8D87 08010000         lea eax,dword ptr ds:   
005AC93B    50                  push eax                           
005AC93C    8BCE                  mov ecx,esi                        
005AC93E    49                  dec ecx
005AC93F    BA 01000000         mov edx,1
005AC944    8B45 F8               mov eax,dword ptr ss:
005AC947    E8 8C85E5FF         call crack_pr.00404ED8
005AC94C    8B87 08010000         mov eax,dword ptr ds:   ;
005AC952    E8 2183E5FF         call crack_pr.00404C78
005AC957    83F8 0A               cmp eax,0A
005AC95A    7D 1B               jge short crack_pr.005AC977      ; 前8个跳过这个!
005AC95C    8D55 DC               lea edx,dword ptr ss:
005AC95F    B8 34CB5A00         mov eax,crack_pr.005ACB34          ; ASCII "O*?@OvOv?,O9On?@OY?f?r?vOvO@OvOv?9??OvOv?9?*?@O.?.O@O,OvO.O,O.O#OvO.?.O@On?@?#[email protected]#?MO#O.O#OA"
005AC964    E8 FB6BF4FF         call crack_pr.004F3564             ; 解密上面这个字符串为http://www.clixncash.com
005AC969    8B55 DC               mov edx,dword ptr ss:
挺有意思的就是前面如果我们patch了加载8个网址的地方(含"sitetype"那段),那么列表将显示所有网址,但是当你点击前8个以后的"GO"的时候,这段代码就起作用了,他偷偷将点击那栏的网址改为"http://www.clixncash.com"作为打开网页的数据,比如:(crackessay by lynn on lynn百度空间)
01248D2C01248BDCASCII "http://www.clixncash.com"//这里偷偷修改了
01248D3001248BACASCII "jemmy8288"
01248D3401248BC4ASCII "123456987"
01248D3801248B90ASCII "jamminclicks"
01248D3C01250148ASCII "Logined"

好了,主要的两段代码已经分析了,其余的就是根据你点击的列表行数,如果超过8就错误,有下面这些段:
005ACDAD    83B8 00010000 08      cmp dword ptr ds:,8      ; 就是这个看你点击的行数是否超过8
005ACDB4    7E 1D               jle short dumped_.005ACDD3
005ACDB6    8B45 FC               mov eax,dword ptr ss:
005ACDB9    8B90 B0000000         mov edx,dword ptr ds:
005ACDBF    8B45 FC               mov eax,dword ptr ss:
005ACDC2    8B80 F8000000         mov eax,dword ptr ds:
005ACDC8    8B80 2C010000         mov eax,dword ptr ds:
005ACDCE    E8 A532FCFF         call dumped_.00570078
005ACDD3    8B45 FC               mov eax,dword ptr ss:
005ACDD6    83B8 00010000 08      cmp dword ptr ds:,8    ;这里!
005ACDDD    7E 29               jle short dumped_.005ACE08
005ACDDF    8B45 FC               mov eax,dword ptr ss:
005ACDE2    8B80 B4000000         mov eax,dword ptr ds:
005ACDE8    BA 50000000         mov edx,50
005ACDED    E8 66CDE5FF         call dumped_.00409B58
005ACDF2    8BD0                  mov edx,eax
005ACDF4    8B45 FC               mov eax,dword ptr ss:
005ACDF7    8B80 F8000000         mov eax,dword ptr ds:
005ACDFD    8B80 2C010000         mov eax,dword ptr ds:
005ACE03    E8 5032FCFF         call dumped_.00570058
005ACE08    8B45 FC               mov eax,dword ptr ss:
005ACE0B    83B8 00010000 08      cmp dword ptr ds:,8    ;这里!
005ACE12    7E 20               jle short dumped_.005ACE34
005ACE14    8B45 FC               mov eax,dword ptr ss:
005ACE17    8B80 F8000000         mov eax,dword ptr ds:
005ACE1D    8B80 2C010000         mov eax,dword ptr ds:
005ACE23    83C0 14               add eax,14
005ACE26    8B55 FC               mov edx,dword ptr ss:
005ACE29    8B92 B8000000         mov edx,dword ptr ds:
005ACE2F    E8 D87BE5FF         call dumped_.00404A0C
005ACE34    8B45 FC               mov eax,dword ptr ss:
005ACE37    83B8 00010000 08      cmp dword ptr ds:,8    ;这里!
005ACE3E    7E 20               jle short dumped_.005ACE60
005ACE40    8B45 FC               mov eax,dword ptr ss:
005ACE43    8B80 F8000000         mov eax,dword ptr ds:
005ACE49    8B80 2C010000         mov eax,dword ptr ds:
005ACE4F    83C0 08               add eax,8
005ACE52    8B55 FC               mov edx,dword ptr ss:
005ACE55    8B92 BC000000         mov edx,dword ptr ds:
005ACE5B    E8 AC7BE5FF         call dumped_.00404A0C

那个"X/8"显示代码(其实不修改也没问题): (crack essay by lynn on lynn 百度空间)
005BB17F|.83B8 60040000 08    cmp dword ptr ds:,8
005BB186      7C 0D               jl short dumped_.005BB195
005BB188|.8B45 FC             mov eax,
005BB18B|.C780 60040000 08000>mov dword ptr ds:,8
005BB195|>8D55 9C             lea edx,

另外还有两处破解可以达到多开:
005C1FE6|.3D B7000000         cmp eax,0B7
005C1FEB|.0F84 92000000       je dumped_.005C2083
005C1FF1|.A1 0C6E5C00         mov eax,dword ptr ds:
005C1FF6|.8B00                mov eax,dword ptr ds:
以及:
005AB8EB    E8 D0BFE5FF         call <jmp.&user32.FindWindowA>
005AB8F0    85C0                  test eax,eax
005AB8F2    75 0D               jnz short dumped_.005AB901
005AB8F4    8D45 FC               lea eax,dword ptr ss:
005AB8F7    8B55 F8               mov edx,dword ptr ss:

另外还有几处,是别人不知怎么得出的——那个人破了软件拿来卖钱,我不想说什么。代码如下:
005B3934    8B55 D8               mov edx,dword ptr ss:
005B3937    8D4D DC               lea ecx,dword ptr ss:
005B393A    8B45 E8               mov eax,dword ptr ss:

005B6925    8B55 E8               mov edx,dword ptr ss:
005B6928    8D4D EC               lea ecx,dword ptr ss:
005B692B    8B45 F8               mov eax,dword ptr ss:

005B83A5|.8B55 E8             mov edx,
005B83A8|.8D4D EC             lea ecx,
005B83AB|.8B45 F8             mov eax,

005B9905|.8B55 E8             mov edx,
005B9908|.8D4D EC             lea ecx,
005B990B|.8B45 F8             mov eax,
其实不修改这些代码也都破解成功了,我觉得有点多余,后面还是一并修改了。
(crack essay by lynn on lynn's百度空间)

另外也修改了"体验版"字符为正式版,但请用我给的版本才能生效。

好了,以上代码都是原始代码,下面开始patch!
——到这里你可能是还不知道我在说什么,呵呵,可能是这样的,如果你没有跟过程序的话:)

就简单张贴我的内存补丁编写记录吧:
patch1:
005BAD41
0x8B ,0x15 ,0xEF ,0x4B ,0x66 ,0x00 ,0xE8 ,0x54 ,0xFB ,0xFB ,0xFF ,0x85 ,0xC0 ,0x7E ,0x41 ,0x8D ,0x4D ,0xF4 ,0x8B ,0x45 ,0xFC ,0x8B ,0x80 ,0x74 ,0x04 ,0x00 ,0x00 ,0xBA ,0x8C ,0xB4 ,0x5B ,0x00 ,0xE8 ,0x82 ,0xF5 ,0xFB ,0xFF ,0x33 ,0xD2 ,0x8B ,0x45 ,0xF4 ,0xE8 ,0xE8 ,0xED ,0xE4 ,0xFF ,0x8B ,0x55 ,0xFC ,0xFF ,0x84 ,0x82 ,0x78 ,0x04 ,0x00 ,0x00 ,0x55 ,0x8B ,0xD0 ,0xA1 ,0xEF ,0x4B ,0x66 ,0x00 ,0x40 ,0xA3 ,0xEF ,0x4B ,0x66 ,0x00 ,0x48 ,0xE8 ,0x32 ,0xF7 ,0xFF ,0xFF ,0x59 ,0xEB ,0xA7 ,0xE9 ,0x14 ,0x02 ,0x00 ,0x00
005BAD95
共85个

patch2://多开爆破点1
005C1FEB
0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6个

patch3://判断网址是否在8个中
005AC912
0xE0
1个

patch4://此处为我的补丁区别于那个人的不同处
005ACDB4,005ACDDD,005ACE12,005ACE3E
0xEB

patch5://"0/8"的8的修改
005BB186
0xEB//可以共用patch4的!

patch6://多开爆破点2
005AB8F2
0x90,0x90

patch7://类似patch3
005B692D,005B990D,005B83AD
0xE8

patch8://类似7
005B393C
0xD8

那个补丁最后一处:575920,我没改,那个好像有问题,另外它有三处跟我不同。那个地方也正是他破解代理没有修改的地方,不过估计我的patch4修正了他的问题,所以我的补丁可能是全能的!

patch9://资源修改,dephi资源的字符居然是unicode的!
00633984
0x63, 0x6B, 0x0F, 0x5F
4个字节(正式)

另赋SDK补丁源码——是不是做得太绝了了,呵呵!没关系,我说了要毫无保留的!这样才达到交流学习的目的。

#include <windows.h>

void MessBox(char* mess)
{   
const char *caption = "信息提示";
MessageBox(NULL, mess, caption, MB_OK|MB_ICONERROR);
return;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR   lpCmdLine,
                     int       nCmdShow)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

//修改字节
BYTE patch1[] = { 0x8B ,0x15 ,0xEF ,0x4B ,0x66 ,0x00 ,0xE8 ,0x54 ,0xFB ,0xFB ,0xFF ,0x85 ,0xC0 ,0x7E ,0x41 ,0x8D ,0x4D ,0xF4 ,0x8B ,0x45 ,0xFC ,0x8B ,0x80 ,0x74 ,0x04 ,0x00 ,0x00 ,0xBA ,0x8C ,0xB4 ,0x5B ,0x00 ,0xE8 ,0x82 ,0xF5 ,0xFB ,0xFF ,0x33 ,0xD2 ,0x8B ,0x45 ,0xF4 ,0xE8 ,0xE8 ,0xED ,0xE4 ,0xFF ,0x8B ,0x55 ,0xFC ,0xFF ,0x84 ,0x82 ,0x78 ,0x04 ,0x00 ,0x00 ,0x55 ,0x8B ,0xD0 ,0xA1 ,0xEF ,0x4B ,0x66 ,0x00 ,0x40 ,0xA3 ,0xEF ,0x4B ,0x66 ,0x00 ,0x48 ,0xE8 ,0x32 ,0xF7 ,0xFF ,0xFF ,0x59 ,0xEB ,0xA7 ,0xE9 ,0x14 ,0x02 ,0x00 ,0x00};
BYTE patch2[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90};
BYTE patch3[] = { 0xE0 };
BYTE patch4[] = { 0xEB };
BYTE patch5[] = { 0x90,0x90 };
BYTE patch6[] = { 0xE8 };
BYTE patch7[] = { 0xD8 };
BYTE patch8[] = { 0x63, 0x6B, 0x0F, 0x5F };

DWORD Buffer; //判断解压完毕
const char *fname = "MyPTC.exe";   
char *err1 = "不能创建进程!";   
char *err2 = "不能读取进程内存!";   
char *err3 = "字节不符!";   
char *err4 = "不能写入内存!";
    char *msOK = "补丁成功!";
   
ZeroMemory(&si, sizeof(si));   
si.cb=sizeof(si);


if ( CreateProcess(fname,NULL,NULL,NULL,FALSE,/*CREATE_SUSPENDED*/NORMAL_PRIORITY_CLASS, NULL,NULL, &si, &pi) )
{   
ResumeThread(pi.hThread);
while(ReadProcessMemory(pi.hProcess,(LPCVOID)0x005C1FF6, &Buffer,4,NULL))//特别注意第二个参数!
   //DWORD dwUnpack = 0x005C1FF6;然后&dwUnpack是错误的!郁闷半天!参看别人代码很好!
   //WriteProcessMemory的第二个参数也是如此!
{   
   if(Buffer == 0xD7E8008B)
    goto unpack;
   else
    continue;
}
MessBox(err2);
return 0;
unpack:
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005BAD41,&patch1,85,NULL))//path1,破解Grid显示
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005C1FEB,&patch2, 6,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005AC912,&patch3, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005ACDB4,&patch4, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005ACDDD,&patch4, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005ACE12,&patch4, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005ACE3E,&patch4, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005BB186,&patch4, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005AB8F2,&patch5, 2,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005B692D,&patch6, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005B990D,&patch6, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005B83AD,&patch6, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x005B393C,&patch7, 1,NULL))
   MessBox(err4);
if(!WriteProcessMemory(pi.hProcess,(LPVOID)0x00633984,&patch8, 4,NULL))
   MessBox(err4);
   
CloseHandle   (pi.hProcess);   
CloseHandle   (pi.hThread);   
}   
else   
MessBox(err1);

return 0;
}

现成补丁请到我的论坛下载:
lynn.lunqun.com

lgjxj 发表于 2007-12-27 12:32:40

很不错,精神和行动上支持你,还有不知道这 PTC 是什么软件,没用过 (菜鸟啊)

[ 本帖最后由 lgjxj 于 2007-12-27 12:34 编辑 ]

啊青 发表于 2007-12-27 18:23:34

算不上是作弊软件··嗯··PTC广告自动点击软件!

xiaoqiang527 发表于 2007-12-28 12:31:19

是不是登录网络帐号的程序都会有一些标志性的东西。

例如:从服务器端返回一些数据的。

    比如:注册的帐号有些级别区别。

          分为付费用户和免费的。免费的自然有些限制。


          汇编语言有没有这方面的代码呢。

          不好意思,应该自己去查资料。

         但,菜鸟么。就在这里问问啦。哈哈

网络断魂 发表于 2007-12-29 20:36:01

学习楼主的PACH技术

cxl0825 发表于 2007-12-31 11:42:56

看不懂。。。。。

爱民 发表于 2008-1-8 15:26:30

.一点都不详细..
中等级别都很难看懂..

mnah 发表于 2008-2-21 23:39:15

请楼主一并发出破解时候使用的软件和补丁好吗?
现在在网上很难找到早一点的软件版本了,另外软件还要自动登录服务器吗?

爱民 发表于 2008-3-1 22:34:08

..这个可以搞起本地验正`就好了。..

hs55555 发表于 2008-3-4 01:12:17

楼主真的是高手啊,我也永远支持你!
页: [1] 2
查看完整版本: [破文]MyPTC 破解+内存补丁