« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1406294 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]对重要代码的防破解[转载] |
重要代码防破解.rar
开发环境:vc6.0+win2000Professional 工具:UEDIT32,w32Dasm(黄金版)
本例将演示对一个MessageBox的保护,采用了“花指令”、“对代码段动态修改”、“动态生成代码”。通过这种手法可阻拦较大一部分破解者(当然这种方法跟复杂的加密、加壳、反跟踪的软件来说,这对破解高手可能只是小菜一碟!)。如果只是小型软件,那么我们花一点小手段阻拦一部分破解者,那何乐而不为呢?
|
阅读全文(2591) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]1000的阶乘的处理[转载] |
代码:BigDate.rar
上次一位兄弟向我提出了1000的阶乘如何求得。其实这里的难点就在于结果如何保存,以及一个数值如何 与很大的数值相乘。
实现原理:
处理的方法可能有很多种,我下面便是一种平时用笔做乘法的做法。大家先看看这个图:
在程序中我定义一个足够大的unsigned int数组,然后数组中的每一个单元存放0-999,99
|
阅读全文(3015) | 回复(-3) | 编辑 | 精华 | 删除 |
[【技术文档】]4种启动其它程序的方法[转载] |
有时我们的程序需要启动其它程序,可能是为了利用它已有的功能,也可能是为了达到某种需要。那么怎样来启动我们需要的程序呢? 我暂时知道有4种方法: 1、调用API: int system( const char *command ); 你可以传入一命令,启动某个程序。如"ping www.vccode.com", "YourExe"等等 不过这里有几点要值得注意: (1)、他不会立即返回,直到你启动的程序执行完成。 (2)、如果你启动是windows程序,它仍然会启动一个控制台,这就给人感觉太差劲了,但如果本身是控制台的,而且又需要等待它的完成,那这将是比较好的选择。 (3)、它的返回值代表是否执行成功以及程序的退出码。
2、调用API: UINT WinExec( LPCSTR
|
阅读全文(1908) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]内存操作越界略述 |
不知大家遇到过没有,有时候程序莫名其妙地出现众多问题,但经常调试来调试去,都不知原因所在,我曾经就被这类问题害得很惨,大部分都是内存操作越界引起的。现在就我知道的总结如下,我将其分为两类:一类是无明显表现的,只会给程序运行带来其妙的错误(1、2、3),一类调试时有明显表现(4、5)。
1、字符串数组定义长度忘记加+1(结束符)
如: char str[10];
::strcpy(str, "0123456789");
此时将会造成越界,因为strcpy将在str为起始地址的第11个单元写入’0’,这样它将覆盖这个单元的值,对于程序来说,有可能带来灾难性的后果。 但,如果你仅仅作字符串操作,一个一个地存入,此时将不会越界,或者你使用strncpy(str, "0123456789", 10),它也不会越界。不过你得小心,此时将不能使用如:strlen,strcpy等等,它的长度和内容变得完全不确定,如果从str地址起的单元都不为‘’,那么将全看作为它的内容,此时
|
阅读全文(8114) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]对类成员进行特殊操作(3) |
以下在win2000, vc6中编译通过
介于发现在很多地方Thunk技术比较有用,是实现某些要求的最好途径(如:一个类需要设定时钟,在时钟回调函数里又要调用类的众多方法和属性,并且这个类可能出现众多实例)。
在文章1和文章2中其实都作了较详细的解说,但可能解说不当,很难理解,所以在此专做了一个类(CTempBoard),演示这个类以自已的成员函数作回调函数,并且几个实例同时存在。
如果你只是想用这种方法,那你只要保持原码中CTempBoard类的
|
阅读全文(1888) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]对类成员进行特殊操作(2) |
大家在看了文章1后以经对取得虚函数地址有所了解,但用它作回调函数还是有一点问题,因为要使成员函数正确运行,我们必须每次在调用这前传一个this给ecx(对应的成员函数中没有操作类成员除外,原因见(文章1)),作为回调函数,它可不给你这个机会,那怎么实现呢?
下面就是一种实现方法:
我们可以在数据段中开一个数组,在这个数组里存放一些特殊的数据,然后将这个数组的地址作为回调函数的地址,然后这个数组将被作为代码运行。那么这个数组对应的代码又做些什么呢?很简单的:将对象的地址传入ecx, 然后jmp到真正的回调函数。
下面是个例子:
主要部分也就是ThunkInit(ThunkData t, void *This, int VirFucID);
传入一个数组指针,一个对象的指针,一个对应第几个虚函数。然后这个函数将生成对应的可执行代码:将对象的地址传入ecx, 最
|
阅读全文(1954) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]对类成员进行特殊操作(1) |
以下在win2000, vc6中编译通过
大家有没有想到过用一个成员函数做回调函数呢?是不是老是编译通不过呢?那么下面将会给你一个答案。
在大家的印象中,访问类成员及函数,是不是object.XX或object.XX(); 其实在c/c++这种中级语言完全可以不守这个规矩。你其甚至可以存取类中的私有成员。不相信吗?大家看看这个例子:
例1:class CAA
{
public:
CAA() {m_data1=50; m_data2=100;}
~CAA() {};
void print() { ::printf("%d, %dn", m_data1, m_data2); }
private:
int m_data1;
int m_data2;
};
|
阅读全文(2044) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]消息与消息队列 |
About Messages and Message Queues
基于windows的应用程序是事件驱动的。它们不进行明确的函数调用(比如调用C运行库)来获得输入。取而代之的是他们等待操作系统将输入传递给他们。 操作系统传递所有的输入给各种应用程序。每个window有一个函数叫做窗口过程,只要有输入操作系统就调用他们。窗口过程处理输入后,将控制返回给操作系统。详细资料请看窗口过程。
Microsoft? Windows? XP:如果最顶层(top-level)的窗口停止响应几秒钟,系统将认为窗口被挂起。这种情况下,系统将隐藏这个窗口并用一个ghost window在相同z坐标上,相同的大小,相同的可视属性来取代他。以允许用户移动窗口,改变窗口大小,关闭窗口。然而,仅有这些行为是可操作的因为应用程序已挂起。在Debugger模式下,系统不产生ghost窗口。
This section discusses the following topics: · Windows Messages · Message Types
|
阅读全文(2054) | 回复(0) | 编辑 | 精华 | 删除 |
[【技术文档】]利用CRC-32检测程序的完整性 |
CRC-32算法原作者:胡春松
由于原算法是嵌在一个对话框类中,使用不尽方便,所以我将其提出,封装成一个CCrc32类,使用时只需定义一个对象,再调用int GetCRC(LPCTSTR csData, DWORD dwSize);便可得到结果。
或许你对CRC-32不是很了解,也不知有何用处,那看看下面:
以下摘自:http://www.luocong.com/articles/show_article.asp?Article_ID=15 作者:老罗CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。
|
阅读全文(3284) | 回复(1) | 编辑 | 精华 | 删除 |
|