发表于 2018-5-3 11:41

申请会员ID:DBinary【申请通过】

申请会员ID:DBinary
个人邮箱:MatrixCascade@gmail.com
原创技术文章:
   数字信号处理方向:
   从三角函数到离散傅里叶变换到语音识别再到图像频域鲁棒性水印,首发于i春秋,原贴地址https://bbs.ichunqiu.com/thread-23801-1-1.html,原贴底部邮箱及水印可证明是本人原创首发
   在知乎也有相应转载:https://www.zhihu.com/question/50735753/answer/278510105
   其内容主要原理是,通过二维傅里叶变换,计算图像的频域信息,因为在频域中能量大多集中在低频部分,可以将水印信息作为加权放大值附加在图像的频域,通过二维傅里叶逆变换得到签名后的图像.范例如下所示
   这个是吾爱破解logo的原图

这个是已经加了频域隐水印的签名图像(左图在视觉上看得出有轻微区别,右图是附加在该签名图像上的频域水印,水印加权轮廓集中在高频)

然后对该签名后图像进行破坏,比如这样

或者这样

或者更狠点这样

只要不基本把图都抹了.经受考验,木有问题
签名软件及代码如下,所有原贴及转载上传软件都为同一版本,点击about可知该程序所有源代码都为本人原创,没有抄袭

C++,编译环境VS2010,UI Framework Qt4.8.6


单片机方向:
裸机实现云音乐播放器 首发于https://bbs.ichunqiu.com/thread-31506-1-1.html
https://bbs.ichunqiu.com/data/attachment/forum/201712/29/094547lib9d61dc6ig1ff1.jpg.thumb.jpg
包括VS1053 W5500模块驱动开发,STM32F407CTB6的调度程序设计
音乐播放资源存储在远程服务器上,该片上系统从远程读取数据到片上缓存实现播放功能
主要解决的难点是:STM32F407的缓存只有192kb除去程序执行栈与需要的部分堆空间仅能使用100KB的缓存,而远端服务器通讯延迟大约在40~150毫秒左右,为解决该问题使用了环形缓存及UDP包的方式优化带宽环境,以下为文中部分摘录的内容
何时重发数据      既然是UDP,那么我们就不得不考虑数据包丢失问题,如果是发的速度过快,不仅会加重服务器的负担,甚至可能导致网络拥堵,如果重发的时间太久,就可能导致音频数据达不到正常播放的要求.我们通过数据手册可以知道,VS1053b拥有512字节的数据RAM,我们假设现在播放的是最苛刻的”无损音乐”格式,其采样率为44100HZ,每个数据大小为16位,双声道,这也就是说其每秒播放176400字节的数据,那么,其能保证大约3ms的播放时长,当然假如是mp3或者ogg这种格式,其将会延迟更长.也就是说,在最极端的情况下3毫秒内我们没有向VS1053b里写数据,音乐播放就会马上变成哑巴了,幸运的是,除非数据量实在密度太大,即便是UDP,平常也不容易造成丢包,同时如果我们将环形缓存的数据都算上(100kb并假设当中都有数据),那么我们就能争取到600毫秒左右的延迟并保证在环形缓存用完前不出”岔子”,因此折中而言,我们可以将丢包重发时间定在100-200毫秒左右时间.
空间换时间   这里所说的空间换时间并不是<<数据结构>>课程里使用表查询之类的手段优化计算时间,这里的空间换时间指的是使用片上有限的资源去尽量减少网络延迟对音频系统造成的影响.在之前的实现中,我们每次只发送一个请求,实际上在环形缓存还有空间的时候我们一次可以发送多个请求,这有点像”并行”传输,就像一条上海到广州的公路,数据交互就像一辆车过去然后载了货物再回来,实际上我们要充分利用带宽,只要公路够宽一次派几辆车过去就可以了,这也就是”为什么我们使用UDP而不使用TCP”的优化,TCP必须保证请求数据包必须到达才会处理下一个请求数据包(为了保证时序性),假如第一个请求数据包多次丢包,那么就导致之后的请求数据包全塞在网络上,时序性的保证反而造成了我们无法充分利用带宽,而UDP就不同了,哪怕丢包严重,只要有一个请求数据包到达了服务端,就能完成一块数据的传输,而其它丢包的数据,等待下次重传就行了.为此,我们需要建立一个请求列队,来记录当前已经向服务器请求了哪些数据,当我们收到对应的数据时,再将队列中对应的记录更新为下一个请求的数据.例如我们建立了一个长度为6的队列,第一次,我们就请求1,2,3,4,5,6块数据,现在我们将请求数据包发送给服务端,这个时候,因为网络原因,4,5,6数据包丢包了或者服务端发回来的数据包丢包了,需要重发,但是1,2,3数据包请求的数据成功回来,那么,队列就被更新为7,8,9,4,5,6,然后重复上述过程,直到所有数据包传输完成.请求列队长度和请求延迟    请求列队很好解决了延迟的问题,但请求列队的延迟也是一个应该被考虑的问题,如果将请求列队的请求数据包一股脑全部发送到服务端,那么就很有可能因为缓存区的限制或者服务端根本来不及处理这些请求更甚者在数据包回传时,因为W5500只有2K的收缓存,而导致大量的丢包,这样不仅仅不能够解决延迟问题,反而导致大量的带宽被白白浪费掉,那么,发送完第一个请求后延迟一段时间再发下一个请求显然是个好主意,那么这段时间应该如何确定呢,回到我们之前在”何时重发数据”里的计算公式,我们知道,如果我们想要播放一段无损数据,那么,我们应该在3ms内向VS1053中写入512字节的数据,这么计算的话,假如我们的一个数据帧包含1kb的数据,假如不使用请求列队,其能允许的延迟应该在6ms以内,但是在公网远端环境中,6ms的延迟显然不是那么容易达到的,因此我们建立了请求列队.按照带宽来算,0.5k能播放大约3毫秒,那么1秒针大约需要160kb的数据,假设请求列队的长度是8,那么,理论上一次来回我们就能传输8kb的数据,假设延迟是客户端到服务端的延迟是50毫秒,那么假设带宽足够的前提下,一秒钟理论上我们能够传输160kb的数据,因为每次请求对应1kb的数据,所以,每次发送请求的间隔应该在6毫秒左右.当然,假如我们把请求列队拓展到16的长度,那么这个间隔就能达到12毫秒.实际上即使是无损格式例如FLAC APE ACC,都有进行数据压缩,实际上上面讨论的是WAV这种几乎没有压缩的情况,因此,实际实现起来我们的条件还宽裕的多,在本章编写的程序中,笔者取列队长度为16,延迟为12毫秒,使用的外网服务器的延迟在42ms左右,在这种环境下播放器工作良好,没有出现卡顿现象.
逆向分析方向.PeDoll行为分析程序这款软件当初制作的目的也就是做来玩玩,具体原理应该没什么干货,主要使用inline hook的方式监视希望监视的API调用(inline hook以DLL注入的方式完成,主要包括了remotethread,导入表修改,直接篡改EP代码,输入法注入等方式)支持直接hook某些二进制代码段(通过脚本完成堆栈平衡等操作)
一个自制的脚本解析机控制着信息的过滤规则(因为自己太懒了所以一直没写user manual所以到现在应该还是只有自己才会写的脚本语言),

通过自旋锁+Event的方式来实现软件断点

通过Hook Send Send to函数可以实现网络抓包
http://img.mp.itc.cn/upload/20161222/a3ded4768dd74392bb03b8c5534fc8ec_th.jpg

在论坛和知乎发布过一系列娱乐贴,主要内容应该是找些中二病脚本小子寻开心.因为内容都比较长,只能贴上一些链接上来了.
https://bbs.ichunqiu.com/thread-28884-1-1.html
https://www.zhihu.com/question/50200915/answer/262555108
https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=16848
....
所有PeDoll版本About部分及启动logo留的都是本人的邮箱及ID,可以证明该程序为本人所写并非抄袭,PeDoll原来一直说开源但一直没发布出去,,打算在申请到ID后开源在52,也可以证明该程序为本人所写



虚拟机编译器方向
在14年左右就一直有一种打算编写一个编译型脚本语言,主要原因是Lua和C艹越用越不舒服,人老了也玩不了那些语法糖了,C艹新标准一出来后一堆Lambda表达式Auto关键字之类的糖越看越不舒服
人又笨,又不想学,还不想写,索性放弃了用了七八年的C++,现在改用底层使用C,交互,UI和逻辑功能使用自建脚本语言的方式
目前自制了一门脚本语言名为Story Script,因为本人主要研究方向是游戏引擎和图形学shader方向,因此这个脚本语言主要是为游戏开发服务的,同时
Story Script经过编译后可以在一个叫做Story VM的虚拟机上运行.
Story VM使用C语言编写拥有完全独立于标准库操作系统的实现机制,包括完整的内存管理机制(内存池-有相关说明帖子https://bbs.ichunqiu.com/thread-17708-1-1.html)
完整的数学库方案(表实现的sin cos函数以及独立于标准库的 log pow sqrt ...函数,额外封装了FFT/IFFT/FFT2/PSNR/NC/Haar wavelet/Gabor....常用信号/图像处理函数)
完成的字符串及内存操作函数,VM实现主要包括一个调度器+指令流解释机+调试机Tag(主要是为断点和IDE实现调试信息交互)
Story VM可以在任意支持C语言编译环境的PC 移动端, 片上系统 进行移植(因为它不依赖所以C语言标准库,所以不需要任何修改)
16个通用寄存器,操作的内存以一种叫做"元数据"的方式进行操作(一个寄存器可以表示一个整形值,浮点,或者一个字符串或bin流,有点像JVM)
在编译器方面原本是打算使用LLVM,但是因为轮子强迫症还是自己造了一个(同样独立于C标准库可以在任意提供C语言编译环境的系统上移植)
下面演示的是Story Script 脚本(右)和它经过编译后没有优化的代码(左)

#name "main"

host void print(string str);

set Point
{
int x;
int y;
}

export void test()
{
int x,y;
Point myPoint;
for(y=1;y<=9;y=y+1)
{
    for(x=1;x<=y;x=x+1)
    {
      print(string(x)+"*"+string(y)+"="+string(x*y)+" ");
   }
   print("\n");
}

compare(x) with(1,2,3) print("x is 1 or 2 or 3");

myPoint.x=1;
myPoint.y=2;
}


.GLOBAL 0
.STACK 65536
EXPORT FUNCTION _BOOT:
RET
FUNCTION TEST:
SUB SP,4
;--------FOR (INIT;CONDITION;ADDITION)
;--------Y=1
MOV R2,1
MOV LOCAL,R2
PUSH LOCAL
POP R1
JMP _FOR_1
_FOR_0:
;--------Y=Y+1
MOV R2,1
MOV R1,LOCAL
ADD R1,R2
PUSH R1
POP R2
MOV LOCAL,R2
PUSH LOCAL
POP R1
_FOR_1:
;--------Y<=9
MOV R2,9
MOV R1,LOCAL
SUB R1,R2
LGLEZ R1
PUSH R1
POP R1
JE R1,0,_FOR_2
;--------FOR (INIT;CONDITION;ADDITION)
;--------X=1
MOV R2,1
MOV LOCAL,R2
PUSH LOCAL
POP R1
JMP _FOR_4
_FOR_3:
;--------X=X+1
MOV R2,1
MOV R1,LOCAL
ADD R1,R2
PUSH R1
POP R2
MOV LOCAL,R2
PUSH LOCAL
POP R1
_FOR_4:
;--------X<=Y
MOV R2,LOCAL
MOV R1,LOCAL
SUB R1,R2
LGLEZ R1
PUSH R1
POP R1
JE R1,0,_FOR_5
;--------PRINT(STRING(X)+"*"+STRING(Y)+"="+STRING(X*Y)+" ")
MOV R1,LOCAL
STRFRI R1,R1
PUSH R1
MOV R2,"*"
POP R1
STRCAT R1,R2
PUSH R1
MOV R1,LOCAL
STRFRI R1,R1
PUSH R1
POP R2
POP R1
STRCAT R1,R2
PUSH R1
MOV R2,"="
POP R1
STRCAT R1,R2
PUSH R1
MOV R2,LOCAL
MOV R1,LOCAL
MUL R1,R2
PUSH R1
POP R1
STRFRI R1,R1
PUSH R1
POP R2
POP R1
STRCAT R1,R2
PUSH R1
MOV R2," "
POP R1
STRCAT R1,R2
PUSH R1
POP R1
PUSH R1
CALL $PRINT
PUSH R1
POP R1
JMP _FOR_3
_FOR_5:
;--------PRINT("\n")
MOV R1,"\n"
PUSH R1
CALL $PRINT
PUSH R1
POP R1
JMP _FOR_0
_FOR_2:
;--------COMPARE (ORIGINAL)
;--------X
MOV R1,LOCAL
PUSH R1
;--------WITH (CONDITION)
MOV R3,0
MOV R2,LOCAL
;--------1,2,3
MOV R1,1
MOV R1,2
MOV R1,3
LGE R1,R1,R2
OR R3,R1
JE R3,0,_WITH_7
;--------PRINT("x is 1 or 2 or 3")
MOV R1,"x is 1 or 2 or 3"
PUSH R1
CALL $PRINT
PUSH R1
POP R1
_WITH_7:
_COMPARE_6:
POP R1
;--------MYPOINT.X=1
MOV R2,1
MOV LOCAL,R2
PUSH LOCAL
POP R1
;--------MYPOINT.Y=2
MOV R2,2
MOV LOCAL,R2
PUSH LOCAL
POP R1
POPN 4
RET

经过汇编器后,上面的代码最终会编译为bin由Story VM进行执行.主要内容是输出一个99乘法表

美术方面
不想当美工的程序猿不是好作家,认识下本人原创的人设leo



Hmily 发表于 2018-5-3 12:19

I D:DBinary
邮箱:MatrixCascade@gmail.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:写的都有些乱,给予通过,期待以后有更好的分享。

fenghong 发表于 2018-5-3 12:34

欢迎加入

plwt 发表于 2018-5-3 12:50

欢迎大神

haoyaer 发表于 2018-5-3 13:00

欢迎大神

DBinary 发表于 2018-5-3 13:52

新人报到,感谢版主的快速审批

yty 发表于 2018-5-3 16:24

欢迎欢迎!

zzzain46 发表于 2018-5-3 17:03

欢迎欢迎,第一个作品我正在研究

沐星雨 发表于 2018-5-3 19:37

真大神!

kgwei1 发表于 2018-5-5 19:21

看不懂 ,欢迎一下吧
页: [1] 2
查看完整版本: 申请会员ID:DBinary【申请通过】