From 4ececfc6d59a0f951de1b3ee16d182071a60b222 Mon Sep 17 00:00:00 2001 From: geoffrey Date: Thu, 24 Jul 2025 17:44:22 +0200 Subject: [PATCH] add chunks dump --- main | Bin 21152 -> 22080 bytes main.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/main b/main index b9567986bd7a5b570fab64f687cdf23f7c34ab2b..b97a4a68cd6c5279b75047780f0156176fa10262 100755 GIT binary patch delta 7487 zcmaJ`4SZD9mB07RykusQFqvc~lZnAh_>d1FA%GB&gb6S(A%H-QLPbMJCdp_>VrGU9 z7dk*>HO6!^UUg$lD^%C2ty^8%E`C8MD$%lC*lk&@{3`lW8eJ@r&jD$(|8w7aX^8#p zo!{JZ&*weo+#}CClowcg6%FkZJNZNTTkK_ye^2)HvVTVQ-PDVf=4{?7@dstURqQkuic`zX;uq%iMd3(mQ_aQ}))I|`SxalE zDN@Ha1~-O-5!M>4u4RqkVDLV+vAVIbxrS9onnPl`TD?$Vlm+ceY>b@{HR8~6wFH9F=xUSQ%hQgQSF+5?6(Y~ z8}Sii$1u8M-`?cI$&aOf8hfOWv4#||znC_NHhvf3sf2qa{s7@=gr`gV(*nlox`4}8 z^i_HL@p}U8p9b1K8(4Y!vQG6XbOW7fLV}V*kQ#J737re}yhX$*DTBd4r#hFwoW$ga zE6|}fK_IZZH)0(;WzX9|mJjO?3J$4oi%s0+$X(>uB`t%e>ZCQ!!b2>#D9(AY1@8AiFpDY{!@VtXdLOEjZLzj zIA7e1kz};>T8PBUeA3-=YCh?&c2@eu+E*Qaj%>6Z5%dj&ixn- z(|er`IVSe$$}NAPiKBV&+H{?TT|*W&jj%v_5f)6kg#z8eJ>N3n8!|ET@0;kOB}MdS zkT^Jz3k&9GmhNq~p1yyA{dWH~u_MD1tCHhH+xEm@bkeY>0`2c&S?`Cr{cw);AAvzF z{O8G8T8p8S&(J45uTAO*bX1<|@FxQ8C*VoJw^qoii@y!=7@WLb{u0u8z4=eD^C_k$ zH1jv;-1I<)rK9qioanb;7sD?g7%d}T$?NwHS7L(&+Rmg0+P5d52cIacH(*f^-EI9q}i~QiuQO>jV!_nZXqAL+y(tv<98a5$n;{i5_St zKRyPFD5QM=UlM;Bv_QLm;E4YuQ39QnCj*^GVSDTZMYaM(qiuWNV6?1b`$_w+{C~0^ z7yvlE$bO&?@N>Xkz|Vjpw*!dd&O2lvGlv41Of$5-oetiu{=R5shyP@IFWJ6do4TI} zzYcUP#{eOcqqD(@Au0VN_QqA{cPxi(El^G5b4k@Cwqi_9%qx%PkyG>hQ8(b}c`KrJ zz(37f6ir6bC_c>9)@yD*WTZhe)(rz~{sgDUWxkM|ENyAOPps|Nn0@!parC;n#GK4o z1-GNTYO6%-cK;b{=E3M#tlwgA`aisaJnw$=W3Z0&Pq`|7m^o2da8(@1%p1E3&k0TQ zC&Pu_C&YgS;=Nad)tRrnd__!g=8xSwB<>q7UNa=V_KIk6&T!O2uK!@dFygu*e&O^g z`x4@WbAfU&A#z;fl|Vw2x$ae#CB)0F8vHDs~l)LQW1+r6#jl299 zINDY?1tKbtcBE*>9Hg%QwF{y*J6C!7g7{;$N7->fT*;oO)Ljr`J^!n`cV49Dc$2*- z5B<~6i`hBec_xgtEX+DjTk9I{@Ly|7ByT#7J@Taqf`2|IgXl%ALJ7cu>n!;l(NCNc zB4_rp7ctfh9EKpgd+%^vfj#d*a)#OSe5~xwWt}C1d5o3aQQm%{tg^iQV%hCw?bj*; zol^%u{?4*Ve?fV%^qbD@OSwT+9`jnV8bY-}7HyKCrXkvNUzn_kP2Mr1E5p_G!MWb? zVedR*Z_}iUu5%07uMO1GWHCb0XG{@<%I{ zv*K!gf%?H$m|9F7GnVfWtH!uDY=;YVBw98q{U4QuX-TGPB{kW?azP@u4}U#4I00~o zzk#?+@_PW^2mkwUVTf;P=Z5~9AQzt(kBrGlI*FnEl6VQjYZ(6bW$`|SxllZs5MN?A z55p@7VH=y1v<|}=SHxrtw_!N(s#rR9ft8;3KE%uS?H&7>b)tS9G;Wt*%0^RCGw^o> zFUV77-YCWt+>@WKYD{{(Q=5kEM$K5@lVWede7;hAQjnLC(1mb%Wh+h+8HJ_!**Y0_ zoo1pN^I!oben#A1IGBH0zd~NpVUm6a)=V+hCALm0wW)dxZ>5MbB`cPTsc?YMEc^uQ zrapphEzrNoNv`aaaRAD3_Z$F|CHV%3n#{>w0JD!s-0~TKc^QqBI<^ZT> z74HX7Reugld6lymGj)3+K$0w-B*&A!0x;7!nYtJ8waDq1vXADO@AwChk}Qv-hn<%s zNX`OF%719cCqw2TVy2tV0VG+-DeF6svv8*+8PHaXF2-G%gg~7H+{CBpl9}~>8uJ@0 z^8sx~K;yZYG-kG`==o^dQy7~yz1v7ua}!So#vDA~LUY-k1H#AXdecd7tVGPV?Szbr z*(gejW^%klthPr<=_ZNTZ2w7e6C{#iOC@BYL{d{~T5A}eEX}2{)SF3Z15e!u_(m=| zG%YgFd$!`RrBRWCNDhgZ;%~-AZHUI|h;oz6RQ#2g{jVfa!&9dMD)IGp8FwwWl8O>v zmL6g}Xkd+Y8C@OE@JVjKE(5GL@J06Dg3cSbn`T$yYwV?jhj>Oz;w!N#u`?hgStx&w zJ1Mxkcv`jY{dd8l#(Um@Je-BEckx>YQQ{40KhnelzmfQQSoscwlPo^;jyN$_^E9V! zYdMJ2c#i|ePqVd}7o3iPHe_ryU%W)(wJeniBroE2O2jv`chNjBN{#pY3P#f2qG1uw z({rO4E#gJL1YL>y(tfS+OUQ&NzCV^$N=_B=6`DeTk{e@u`cOX8<%-VWa!HkVt$i~o z%rx@ZU~eY;7M?-dREe)+8Na6~&dN1+doV`(3_NPQ=SeeTnR3m~N*_(}M`M|D$i&$x zA40+u-w}&BWfTMY0yjA2f`6@}wazvYKW8ITrud$iQ+jYd^LgM{P*(&m{``XNJ!!2w z=8|i4G36oPN_?d&*i_5-CEZwK);qe3R5z%lhjIR_Jj;i%DgJm&i{HlGbj(cgE-a2b z)HItsU0y6N#h&p$(BMMG?ZxGh+GT75YP{!PQE;`m#b`>kIezVc9=MoHft%w42lT*W zkL%v8b5hmhPw40xEfG)Z2O;3}6ZfBWbfp$(w;rg^=_2k^Hk#QS?>!jP67vI@7;}98 zK|OI#>xo;h<+aE5WDKF1<6Y2@x%%Nyu0C?ZBpQWF%@t<+eVHk9{LzC(W)5OPS&eZ! z$$kx@Je2mBQ`3;oM+|w-LwJ06>aY|cnGZVpnYR!pG&M$>)r6Cu`7^0~DRWB43#H~h!#U@(B-^N?4Ozd@XQVeFYOdxw9M!O$iZ_Y~xgL?Oqk?2@pj@F<${vAe zx!RVgZJIS8XCo?dAA_39$DS_ z>`~g8Tc_>+**UZgutPJ)>(%tn#mVCQ*d0tUD@)Z10=v`z0gG3) zR)DX%_Nvxhs>M>LP6nMX)zs9SJ?f}kY8uEz|1a5tNp`6@AE^#95>bom$y~anUUlk* zy=n|IIW3vmJaXP)SY8FuRk+MQS0_wY)i+dbiK@Ob)oK|NRn^U^%~Gmb*QzedS~UwC zYgA2zbXvVyRidVqt1Dz*QbFS>vQJgUW~rVwc%Nxm`=({>V%77Onz~e-p+z!I10DdS zLM2v+%)<}YT<4BO6EkBHKD+w)htT4dlqck z)WYg&t6Hlf!7ULMZfI_ec`%B!FK>gRQJCg!_B-#vlt=>KjReE^ zRXEfHcjOxm!^5xY0ldMqAPhW5>W~}a7t~y@86{gy8)VR7HmNp>M^IH2Dh{&R7z#%; zYhid@-&7rmwgxG~@K{(%?iLG_G2&>+Hl8l3OI@a9b_UR0WL&RtV1}BBSy?fv&B$iL zy*(jbEL}1^eZ=*eBu#kXGX5bLu4!U+My~_&3-}hXYQCE%(7VL<=0Ct67N5*_nLIf2 z4&Oo1?@Je_d=}4+5ytajO@Z-V!OPsdTX@O}6_z2EmX*eObk@jf`J7H4`GEYfP9J$; zcvYv5e16acfu!H0Txa1#Zs_spVkCzbA&wVsU7JyXdE=h6+Q4*I$SXF1_ky zz>#S;Y7}V%!$z@cp_^})eO%-(bbHpof|q5phkb^w249vk2W0;?^<(JWDIJpCBP8o+ zE=8{XmkV#=15!m1#}~P|OZF3FUrfE{4opWzMow2FWj2ZXA+sAY4m^IkMojdW*bDAn za4EE7qcunG)&P5zEL3MmCp~P>2;FtMma%o|U4q)%pr4m%MoO%v48XGzKH5c+uZ8T`xjZ?}lp9@bmob@*!3)9w*utKa#Bf z1tpS}G^+CNCJ|inwVD2F+E*Sp!S{KWdO1HO$|?#S#>=|B*6*00XC7SsDQ+7ejL`#*=o Bj6(nb delta 5777 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 d*NUbXU-BvN^DIzgWBo-= \n", argv[0]); + if (argc < 3){ + usage(argv[0]); return -1; } - if (strcmp(argv[1], "hide") != 0 && strcmp(argv[1], "unhide") != 0){ - printf("ok\n"); - printf("usage: %s \n", argv[0]); + if (strcmp(argv[1], "hide") != 0 && strcmp(argv[1], "unhide") != 0 && strcmp(argv[1], "chunks") != 0){ + usage(argv[0]); return -1; + } + if (strncmp(argv[1], "hide", 4) == 0 && argc < 4){ + usage(argv[0]); + return -1; + } + else if (strncmp(argv[1], "unhide", 6) == 0 && argc < 4){ + usage(argv[0]); + return -1; + } + else if (strncmp(argv[1], "chunks", 6) == 0 && argc == 4){ + dump = atoi(argv[3]); } // https://man7.org/linux/man-pages/man2/open.2.html @@ -73,14 +84,62 @@ int main(int argc, char *argv[], char **envp){ return -1; } - if (strcmp(argv[1], "hide") == 0){ + if (strcmp(argv[1], "hide") == 0) hide_message(fd_r, argv); - } - if (strcmp(argv[1], "unhide") == 0){ + if (strcmp(argv[1], "unhide") == 0) unhide_message(fd_r, argv); - } + if (strcmp(argv[1], "chunks") == 0) + list_chunks(fd_r, argv[2], dump); close(fd_r); } +/* + * This function print the usage of the program + */ +static void usage(const char *program){ + printf("Usage: %s \n", program); +} + +/* + * In this function, we get all chunks and dump a chunk if specified + */ +static void list_chunks(int fd, const char *filename, int dump){ + struct chunk s_chunk; + int c = 1; + int nbChunks = 0; + + // We bypass the signature + lseek(fd, 8, SEEK_SET); + + while(c){ + read(fd, &s_chunk, sizeof(struct chunk)); + off_t off = lseek(fd, 0, SEEK_CUR); + unsigned int s = 0; + convert_from_bytes(s_chunk.length, &s); + if (dump == -1) + printf("chunk %d at 0x%0x type %c%c%c%c, length %x\n", + nbChunks, off, s_chunk.type[0], s_chunk.type[1], s_chunk.type[2], s_chunk.type[3], + s); + + if (nbChunks == dump){ + char *tmp = malloc(s); + read(fd, tmp, s); + printf("%s\n", tmp); + //write(0, tmp, s); // Write to stdout + lseek(fd, off, SEEK_SET); // Go back to the chunk header + free(tmp); + } + + if (s_chunk.type[0] == 'I' && s_chunk.type[1] == 'E' && + s_chunk.type[2] == 'N' && s_chunk.type[3] == 'D') + c = 0; + + /* +4 for the CRC */ + lseek(fd, s + 4, SEEK_CUR); + + nbChunks += 1; + memset(&s_chunk, 0, sizeof(struct chunk)); + } +} /* * In this function, we will hide the text provide in argument of the program to * the destination image